Estou tentando escrever um código Terraform que pegue um objeto aninhado e crie recursos. Normalmente, isso seria feito com o bloco dinâmico, mas o recurso em questão não oferece suporte a isso. Alguém tem alguma ideia sobre qual seria a melhor abordagem para lidar com isso?
A configuração ficaria assim:
dashboards = {
"Test Dashboards" = {
folder_name = "Test Folder"
dashboards = [
{
file. = "test.json"
overwrite = true
},
{
file = "test1.json"
overwrite = false
}
]
}
}
e então na criação de recursos, normalmente seria algo assim:
resource "grafana_dashboard" "dashboards" {
for_each = var.dashboards
folder = each.value.folder_name
dynamic "dashboard" {
for_each = each.value.dashboards
content {
config_json = file("../../dashboards/${dashboards.value["file"]}")
overwrite = dashboards.value["overwrite"]
}
}
}
Mas o bloco dinâmico não é suportado por esse recurso. A única maneira é não duplicar a configuração, pois ela pode ser compartilhada com vários recursos, se isso fizer sentido.
Antes de responder a essa pergunta, acho importante esclarecer algumas divergências na terminologia: você chamou sua variável de entrada de "painéis", mas, com base no valor que você atribuiu a ela, isso parece ser uma coleção de pastas , onde cada uma contém um ou mais painéis.
Portanto, acho que o que você realmente precisa é de uma instância de
grafana_folder
para cada elemento devar.dashboards
e, então, uma instância degrafana_dashboard
para cada painel distinto listado em todas as pastas.O que você está fazendo aqui é essencialmente uma versão com sabor de Grafana do problema descrito em Achatamento de estruturas aninhadas para
for_each
, e então você pode adaptar a abordagem descrita lá da seguinte maneira.Primeiro, vamos declarar uma variável de entrada para garantir que concordamos sobre seu tipo:
Como essa variável já é um mapa e já tem um elemento para cada "pasta" que você deseja declarar, você pode usar esse valor diretamente
for_each
para declarar várias instâncias degrafana_folder
:Os painéis em si são mais complexos porque você precisa primeiro projetar essa estrutura de dados em um formato adequado para descrever todos os seus painéis de uma só vez: ela deve ser uma coleção com um elemento por painel , em vez de um elemento por pasta . É aí que
flatten
entra:local.dashboards
agora é uma coleção plana de todos os painéis onde cada um sabe a chave da pasta à qual pertence.O único requisito restante é projetar isso em um mapa onde cada elemento tenha uma chave exclusiva que o Terraform possa usar para rastrear qual instância de recurso pertence a ele. Se você puder garantir que cada painel definitivamente tenha
file
um argumento distinto, isso pode ser adequado, e vou presumir que isso seja verdade para este exemplo, mas se não for, você precisará introduzir outro valor para rastrear exclusivamente cada painel dentro de cada pasta.Isso usa o
folder_key
atributo de cada objeto para conectar cada painel de volta ao seu objeto de pasta correspondente e, portanto, isso deve descrever uma hierarquia no Grafana que seja equivalente à hierarquia descrita porvar.dashboard_folders
.Isso pode não compilar; no entanto, você pode tentar uma construção semelhante e ver se funciona para suas necessidades. A ideia é nivelar/projetar seus painéis em uma estrutura dashboard_content com um elemento por item dashboards[], juntamente com a chave pai -> folder_name. É importante que folder_name seja único, pois é assim que o recurso será vinculado. O segundo loop une os filhos nivelados ao pai na seção dinâmica.
Nunca tentei vincular um item em uma seção dinâmica a um item em um escopo externo, então não sei com certeza se o loop interno será compilado, mas pode valer a pena tentar.