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



我正在尝试为我的 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:

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 和可能的区域名称连接到存储桶名称中。

最新更新