Dav*_*vid 6 terraform terraform-provider-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.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
Run Code Online (Sandbox Code Playgroud)
当您需要计划/应用任一环境时,您可以进入适当的目录并在那里运行您的 TF 命令。
至于为什么这比使用 Terraform Workspaces更受欢迎,TF 文档解释得很好:
特别是,组织通常希望在为不同开发阶段(例如,分期与生产)或不同内部团队服务的同一基础架构的多个部署之间创建强隔离。在这种情况下,用于每个部署的后端通常属于该部署,具有不同的凭据和访问控制。命名工作区不是适合这种情况的隔离机制。
相反,使用一个或多个可重用模块来表示公共元素,然后将每个实例表示为单独的配置,在不同后端的上下文中实例化这些公共元素。在这种情况下,每个配置的根模块将只包含一个后端配置和少量模块块,这些模块块的参数描述了部署之间的任何小差异。
BTW> Terraform 只是在他们认为 'env' 有点太混乱时将env
子命令更改为workspace
。
希望这可以帮助!
归档时间: |
|
查看次数: |
2034 次 |
最近记录: |