首页 > 解决方案 > 使用 Terraform 工作空间时未创建 S3 状态文件

问题描述

我正在为我的 Terraform 脚本使用 S3 后端:

terraform {
  backend "s3" {
    bucket = "mybucket"
    key    = "path/to/my/key"
    region = "us-east-1"
  }
}

如果我使用多个工作区,我所有工作区的状态是否会存储在上述 S3 后端状态文件中?

我尝试创建 2 个工作区,但状态文件甚至没有在上面提到的 S3 存储桶上创建。

我错过了什么?

标签: amazon-s3terraform

解决方案


Terraform 将根据您使用工作区键前缀选择的工作区在存储桶中创建状态文件,默认设置将为您提供如下内容:

 env:/<my workspace>/path/to/my/key

这意味着如果您运行terraform workspace select <my workspace>并且terraform apply所选工作区的状态文件将最终出现在上述文件夹中。

但是,要在 S3 存储桶上存储状态,您需要自己创建 S3 存储桶(Terraform 期望它存在)。

您可以使用以下命令:

aws s3 mb s3://<my bucket> --region <my region>
aws s3api put-bucket-versioning \
    --region <my region> \
    --bucket <my bucket> \
    --versioning-configuration "Status=Enabled"
aws s3api put-public-access-block \
    --region <my region> \
    --bucket <my bucket> \
    --public-access-block-configuration "BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true"

Terraform 还建议使用 DynamoDB 表进行锁定,您可以像这样创建它:

aws dynamodb create-table \
    --region <my region> \
    --table-name <my dynamodb lock table> \
    --attribute-definitions AttributeName=LockID,AttributeType=S \
    --key-schema AttributeName=LockID,KeyType=HASH

您需要在后端配置中添加 DynamoDB 锁定表的名称,然后使用dynamodb_table = "<my dynamodb lock table>".


推荐阅读