创建状态存储桶时,远程后端S3的Terraform初始化失败

时间:2018-09-18 06:13:29

标签: amazon-web-services terraform terraform-provider-aws

我试图为我的S3存储桶创建一个远程后端。

provider "aws" {
  version = "1.36.0"
  profile = "tasdik"
  region  = "ap-south-1"
}

terraform {
  backend "s3" {
    bucket = "ops-bucket"
    key    = "aws/ap-south-1/homelab/s3/terraform.tfstate"
    region = "ap-south-1"
  }
}

resource "aws_s3_bucket" "ops-bucket" {
  bucket = "ops-bucket"
  acl    = "private"

  versioning {
    enabled = true
  }

  lifecycle {
    prevent_destroy = true
  }

  tags {
    Name       = "ops-bucket"
    Environmet = "devel"
  }
}

我还没有应用任何东西,到目前为止,存储桶还不存在。因此,terraform要求我执行init。但是当我尝试这样做时,我得到了一个

$ terraform init       

Initializing the backend...

Successfully configured the backend "s3"! Terraform will automatically
use this backend unless the backend configuration changes.
Error loading state: BucketRegionError: incorrect region, the bucket is not in 'ap-south-1' region
    status code: 301, request id: , host id:

1 个答案:

答案 0 :(得分:5)

Terraform将在执行任何其他动作(例如计划或应用)之前初始化任何状态配置。因此,您无法在定义状态后端的同时创建要存储的状态的S3存储桶。

Terraform也不会为您创建一个S3存储桶来放置您的状态,您必须提前创建它。

您可以在Terraform之外执行此操作,例如使用AWS CLI:

aws s3api create-bucket --bucket "${BUCKET_NAME}" --region "${BUCKET_REGION}" \
          --create-bucket-configuration LocationConstraint="${BUCKET_REGION}"

或者您可以尝试通过Terraform创建它,但是使用本地状态在第一个apply上创建存储桶,然后添加状态配置并重新初始化以获取Terraform来迁移状态到新的S3存储桶中。

对于错误消息,S3存储桶名称在所有区域和所有AWS账户中是全局唯一的。错误消息告诉您它运行了GetBucketLocation调用,但在ap-south-1中找不到存储桶。创建存储桶时,我建议通过将帐户ID和可能的区域名称连接到存储桶名称中来进行操作,以确保它们可能是唯一的。