在我们的开发环境中,我们希望为每个开发人员提供 S3 存储桶。我正在尝试将这些存储桶的管理迁移到 Terraform。这是在新帐户中进行的,因此开始时不存在存储桶。
locals {
buckets = flatten( [
for e in var.environments : [
for a in var.apps : [
for d in var.developers: [
"macguffin-${a}-${e}${d != "" ? "-${d}" : "" }"
]
]
]
])
}
resource "aws_s3_bucket" "s3" {
count = length(local.buckets)
bucket = element(local.buckets, count.index)
tags = {
Name = element(local.buckets, count.index)
Environment = "development"
}
}
# further configuration of bucket removed
如果我将开发人员列表设置为 [“bob”],执行 terraform apply,然后我会创建并配置预期的存储桶。
如果我现在添加“mary”,那么开发者列表就是[“bob”,“mary”];它会为 Mary 创建存储桶,但也会销毁并重新创建 Bob 的存储桶。
这可以避免吗?我不想弄乱鲍勃的水桶,除非我将他从开发人员列表中删除。我可以看到 aws_s3_bucket 资源上的“bucket”属性被记录为强制重新创建,但我无法了解如何在不调用此强制重新创建的情况下定义存储桶。
我尝试只向 TF 提供开发人员的工作列表(例如,[“Mary”],但随后它想要删除 Bob 的存储桶。
您需要使用
for_each
语句 + toset()
函数才能让 Terraform 准确跟踪创建的存储桶的键。
这是一个例子:
resource "aws_s3_bucket" "s3" {
for_each = toset(locals.buckets)
bucket = each.key
tags = {
Name = each.key
Environment = "development"
}
}