如何使用 S3 作为后端为不同的基础设施层设置安全的 Terraform 状态存储?

如何使用 S3 作为后端为不同的基础设施层设置安全的 Terraform 状态存储?

语境

在阅读了大量有关 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 上工作的方式。

相关内容