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

时间:2018-08-10 13:00:46

标签: terraform terraform-provider-aws

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

但是,如果我将工作空间从“ dev”切换为“ live”,是否有办法告诉terraform它现在应该将状态应用于真实帐户而不是测试帐户?

我想到的一种容易出错的方法是,每次切换工作区时都交换我的secret.auto.tfvars文件,因为我猜想使用其他访问密钥(属于“实时”帐户)运行时然后,AWS提供者将向该帐户申请。但是,交换工作空间并提供错误的凭据会很容易,因为凭据会在错误的环境下运行更改。

我正在寻找一种几乎可以将工作空间与AWS中的账户ID关联的方法。

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

更新

我在GitHub上找到了一些信息,我在其中留下了this comment作为对先前评论的答复,该评论建议考虑使用模块而不是工作空间,并且实际上表明工作空间不太适合此任务。如果任何人都可以提供有关如何使用模块来解决同时维护多个“相同”基础结构版本的问题的信息,我很希望看到它在工作空间概念上有何改进。

2 个答案:

答案 0 :(得分:3)

在这里,您可以使用Terraform模块构建指向不同AWS账户的实时与开发环境,但是这些环境都具有/使用相同的Terraform代码。

这是构造目录的一种(多种)方式;您甚至可以将模块放入自己的Git存储库中,但我将尽量避免混淆不清。在此示例中,您有一个简单的应用程序,其中包含1个EC2实例和1个RDS数据库。您可以在modules/*/子目录中编写所需的任何Terraform代码,并确保参数化各个环境中不同的属性。

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

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

当您需要计划/应用任何一个环境时,您都可以进入相应的目录并在其中运行TF命令。


相对于为什么使用Terraform Workspaces首选这种方法,TF docs进行了很好的解释:

  

尤其是,组织通常希望在服务于不同开发阶段(例如,阶段与生产)或不同内部团队的同一基础架构的多个部署之间建立强烈的隔离。在这种情况下,用于每个部署的后端通常属于该部署,具有不同的凭据和访问控制。在这种情况下,命名工作区不是合适的隔离机制。

     

相反,使用一个或多个可重复使用的模块表示公共元素,然后将每个实例表示为单独的配置,该配置在不同后端的上下文中实例化那些公共元素。在这种情况下,每个配置的根模块将仅由一个后端配置和少量模块块组成,这些模块块的参数描述了部署之间的细微差别。

BTW>当Terraform认为'env'有点令人困惑时,他们只是将env子命令更改为workspace

希望这会有所帮助!

答案 1 :(得分:0)

Terraform工作空间保存状态信息。它们基于在环境中使用AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY的方式连接到用户帐户。为了链接任何给定的工作区到AWS账户,他们必须以某种方式存储用户凭证, 他们可以理解地 。因此,我不希望看到工作区直接支持它。

但是,要 几乎 将工作空间链接到帐户,您只需在每次切换工作空间时自动自动切换AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY。您可以通过在terraform周围写一个包装器来做到这一点:

  1. 将所有命令传递到真实的terraform上,除非找到 workspace select在命令行中。

  2. 在命令行中找到workspace select后,它将解析出     工作区名称。

  3. 将AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY导出为     您要链接到工作区的AWS账户

  4. 将工作区命令传递给真实的terraform

这将每次加载正确的凭据

terraform workspace select <WORKSPACE>

被使用