根据配置的 aws 帐户,为 terraform s3 后端使用不同的存储桶

wil*_*des 3 amazon-s3 terraform terraform-provider-aws terraform0.12+

我需要 terraform s3 后端将一个存储桶用于我的生产 AWS 帐户,将另一个存储桶用于我的开发 AWS 帐户。我们需要这个,因为我们无法允许开发 AWS 账户中的用户访问生产 AWS 账户中的 s3 存储桶。S3存储桶名称必须是全局唯一的,因此存储桶名称字段不能相同。

我尝试在这里使用变量,但 terraform 后端中出现变量错误。这是一个非常需要的功能,并且有一个 GitHub 问题,但它已经开放了 4 年,似乎没有任何计划添加此功能,所以我需要一个解决方法。一项建议来自同一 GitHub 问题。该建议是使用terraform 远程状态数据源。不幸的是,这似乎不起作用。这是我尝试过的:

// backend.tf

terraform {
  backend "s3" {}
}
data terraform_remote_state "state" {
  backend = "s3"
  config {
    bucket = var.aws_account == "123456789000" ? "my-prod-bucket" : "my-dev-bucket"
    key    = "apps/main-stack.tfstate"
    region = "us-east-1"
  }
}
Run Code Online (Sandbox Code Playgroud)

没有使用任何值,并且它会提示手动输入所有值。

$ terraform init
Initializing modules...

Initializing the backend...
bucket
The name of the S3 bucket

Enter a value:
Run Code Online (Sandbox Code Playgroud)

我四处寻找其他解决方案,但到目前为止,还没有运气。有谁知道如何解决这一问题?

wil*_*des 5

似乎解决方案是使用后端配置文件。这称为部分配置。您可以为需要单独后端的每个 aws 帐户保留一个 tfvars 文件,并在初始化 terraform 时提供它,如下所示:

// prod-backend-config.tfvars

bucket = "my-prod-s3-bucket-for-terraform"
Run Code Online (Sandbox Code Playgroud)
// dev-backend-config.tfvars

bucket = "my-dev-s3-bucket-for-terraform"
Run Code Online (Sandbox Code Playgroud)
// backend.tf

terraform {
  backend "s3" {
    // do not set a bucket name here
    key    = "apps/main-stack.tfstate"
    region = "us-east-1"
  }
}
Run Code Online (Sandbox Code Playgroud)
$ terraform init -backend-config prod-backend-config.tfvars
Run Code Online (Sandbox Code Playgroud)

这使您可以保持后端的 aws 账户和 s3 存储桶之间的奇偶性。

有关使用任意变量配置任何后端的更通用解决方案,请参阅如何传递 Terraform S3 后端资源的变量?