Blog
Erstellen Sie mit Terraform mehrere Ressourcen auf einmal für jede

Die Erstellung dynamischer Infrastrukturen mit Terraform war bisher eine Herausforderung. Verwenden Sie das for_each-meta-Argument, um Ihre Infrastruktur sicher und vorhersehbar zu erstellen und gleichzeitig die Duplizierung von Code zu begrenzen.
In diesem Beitrag finden Sie ein praktisches Beispiel dafür, wie Sie das for_each-Metaargument von Terraform 0.12 effektiv nutzen können.
Als Beispiel nehme ich das Modul GCP storage bucket, über das ich in meinem vorherigen Beitrag über den Objekttyp gesprochen habe.
Das Modul wird so umgestaltet, dass ich mehrere Buckets erstellen kann, indem ich ihm alle Bucket-Einstellungen auf einmal mitteile. Wir werden sehen, wie die Verwendung des Meta-Arguments for_each das Hinzufügen und Entfernen von Buckets mit Terraform erleichtert.
Der bisherige Ansatz mit count
Früher haben Sie das Meta-Argumentcount verwendet, um mehrere Ressourcen mit einer Definition zu erstellen. Wenn Sie das getan haben, kennen Sie auch die Probleme dieses Workarounds, da Sie die Variablen für jede Ressource nicht so einfach überschreiben können und es zu unerwünschten Ergebnissen führen kann, wenn Sie den Zählwert ändern und damit eine Ressource aus der Liste entfernen.
In dem folgenden Beispiel zeige ich Ihnen, wie Sie dieses Meta-Argument verwendet haben könnten:
resource "google_storage_bucket" "count" {
count = 4
name = format("bucket_%s", count.index)
location = "europe-west4"
storage_class = "REGIONAL"
bucket_policy_only = true
}
Wenn Sie wie im obigen Beispiel count verwenden, sind Sie bei den Variablen, die an die Ressourcendefinition übergeben werden, eingeschränkt. Als Lösung hätten Sie eine Nachschlagevariable wie die folgende verwenden können:
locals {
bucket_settings = [
{ name = "bucket_1", location = "europe-west4", bucket_policy_only = false },
{ name = "secrets", location = "europe-west1", bucket_policy_only = true },
{ name = "documents", location = "europe-west1", bucket_policy_only = true },
{ name = "public", location = "europe-west4", bucket_policy_only = false },
]
}
resource "google_storage_bucket" "list" {
count = 4
name = local.bucket_settings[count.index].name
location = local.bucket_settings[count.index].location
storage_class = "REGIONAL"
bucket_policy_only = local.bucket_settings[count.index].bucket_policy_only
}
Dies gibt Ihnen zwar mehr Flexibilität, aber auch einige Probleme, wenn Sie unsere Ressourcen entfernen oder ihre Reihenfolge ändern möchten. Terraform erstellt die Ressourcen, jede mit ihrem eigenen Statusschlüssel, der die Zählindexnummer verwendet:
google_storage_bucket.list[0]
google_storage_bucket.list[1]
google_storage_bucket.list[2]
google_storage_bucket.list[3]
Wenn Sie einen Bucket entfernen, der nicht der letzte in der Liste ist, werden alle Buckets danach um 1 Position verschoben. Das führt dazu, dass Terraform sie löschen und mit einem neuen Statusschlüssel neu erstellen möchte.
Das Terraform for_each Meta-Argument
Seit Terraform 0.12.6 können wir die Funktion for_each bei der Erstellung von Ressourcen verwenden.
Ich habe das vorherige Beispiel mit dieser neuen Funktion for_each aktualisiert.
locals {
bucket_settings = {
"bucket_1" = { location = "europe-west4", bucket_policy_only = false },
"secrets" = { location = "europe-west1", bucket_policy_only = true },
"documents" = { location = "europe-west1", bucket_policy_only = true },
"public" = { location = "europe-west4", bucket_policy_only = false }
}
}
resource "google_storage_bucket" "map" {
for_each = local.bucket_settings
name = each.key
location = each.value.location
storage_class = "REGIONAL"
bucket_policy_only = each.value.bucket_policy_only
}
Ich habe die lokale Variable von einer Liste in eine Map umgewandelt und die Listensuche durch each.value.<attribute> ersetzt. for_each kann entweder mit einer Reihe von Strings oder einem Map-Wert arbeiten. In meinem Fall habe ich mich für eine Map entschieden, damit ich für jeden Bucket separate Einstellungen übergeben kann, während ich die Schlüssel für die Generierung meiner Bucket-Namen verwende.
Wenn Sie diesen Code ausführen, werden Sie sehen, dass Terraform die Map-Schlüssel als Index für die Statusschlüssel Ihrer Ressourcen verwendet:
google_storage_bucket.map["bucket_1"]
google_storage_bucket.map["documents"]
google_storage_bucket.map["public"]
google_storage_bucket.map["secrets"]
So können Sie Ihrer Karte Buckets hinzufügen oder entfernen, ohne befürchten zu müssen, dass Terraform die anderen erstellten Ressourcen berührt.
Fazit
Sie wissen nun, wie Sie diese großartige for_each-Funktionalität nutzen können, die in Terraform 0.12 hinzugefügt wurde. Wenn Sie dies in Aktion sehen möchten, können Sie sich das von mir erstellte GCP Bucket-Modul ansehen. In diesem Modul habe ich die Verwendung des Terraform-Objekttyps mit dem for_each-Metaargument kombiniert und so ein flexibles Modul geschaffen.
Verfasst von

Lotte-Sara Laan
Unsere Ideen
Weitere Blogs
Contact



