状态文件中包含Terraform远程状态s3存储桶创建?

时间:2016-08-29 18:30:08

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

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

  1. 我是否应该创建S3存储桶以及基础结构或
  2. 为其S3存储桶创建单独的状态文件,为资源创建不同的状态文件。
  3. 如果它是一个不同的文件我还需要存储创建的s3存储桶的状态文件,那么在这种情况下我应该创建两个s3存储桶,一个用于基础架构状态,另一个用于s3存储桶状态文件。

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

2 个答案:

答案 0 :(得分:2)

如果你想存储将存储州的物品的状态,你在这里有鸡和蛋的问题。

在Terraform之外创建一个S3存储桶非常简单,所以我永远不会在Terraform中为实际的状态存储桶做这件事,然后使用Terraform创建其他所有东西。

创建S3存储桶(或者现在由远程状态覆盖的其他S3类型存储选项之一)的简便性是使用S3来支持状态文件的主要好处之一,而不是像Consul那样需要你的在存储任何状态文件之前构建实例集并配置它们。

答案 1 :(得分:2)

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

My Terraform基础堆栈创建:

  • Terraform的IAM用户将来运行
  • s3用于存储状态的存储桶
  • 用于加密/解密状态的KMS CMK
  • 用于强制执行加密的存储策略声明
  • 阻止Terraform用户执行除var count = Db.RESOURCE_Resource .Include(i => i.RESOURCE_Value.Where(s => s.ApplicatieID == applicationId)) .Include(i => i.RESOURCE_Category) .Where(w => missingCultureIds.All(a => w.RESOURCE_Value.All(an => an.CultureID != a))).Count(); var results = Db.RESOURCE_Resource .Include(i => i.RESOURCE_Value.Where(s => s.ApplicatieID == applicationId)) .Include(i => i.RESOURCE_Category) .Where(w => missingCultureIds.All(a => w.RESOURCE_Value.All(an => an.CultureID != a))).Skip(pageSize).Take(pageSize*pageNumber); &之外的任何操作的存储策略声明s3:putObject状态
  • KMS政策声明,以阻止Terraform用户执行除s3:getObject&之外的任何操作kms:GenerateDataKey*
  • 用于状态锁定的DynamoDB表。

这可以扩展为包含角色,特别是如果您的Terraform用户将在多个帐户中部署。