使用terraform创建google存储桶并为指定桶设置生命周期规则

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

我有一个 terraform 模块来创建一些对用户具有指定权限的存储桶,现在我需要为某些存储桶指定一些生命周期规则,并且我需要在两个变量之间进行映射,如下所示:

变量.tf

variable "buckets" {
  description = "List of buckets"
  type        = list(string)
  default     = []
}

variable "bucket_deletion_rules" {
  description = "Ad-hoc Bucket deletion rules"
  type        = set(object({}))
  default     = [{}]
}

桶.tf

resource "google_storage_bucket" "data_bucket" {
  for_each                    = toset(var.buckets)
  name                        = each.key
  project                     = var.project
  location                    = var.region
  uniform_bucket_level_access = true
  versioning {
    enabled = false
  }

  dynamic "lifecycle_rule" {
    for_each = var.bucket_deletion_rules
    content {
      action {
        type = "Delete"
      }
      condition {
        age  = lifecycle_rule.value
      }
    }
  }
}

上面的代码无法正常运行!这个想法是像这样定义变量:

  buckets = [
    "bucket-mhmd-test1",
    "bucket-mhmd-test2",
    "bucket-mhmd-test3"
  ]
  bucket_deletion_rules = [
    {
    "bucket-mhmd-test1" = 50
    "bucket-mhmd-test2" = 10
    }
  ]

我尝试将嵌套的 for_each 放入动态中,但无法将存储桶名称与存储桶删除规则进行比较。那么现在我如何定义变量并在这两个变量之间进行均衡以将规则应用到所需的存储桶?

google-cloud-platform terraform google-cloud-storage terraform-provider-gcp gcs
2个回答
0
投票

动态块只能生成属于 正在配置的资源类型、数据源、提供者或配置者。 无法生成元参数块,例如生命周期 和配置程序块,因为 Terraform 必须在它之前处理这些 评估表达式是安全的。

这来自 docs,可能可以解释为什么它不能正常工作。要动态设置 gcp 生命周期策略,您可以使用模块(例如 this


0
投票

这是我解决问题的方法。

如果 gcs_name 中的生命周期设置为 true,则生命周期将应用于 gcs,年龄将应用于 gcs 规则,如果生命周期设置为 false,则不会将生命周期应用于 gcs,年龄不会被考虑在内。

在此示例中,我创建了两个 GCS 存储桶,每个存储桶都有基于映射变量值的规则。

resource "google_storage_bucket" "test" {
  for_each      = var.gcs_name
  name          = "${each.value.name}"
  project       = var.project_id
  location      = var.region
  storage_class = "STANDARD"
  force_destroy = true

  dynamic "lifecycle_rule" {
    for_each = each.value.apply_lifecycle ? [1] : []

    content {
      condition {
        age = each.value.age
      }
      action {
        type = "Delete"
      }
    }
  }
}

gcs_name

的价值
gcs_name    = {
            gcs1 = {
                    name               = "composer"
                    apply_lifecycle    = true
                    age                = 30
                }
            gcs2 = {
                    name               = "composer-snapshot"
                    apply_lifecycle    = false
                    age                = null
                }
            }
© www.soinside.com 2019 - 2024. All rights reserved.