是否可以将地形工作区链接到 AWS 账户



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

但是,如果我将工作区从"开发"切换到"实时",有没有办法告诉 terraform 它现在应该将状态应用于真实帐户而不是测试帐户?

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

我正在寻找一种几乎将工作区与 AWS 中的账户 ID 链接的方法。

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

更新

我在 GitHub 上找到了一些信息,我留下了这条评论作为对之前评论的回复,该评论建议考虑模块而不是工作区,实际上表明工作区不太适合此任务。如果有人能提供有关如何使用模块来解决同时维护"相同"基础架构的多个版本的问题的信息,我很想看看这如何改进工作区概念。

下面介绍了如何使用 Terraform 模块来构建指向不同 AWS 账户的实时与开发环境,但这些环境都具有/使用相同的 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

当您需要计划/应用任一环境时,请放入相应的目录并在那里运行 TF 命令。


至于为什么这比使用Terraform Workspaces更受欢迎,TF文档解释得很好:

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

相反,请使用一个或多个可重用模块来表示公共元素,然后将每个实例表示为单独的配置,该配置在不同后端的上下文中实例化这些公共元素。在这种情况下,每个配置的根模块将仅包含一个后端配置和少量模块块,其参数描述部署之间的任何微小差异。

顺便说一句>Terraform只是将env子命令更改为workspace,因为他们认为"env"有点太混乱了。

希望这有帮助!

地形工作区保存状态信息。 它们根据环境中使用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>

已使用

相关内容

  • 没有找到相关文章

最新更新