Я делаю следующее в моем модуле terraform
:
data "vault_policy_document" "this" {
dynamic "rule" {
for_each = {
for p in var.policy.policy_content : format("%s-%s-%s", p.path, join(",", p.capabilities)) => p
}
content {
path = rule.value.path
capabilities = rule.value.capabilities
}
}
}
Переменная объявлена как
variable "policy" {
description = "The policy to be created"
type = map(any)
}
и с определенной уверенностью она имеет вид
{
+ "policy-test-1" = {
+ policy_content = [
+ {
+ capabilities = [
+ "read",
+ "create",
]
+ path = "/foo/lala"
},
+ {
+ capabilities = [
+ "read",
+ "create",
]
+ path = "/bar/lala"
},
]
}
},
Почему код не может получить доступ к элементу policy_content
?
Есть ли способ получить доступ к policy_content
в моем цикле for?
намерение здесь определить один документ политики для каждого ключа верхнего уровня («policy-test-1», а затем одно правило для каждого элемента внутри «policy_content»? Я думаю, что for_each внутри самого источника данных может быть тем, что вы ищете Я проверю это.
Да, это намерение; иметь возможность создать политику с несколькими парами paths
/capabilities
; вот почему я (пытаюсь) передать карту, ключ верхнего уровня которой будет именем политики
Ваша первоначальная попытка не повторяет ключи карты policy
, что можно исправить, зациклив сам источник данных документа политики по карте:
data "vault_policy_document" "this" {
for_each = var.policy
dynamic "rule" {
for_each = {
for p in each.value.policy_content : format("%s-%s", p.path, join(",", p.capabilities)) => p
}
content {
path = rule.value.path
capabilities = rule.value.capabilities
}
}
}
resource "vault_policy" "this" {
for_each = var.policy
name = each.key
policy = data.vault_policy_document.this[each.key].hcl
}
Это, вероятно, можно исправить дальше (например, перебирая ресурс политики по элементам источника данных, а не снова используя ту же самую переменную политики).
Но это действительно производит то, что мне кажется правильным планом:
# vault_policy.this["policy-test-1"] will be created
+ resource "vault_policy" "this" {
+ id = (known after apply)
+ name = "policy-test-1"
+ policy = <<-EOT
path "/bar/lala" {
capabilities = ["read", "create"]
}
path "/foo/lala" {
capabilities = ["read", "create"]
}
EOT
}
Похоже, у вашей переменной есть дополнительный ключ верхнего уровня
"policy-test-1"
, который вы не учитываете.