Terraform - 创建带有名称的 S3 存储桶;保留现有的存储桶

问题描述 投票:0回答:1

在我们的开发环境中,我们希望为每个开发人员提供 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 的存储桶。

terraform
1个回答
0
投票

您需要使用

for_each
语句 +
toset()
函数才能让 Terraform 准确跟踪创建的存储桶的键。

这是一个例子:

resource "aws_s3_bucket" "s3" {
  for_each = toset(locals.buckets)
  bucket = each.key
  
  tags = {
    Name = each.key
    Environment = "development"
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.