语境
在阅读了大量有关 Terraform 的资料并在小型项目中使用它之后,我想开始在真实的生产环境中使用它。
由于环境主要在 AWS 中,我会选择 S3 后端,但我愿意改变这一点。
任务
我希望每个基础设施层都有单独的 Terraform 项目(状态)。显然,顶层应该能够访问较低层的输出。我可以使用Terraform 远程状态数据源来获取该数据。
我在互联网上看到过不同的设置。
设置#1
|–globals
|–modules
|-infrastucture1
| |-layer1
| | |-layer2
设置#1
|–globals
|–modules
|-infrastucture1
| |-layer1
| |-layer2
设置#3
以上所有内容都有其单独的 git repo。
问题
- 对此推荐的代码组织是什么样的?
- 我必须向下层的 S3 存储桶添加哪些访问权限才能保证其状态安全,但仍允许 Terraform 远程状态访问它?
答案1
>What would be the recommended code organisation for this?
首先我要说的是,没有通用规则,这取决于你的需求。但是我建议不要为每个模块使用单独的 git repo,因为这会导致大量重复,并且没有内在价值。
您指定的第二种设置似乎在我工作过的大多数地方都有使用,并且在许多存储库中也很常见。
这是来自 Gruntwork 博客的一个采用类似组织的示例。 https://www.gruntwork.io/infrastructure-as-code-library/v0.17.1/module-ecs
以下是来自 github 上一个相当知名的 repo 的示例 https://github.com/airbnb/streamalert/tree/master/terraform
>What access rights do I have to add to the lower layers' S3 buckets to keep their >state safe, but still allow Terraform remote state to access it?
我不太明白你想在什么意义上保持它们的状态“安全”。但既然你提到了 s3 存储桶的访问权限,我会建议像亚马逊那样实际启用版本控制和 MFA 删除。
以下链接包含亚马逊为实现 S3 存储桶安全的所有最佳实践。 https://docs.aws.amazon.com/AmazonS3/latest/dev/s3-access-control.html
此链接是关于 S3 存储桶权限的指南 https://docs.aws.amazon.com/AmazonS3/latest/dev/example-walkthroughs-managing-access-example1.html
如果您愿意,您还可以为您的后端使用签名的 URL,尽管我认为这不是他们在 Terraform 上工作的方式。