如果有一个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 回答
以下是使用Terraform模块构建指向不同AWS账户的live vs dev环境的方法,但这些环境都具有/使用相同的Terraform代码 .
这是你可以构建你的目标的一种(多种)方式;你甚至可以将模块放入他们自己的Git仓库,但我会尽量不要混淆太多东西 . 在此示例中,您有一个简单的应用程序,其中包含1个EC2实例和1个RDS数据库 . 您可以在
modules/*/
子目录中编写所需的Terraform代码,确保参数化不同环境中的不同属性 .然后在你的
dev/
和live/
目录中,main.tf
应该是相同的,而provider.tf
和terraform.tfvars
则反映特定于环境的信息 .main.tf
会调用模块并传入env特定的参数 .当你需要计划/应用env时,你会进入相应的目录并在那里运行你的TF命令 .
至于为什么这比使用Terraform工作区更受欢迎,TF docs解释得很好:
BTW> Terraform只是将
env
子命令改为workspace
,当时他们认为'env'有点太混乱了 .希望这可以帮助!
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
完成这将每次加载正确的凭据
被使用了