You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 23:40:27