如果一个拥有两个AWS账户,一个用于开发,一个用于实时(例如),我知道一个人可以使用terraform工作区来管理每个环境的状态。
但是,如果我将工作空间从“ dev”切换为“ live”,是否有办法告诉terraform它现在应该将状态应用于真实帐户而不是测试帐户?
我想到的一种容易出错的方法是,每次切换工作区时都交换我的secret.auto.tfvars
文件,因为我猜想使用其他访问密钥(属于“实时”帐户)运行时然后,AWS提供者将向该帐户申请。但是,交换工作空间并提供错误的凭据会很容易,因为凭据会在错误的环境下运行更改。
我正在寻找一种几乎可以将工作空间与AWS中的账户ID关联的方法。
我确实找到了这个https://github.com/hashicorp/terraform/issues/13700,但它指的是已弃用的env
命令,this comment看起来特别有希望
我在GitHub上找到了一些信息,我在其中留下了this comment作为对先前评论的答复,该评论建议考虑使用模块而不是工作空间,并且实际上表明工作空间不太适合此任务。如果任何人都可以提供有关如何使用模块来解决同时维护多个“相同”基础结构版本的问题的信息,我很希望看到它在工作空间概念上有何改进。
答案 0 :(得分:3)
在这里,您可以使用Terraform模块构建指向不同AWS账户的实时与开发环境,但是这些环境都具有/使用相同的Terraform代码。
这是构造目录的一种(多种)方式;您甚至可以将模块放入自己的Git存储库中,但我将尽量避免混淆不清。在此示例中,您有一个简单的应用程序,其中包含1个EC2实例和1个RDS数据库。您可以在modules/*/
子目录中编写所需的任何Terraform代码,并确保参数化各个环境中不同的属性。
然后在dev/
和live/
目录中,main.tf
应该相同,而provider.tf
和terraform.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
周围写一个包装器来做到这一点:
将所有命令传递到真实的terraform
上,除非找到
workspace select
在命令行中。
在命令行中找到workspace select
后,它将解析出
工作区名称。
将AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY导出为 您要链接到工作区的AWS账户
将工作区命令传递给真实的terraform
这将每次加载正确的凭据
terraform workspace select <WORKSPACE>
被使用