Ich versuche, eine verschachtelte Schleife in Terraform zu verwenden. Ich habe zwei Listenvariablen list_of_allowed_accounts
und list_of_images
und suche, über Liste zu iterieren list_of_images
und dann über Liste zu iterieren list_of_allowed_accounts
.
Hier ist mein Terraform-Code.
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}"
}
Dies ist ein bash-Äquivalent zu dem, was ich versuche zu tun.
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))]
Die Antworten hier funktionieren (ich habe sie anfangs verwendet), aber ich denke, ich habe eine bessere Lösung, wenn ich die SetProduct- Funktion von Terraform verwende . Ich habe nicht viele Beispiele dafür gesehen, die in den Interwebs verwendet wurden, aber setproduct benötigt zwei Mengen (oder, was noch wichtiger ist, zwei Listen) und erstellt eine Liste von Mengen mit jeder Permutation der Eingaben. In meinem Fall erstelle ich SSM-Parameter:
Dadurch werden die folgenden SSM-Parameter erstellt:
Mein schwaches kleines Gehirn kann dies ein wenig einfacher analysieren als die Modulo-Magie in den anderen Antworten!
quelle
${length(var.list1) * length(var.list2)}
statt${length(local.product)}
für die Zählung?${length(local.product)}
macht wohl mehr da. Ich bin mir auch ziemlich sicher, dasssetproduct()
es vor 0.12 existiert (die Meldung oben auf der verlinkten Seite ist nur eine allgemeine Warnung für alle 0.11-Dokumente, denke ich?)Zu Ihrer Information, wenn jemand von Google hierher kommt, wenn Sie terraform 0.12 verwenden, müssen Sie die Floor-Funktion überall dort verwenden, wo Sie unterteilen. Andernfalls wird eine Fehlermeldung zu Teilindizes angezeigt.
quelle
for
,for_each
und / oder dynamische verschachtelte Konstrukte Blöcke Sprache etwas weniger zu implementieren verwirrend?Grundsätzlich liegt das Problem in der Datei "template_file". Die account_id kann nicht so gesetzt werden, wie Sie es sich vorstellen, da die Zählung in Ihrem Fall nur eine andere Variable ist, die niemals inkrementiert / geändert wird. Ich sage nur, da ich vermisse zu sehen, was genau deine Frage ist.
quelle
Ich habe nicht genug Reputationspunkte, um der Antwort von @ Martin Atkins einen Kommentar hinzuzufügen. Daher veröffentliche ich seine Antwort mit einer geringfügigen Änderung, die das Terraform-Problem 20567 betrifft
quelle