我有一个 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 放入动态中,但无法将存储桶名称与存储桶删除规则进行比较。那么现在我如何定义变量并在这两个变量之间进行均衡以将规则应用到所需的存储桶?
这是我解决问题的方法。
如果 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
}
}