Terraform:导入存储 class 区域和提供商区域存在差异的 s3 存储桶时出错

Terraform: Error while importing s3 bucket with difference in storage class region and provider region

我正在尝试将 us-east-1 区域中的存储桶导入 ap-south-1 区域中的父模块。我现在不想将存储桶迁移到 ap-south-1 区域,但我希望它的状态位于具有提供程序区域 ap-south-1 的父模块中。我在做这件事时遇到了错误。

命令:

terraform import aws_s3_bucket.cdn staging.domain.com

错误:

terraform import aws_s3_bucket.cdn staging.domain.com                    [15:02:27]
aws_s3_bucket.cdn: Importing from ID "staging.domain.com"...

Error: aws_s3_bucket.cdn (import id: staging.domain.com): import aws_s3_bucket.cdn (id: staging.domain.com): Error importing AWS S3 bucket policy: BucketRegionError: incorrect region, the bucket is not in 'ap-south-1' region at endpoint ''
    status code: 301, request id: , host id:

现在有可能吗?

我认为存储桶的区域 (us-east-1) 与父模块的区域 (ap-south-1) 不匹配。

所以我建议使用多个提供商。 https://www.terraform.io/docs/configuration/providers.html#alias-multiple-provider-instances


1. 为 us-east-1 区域

创建一个 aws 提供商
// default aws provider for parent module
provider "aws" {
  ...
  region = "ap-south-1"
  ...
}

// add for us-east-1 
provider "aws" {
  ...
  region  = "us-east-1"
  alias   = "us-east-1"
  ...
}
  1. 将新的 aws 提供商设置为 aws_s3_bucket.cdn
resource "aws_s3_bucket" "cdn" {
  ...
  provider    = "aws.us-east-1"
  ...
}
  1. 使用提供商选项导入 https://www.terraform.io/docs/commands/import.html#provider-provider
terraform import -provider=aws.us-east-1 aws_s3_bucket.cdn staging.domain.com 

这对我来说有点困难,最终答案是“使用正确的区域”。所以我在 us-west-2 中有一个桶,但我的其他东西在 us-east-1 中。我需要使用:


provider "aws" {
  alias  = "oregon"
  region = "us-west-2"
}


resource "aws_s3_bucket" "tf_logs" {
  provider = aws.oregon
  bucket = "my-bucket-name"
}

然后成功了。


我发现这个问题的方法是 运行 terraform 和更多日志记录:

TF_LOG=DEBUG terraform import aws_s3_bucket.tf_logs my-bucket-name

然后它给了我一个神秘的“错误请求”,我将其放入 Postman,这给了我这个有用的消息:

HTTP 400 Bad Request
<Message>The authorization header is malformed; the region 'us-east-1' is wrong; expecting 'us-west-2'</Message>