首页 文章

是否可以将terraform工作空间链接到AWS账户

提问于
浏览
3

如果有一个AWS账户,一个用于开发,一个用于实时(例如),我知道可以使用terraform工作区来管理每个环境的状态 .

但是,如果我将工作区从“dev”切换到“live”,有没有办法告诉terraform现在应该将状态应用于真实账户而不是测试账户?

我想到的一种容易出错的方法是每次切换工作区时交换我的 secret.auto.tfvars 文件,因为我假设当使用不同的访问密钥(属于"live"帐户的那个)运行时,AWS提供商将应用于该帐户 . 但是,交换工作空间并且存在错误的凭据非常容易,这些凭据将针对错误的环境运行更改 .

我正在寻找一种几乎将工作区与AWS中的帐户ID链接起来的方法 .

我确实找到了这个https://github.com/hashicorp/terraform/issues/13700但它引用了已弃用的 env 命令,this comment看起来有点特别有希望

更新

我在GitHub上找到了一些关于我离开this comment的信息,作为对之前评论的回复,该评论建议考虑模块而不是工作空间,并且实际上表明工作空间并不热衷于看到这对工作空间概念有何改进 .

2 回答

  • 2

    以下是使用Terraform模块构建指向不同AWS账户的live vs dev环境的方法,但这些环境都具有/使用相同的Terraform代码 .

    这是你可以构建你的目标的一种(多种)方式;你甚至可以将模块放入他们自己的Git仓库,但我会尽量不要混淆太多东西 . 在此示例中,您有一个简单的应用程序,其中包含1个EC2实例和1个RDS数据库 . 您可以在 modules/*/ 子目录中编写所需的Terraform代码,确保参数化不同环境中的不同属性 .

    然后在你的 dev/live/ 目录中, main.tf 应该是相同的,而 provider.tfterraform.tfvars 则反映特定于环境的信息 . main.tf 会调用模块并传入env特定的参数 .

    modules/
    |-- ec2_instance/
    |-- rds_db/
    dev/
    |-- main.tf             # --> uses the 2 modules
    |-- provider.tf         # --> has info about dev AWS account
    |-- terraform.tfvars    # --> has dev-specific values
    live/
    |-- main.tf             # --> uses the 2 modules
    |-- provider.tf         # --> has info about live/prod AWS account
    |-- terraform.tfvars    # --> has prod-specific values
    

    当你需要计划/应用env时,你会进入相应的目录并在那里运行你的TF命令 .


    至于为什么这比使用Terraform工作区更受欢迎,TF docs解释得很好:

    特别是,组织通常希望在服务于不同开发阶段(例如,分段与 生产环境 )或不同内部团队的相同基础架构的多个部署之间 Build 强大的分离 . 在这种情况下,用于每个部署的后端通常属于该部署,具有不同的凭据和访问控制 . 对于此方案,命名工作空间不是合适的隔离机制 . 相反,使用一个或多个可重用模块来表示公共元素,然后将每个实例表示为在不同后端的上下文中实例化那些公共元素的单独配置 . 在这种情况下,每个配置的根模块将仅包含后端配置和少量模块块,其参数描述了部署之间的任何小差异 .

    BTW> Terraform只是将 env 子命令改为 workspace ,当时他们认为'env'有点太混乱了 .

    希望这可以帮助!

  • 0

    Terraform工作空间包含状态信息 . 它们根据在环境中使用AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY的方式连接到用户帐户 . 为了向AWS账户提供任何给定的工作空间,他们必须以某种方式存储用户凭证, which they understandably don't . 因此,我不希望看到工作区直接支持它 .

    但是,要将工作空间链接到帐户,您只需在每次切换工作空间时自动切换AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY . 您可以通过在 terraform 周围编写一个包装器来完成此操作:

    • 将所有命令传递给真实的 terraform ,除非它在命令行中找到 workspace select .

    • 在命令行中找到 workspace select 后,它会解析工作区名称 .

    • 将要_____9984_的AWS账户的AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY导出到工作空间

    • 通过将workspace命令传递给真正的 terraform 完成

    这将每次加载正确的凭据

    terraform workspace select <WORKSPACE>
    

    被使用了

相关问题