我想用terraform管理AWS S3存储桶,并注意到该资源有一个region
参数。
我有一个为1个区域配置的AWS提供程序,并且如果可能的话,想使用该提供程序在多个区域中创建S3存储桶。我的S3存储桶具有许多我不想重复的通用配置,因此我有一个本地模块来执行所有重复的工作....
在mod-s3-bucket/main.tf
中,我有类似的内容:
variable bucket_region {}
variable bucket_name {}
resource "aws_s3_bucket" "s3_bucket" {
region = var.bucket_region
bucket = var.bucket_name
}
然后在父目录(tf根目录)的main.tf
中:
provider "aws" {
region = "us-east-1"
}
module "somebucket" {
source = "mod-s3-bucket"
bucket_region = "us-east-1"
bucket_name = "useast1-bucket"
}
module "anotherbucket" {
source = "mod-s3-bucket"
bucket_region = "us-east-2"
bucket_name = "useast2-bucket"
}
当我用它运行terraform apply
时,两个存储桶都在us-east-1中创建-这是预期的行为吗?我的理解是,区域应该使存储桶在不同的区域中创建。
此外,如果在创建存储桶后运行Terraform计划,则会看到以下内容:
~ region = "us-east-1" -> "us-east-2"
在1个存储桶上,但是在应用后,区域没有更改。
我知道我可以通过使用第二个别名AWS提供程序来轻松解决此问题,但是我特别询问region
参数对aws_s3_bucket
资源(https://www.terraform.io/docs/providers/aws/r/s3_bucket.html#region的作用)
答案 0 :(得分:2)
我认为您需要针对Replication Configuration
:https://www.terraform.io/docs/providers/aws/r/s3_bucket.html#using-replication-configuration
# /root/main.tf
provider "aws" {
region = "us-east-1"
}
provider "aws" {
alias = "us-east-2"
region = "us-east-2"
}
module "somebucket" {
source = "mod-s3-bucket"
bucket_region = "us-east-1"
bucket_name = "useast1-bucket"
}
module "anotherbucket" {
source = "mod-s3-bucket"
provider = "aws.us-east-2"
bucket_region = "us-east-2"
bucket_name = "useast2-bucket"
}
# /mod-s3-bucket/main.tf
variable provider {
type = string
default = "aws"
}
variable bucket_region {}
variable bucket_name {}
resource "aws_s3_bucket" "s3_bucket" {
provider = var.provider
region = var.bucket_region
bucket = var.bucket_name
}
我从来没有像在资源中那样显式地设置提供程序,但是根据文档它可能会起作用。
答案 1 :(得分:0)
s3存储桶资源中的region属性未按预期分析,存在一个错误:
https://github.com/terraform-providers/terraform-provider-aws/issues/592
需要多提供商方法。