Estoy tratando de usar un bucle anidado en terraform. Tengo dos variables de lista list_of_allowed_accounts
y list_of_images
, y estoy buscando iterar sobre la lista list_of_images
y luego iterar sobre la lista list_of_allowed_accounts
.
Aquí está mi código de terraform.
variable "list_of_allowed_accounts" {
type = "list"
default = ["111111111", "2222222"]
}
variable "list_of_images" {
type = "list"
default = ["alpine", "java", "jenkins"]
}
data "template_file" "ecr_policy_allowed_accounts" {
template = "${file("${path.module}/ecr_policy.tpl")}"
vars {
count = "${length(var.list_of_allowed_accounts)}"
account_id = "${element(var.list_of_allowed_accounts, count.index)}"
}
}
resource "aws_ecr_repository_policy" "repo_policy_allowed_accounts" {
count = "${length(var.list_of_images)}"
repository = "${element(aws_ecr_repository.images.*.id, count.index)}"
count = "${length(var.list_of_allowed_accounts)}"
policy = "${data.template_file.ecr_policy_allowed_accounts.rendered}"
}
Este es un equivalente bash de lo que estoy tratando de hacer.
for image in alpine java jenkins
do
for account_id in 111111111 2222222
do
// call template here using variable 'account_id' and 'image'
done
done
account_id = var.list_of_allowed_accounts[floor(count.index / length(var.list_of_images))]
Las respuestas aquí funcionan (las usé inicialmente), pero creo que tengo una mejor solución usando la función setproduct de Terraform . No he visto muchos ejemplos de su uso alrededor de las interwebs, pero setproduct toma dos conjuntos (o más importante, dos listas) y produce una lista de conjuntos con cada permutación de las entradas. En mi caso estoy creando parámetros SSM:
Esto crea parámetros SSM llamados:
¡Mi pequeño cerebro debilucho puede analizar esto un poco más fácil que el módulo mágico en las otras respuestas!
fuente
${length(var.list1) * length(var.list2)}
lugar de${length(local.product)}
contar?${length(local.product)}
probablemente hace más desde entonces. Además, estoy bastante segurosetproduct()
existe pre-0,12, (el mensaje en la parte superior de la página enlazada es sólo una advertencia genérica para todos sus documentos 0.11, creo?)Para su información, si alguien viene de Google, si está usando terraform 0.12, necesitará usar la función de piso en cualquier lugar donde divida, o de lo contrario obtendrá un error sobre los índices parciales.
fuente
for
,for_each
y / o construcciones dinámicas anidado bloques de lenguaje para implementar algo un poco menos confuso?Básicamente, el problema está en los datos "template_file", el account_id no se puede configurar de la manera que cree que lo hará, ya que el recuento en su caso es solo otra var que nunca se incrementa / cambia. Solo digo ya que extraño ver cuál es exactamente tu pregunta.
fuente
No tengo suficientes puntos de reputación para agregar un comentario a la respuesta proporcionada por @ Martin Atkins , por lo que estoy publicando su respuesta con una ligera modificación, que funciona alrededor del problema 20567 de Terraform
fuente