Terraform:在带条件的for_each中获取资源ID的实现方法
解决方案:基于条件的Terraform S3 Bucket ACL for_each配置
你的核心问题是混淆了变量定义和已创建资源的属性:var.s3_buckets里的元素并没有id字段(id是aws_s3_bucket资源创建后生成的输出属性),同时之前的写法没有正确关联变量中的条件和已创建的Bucket资源。
正确实现代码
假设你的aws_s3_bucket.s3_buckets资源是基于var.s3_buckets列表用count创建的(和你注释里的原始写法一致),可以用以下配置实现条件创建:
resource "aws_s3_bucket_acl" "s3_acl_private" { for_each = { # 遍历已创建的S3 Bucket资源,同时保留索引用于匹配变量中的条件 for idx, bucket in aws_s3_bucket.s3_buckets : bucket.id => bucket # 仅保留变量中s3_enable_acl为true的项 if var.s3_buckets[idx].s3_enable_acl } bucket = each.value.id acl = "private" }
为什么之前的写法失败?
i.id报错:var.s3_buckets的object定义里没有id字段,id是aws_s3_bucket资源的输出属性,只能从已创建的Bucket资源中获取。index(var.s3_buckets, i)不可靠:如果var.s3_buckets中有重复元素,index会返回第一个匹配项的索引;且当列表元素顺序变化时,会导致for_each的键发生变化,触发不必要的资源销毁重建。- 用索引作为
for_each键的问题:索引键不稳定,列表顺序变化会导致Terraform认为是新资源,破坏资源生命周期的稳定性。
关键逻辑说明
- 遍历
aws_s3_bucket.s3_buckets的索引和对应资源,通过索引关联var.s3_buckets中的enable_acl条件。 - 用Bucket的
id作为for_each的键,保证键的唯一性和稳定性:即使var.s3_buckets的顺序变化,只要Bucket存在,键就不会改变,避免不必要的资源操作。
内容的提问来源于stack exchange,提问作者Bayden
相关产品推荐
相关产品推荐

