如何在单个 AWS 账户中使用 Terraform 创建两个独立的环境(开发和生产)来部署 AWS 资源,以及管理多个数据管道的最佳方法是什么?
关键细节:
我有一个 AWS 账户,想要设置两个不同的环境来使用 Terraform 部署资源。
我使用 Bitbucket 进行版本控制,开发和生产有单独的分支。
部署资源时:
对于开发环境,资源名称应带有
*_dev
后缀
对于 prod 环境,资源名称应带有
*_prod
后缀
我需要构建大约 30 个具有以下特征的数据管道:
来源: API 端点
目标: S3 或 Redshift
问题:
在 Terraform 中构建此设置以在单个 AWS 账户中管理这两个环境的最佳方法是什么?
我应该使用单个存储库来构建所有 30 个数据管道,还是应该为每个管道创建单独的存储库?
这是我当前的想法:
project-root/
├── environments/
│ ├── dev/
│ │ ├── main.tf
│ │ ├── variables.tf
│ │ ├── outputs.tf
│ │ ├── terraform.tfvars
│ │ └── backend.tf
│ └── prod/
│ ├── main.tf
│ ├── variables.tf
│ ├── outputs.tf
│ ├── terraform.tfvars
│ └── backend.tf
├── modules/
│ ├── lambda/
│ │ ├── main.tf
│ │ ├── variables.tf
│ │ └── outputs.tf
│ ├── step_function/
│ │ ├── main.tf
│ │ ├── variables.tf
│ │ └── outputs.tf
│ ├── iam/
│ │ ├── main.tf
│ │ ├── variables.tf
│ │ └── outputs.tf
│ └── eventbridge/
│ ├── main.tf
│ ├── variables.tf
│ └── outputs.tf
├── lambda/
│ ├── lambda1/
│ │ ├── main.py
│ │ └── requirements.txt
│ └── lambda2/
│ ├── main.py
│ └── requirements.txt
├── step_functions/
│ └── sage_log_processing.json
├── bitbucket-pipelines.yml
└── README.md
首先,没有“最好的方法”。除了一些一般规则之外,它还取决于首选的工作方式。
我强烈推荐 Nicki Watt 的演讲:使用 Terraform 发展您的基础设施:https://www.youtube.com/watch?v=wgzgVm7Sqlk
简单总结一下:
关键是每个环境都有相同的代码,仅配置不同。 IE。您的情况中的 后缀。
您当前的结构看起来已经非常类似于这种方法。
environments/*/main.tf
应仅使用具有最少配置的逻辑组件(例如 _dev
后缀)。dev
和
prod
环境分离到隔离的 VPC 中。
最佳实践是拥有独立的 AWS 账户:https://docs.aws.amazon.com/whitepapers/latest/organizing-your-aws-environment/organizing-your-aws-environment.html我可以推荐的另一个演讲:
更多环境,更少代码: