【问题标题】:Terraform remote state s3 bucket creation included in the state file?状态文件中包含的 Terraform 远程状态 s3 存储桶创建?
【发布时间】:2017-01-05 20:57:00
【问题描述】:

我正在寻找在 S3 存储桶中创建和存储状态文件的最佳做法。

  1. 我是否应该将 S3 存储桶的创建与基础架构一起包含在内,还是
  2. 为其 S3 存储桶创建一个单独的状态文件,并为资源创建一个不同的状态文件。

如果它是一个不同的文件,我还需要存储创建的 s3 存储桶的状态文件,那么在这种情况下,我应该创建两个 s3 存储桶,一个用于基础设施状态,另一个用于 s3 存储桶状态文件。

其次,如果设置了远程配置并且执行“terraform destroy”会向我抛出错误,无法上传状态文件:找不到这样的存储桶,因为存储桶已被销毁。我应该先禁用 terraform remote config -disable 然后运行 ​​terraform destroy 吗? 我应该遵循的最佳做法是什么?

【问题讨论】:

    标签: amazon-web-services amazon-s3 terraform


    【解决方案1】:

    我个人使用 Terraform 基础堆栈来有效地引导 AWS 帐户以与 Terraform 一起使用。该堆栈仅在本地存储其状态文件,然后将其提交给版本控制。这个堆栈应该只需要运行一次,所以我认为不使用远程后端没有问题。

    我的 Terraform 基础堆栈创建:

    • Terraform 的 IAM 用户在未来运行
    • s3 存储状态的桶
    • 用于加密/解密状态的 KMS CMK
    • 强制加密的存储桶策略声明
    • Bucket 策略声明,用于防止 Terraform 用户执行除 s3:putObjects3:getObject 之外的任何操作
    • KMS 策略声明,用于防止 Terraform 用户执行除 kms:GenerateDataKey*kms:Decrypt 之外的任何操作
    • 用于状态锁定的 DynamoDB 表。

    这可以扩展到包括角色,特别是如果您的 Terraform 用户将跨多个帐户进行部署。

    【讨论】:

      【解决方案2】:

      如果你想存储将存储状态的事物的状态,你就会遇到先有鸡还是先有蛋的问题。

      在 Terraform 之外创建一个 S3 存储桶很容易,因此我永远不会费心在 Terraform 中为实际状态存储桶执行此操作,然后使用 Terraform 创建绝对其他所有内容。

      轻松创建 S3 存储桶(或远程状态现在涵盖的其他 S3 类型存储选项之一)是使用 S3 来备份您的状态文件的主要好处之一,而不是使用 Consul 来备份您的状态文件在存储任何状态文件之前构建实例集群并对其进行配置。

      【讨论】:

      • 因此,一个 (bash) 脚本使用 AWS CLI 创建 s3 存储桶,然后执行远程状态配置,然后执行 terraform plan/apply/destroy 即可。在这种情况下,虽然 terraform destroy 对资源进行了销毁,但存储桶仍将包含状态文件。
      猜你喜欢
      • 2021-11-20
      • 2019-02-22
      • 2021-12-07
      • 2020-09-29
      • 2019-04-29
      • 2021-12-11
      • 1970-01-01
      • 2021-12-12
      • 2020-09-05
      相关资源
      最近更新 更多