Terraform GCS Bucket动态lifecycle_rule块遍历对象列表失败求助
解决Terraform GCP存储桶lifecycle_rule动态块遍历问题
问题根源
你的dynamic "lifecycle_rule"块的for_each表达式错误地将lifecycle_rule列表额外嵌套了一层,导致遍历的每个元素是整个规则列表而非单个规则对象,因此无法直接访问.action或.condition属性,触发了"无法访问列表对象属性"的报错。
修正方案
修改dynamic "lifecycle_rule"的for_each逻辑,直接使用从变量中获取的lifecycle_rule列表,无需额外嵌套:
dynamic "lifecycle_rule" { for_each = lookup(each.value, "lifecycle_rule", []) content { action { type = lifecycle_rule.value.action.type storage_class = lookup(lifecycle_rule.value.action, "storage_class", null) } condition { age = lookup(lifecycle_rule.value.condition, "age", null) # 如需其他条件,可在此添加,比如: # matches_suffix = lookup(lifecycle_rule.value.condition, "matches_suffix", null) } } }
完整修正后的资源代码
resource "google_storage_bucket" "cloud_storage" { for_each = {for gcs in var.storage_buckets : gcs.name => gcs} name = each.value.name location = lookup(each.value, "location", "AUSTRALIA-SOUTHEAST1") project = data.google_project.existing_projects[each.value.project].project_id force_destroy = lookup(each.value, "force_destroy", false) storage_class = lookup(each.value, "storage_class", "STANDARD") labels = merge( lookup(each.value, "labels", {}), { managed_by = "terraform" } ) dynamic "versioning" { for_each = [for version in [lookup(each.value, "versioning", null)] : version if version != null] content { enabled = lookup(versioning.value, "enabled", true) } } dynamic "lifecycle_rule" { for_each = lookup(each.value, "lifecycle_rule", []) content { action { type = lifecycle_rule.value.action.type storage_class = lookup(lifecycle_rule.value.action, "storage_class", null) } condition { age = lookup(lifecycle_rule.value.condition, "age", null) } } } uniform_bucket_level_access = lookup(each.value, "uniform_bucket_level_access", false) depends_on = [ data.google_project.existing_projects ] }
额外注意事项
- 你的
.tfvars中存在拼写错误:localtion应应改为location,否则location参数会使用默认值而非你指定的区域。 - 当
lifecycle_rule为空列表时,for_each = []会自动跳过动态块的创建,无需额外过滤逻辑。
内容的提问来源于stack exchange,提问作者Pradeep D
相关产品推荐
相关产品推荐

