Quero criar um módulo para definir configurações de substituição para este recurso cloudflare https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/zone_settings_override
variable "settings" {
type = map(string)
default = {}
}
Então pensei em não definir todas as variáveis possíveis, em vez disso apenas usar um mapa de strings para colocar no bloco de configurações o que eu quero. Claro, não posso testar se é uma variável permitida, mas estou bem com isso. Então pensei em fazer algo como o seguinte pseudocódigo na nuvem, mas algo está faltando e não sei o que
resource "cloudflare_zone_settings_override" "this" {
zone_id = cloudflare_zone.this.id
for each = var.settings
settings {
each.key = each.value
}
}
Este provedor foi definido
settings
como um bloco aninhado, o que significa que seu esquema é rígido e não pode ser preenchido dinamicamente.Portanto, você precisará atribuir explicitamente cada argumento aninhado que deseja oferecer suporte em seu módulo. Não há como atribuir dinamicamente com base nas chaves do seu mapa, porque o provedor espera poder validar os argumentos estaticamente.
Como você precisará especificar os argumentos específicos que deseja suportar de qualquer maneira, será mais fácil (e também mais consistente com o design do provedor) declarar sua variável como sendo um tipo de objeto com atributos opcionais, em vez de um mapa:
A vantagem de declarar isso como um tipo de objeto em vez de um mapa é que você pode assumir que todos os atributos declarados estarão sempre presentes no objeto, embora os opcionais possam estar
null
. Você pode então atribuí-los diretamente porquenull
em um argumento de recurso é sempre equivalente a omitir totalmente o argumento.Se você estiver escrevendo um módulo compartilhado (isto é: um destinado a ser chamado de outro módulo usando um
module
bloco), então outra opção que você pode considerar é projetar seu módulo para apenas exportarcloudflare_zone.this.id
como um valor de saída e deixar o módulo chamador definir seu próprioresource "cloudflare_zone_settings_override"
bloco ; se você apenas passasse os valores do chamador literalmente para este recurso, então você realmente não criou nenhuma abstração e, portanto, definir o recurso diretamente no chamador seria equivalente e consideravelmente mais simples.