Blog
Garantieren Sie eindeutige Schlüssel in Terraform

Wenn Sie Terraform zur dynamischen Erstellung von Ressourcen auf der Grundlage von Listen von Maps verwenden, sind Sie wahrscheinlich schon auf dieses Problem gestoßen. Betrachten Sie die folgende Liste von Maps, die den IAM-Zugriff auf eine generische Cloud-Ressource darstellt:
locals = {
members = [
{
member = "contact@christerbeke.com"
resource = "projects/12345"
role = "roles/owner"
},
{
member = "test@christerbeke.com"
resource = "projects/12345"
role = "roles/reader"
}
]
}
Wenn wir über diese Liste iterieren möchten, um eine dynamische Menge von Ressourcen zu erstellen (unter Verwendung von for_each), müssen wir sie in eine map umwandeln. Es gibt jedoch keine Möglichkeit, einen Map-Schlüssel aus den einzelnen Attributen zu konstruieren und die Eindeutigkeit zu garantieren. Wie können wir dieses Problem also lösen?
Der Trick besteht darin, eine Kombination aus allen Attributen zu erstellen. Aber die einfache Verkettung aller Attribute in einer Zeichenkette führt zu sehr langen Schlüsseln. Um dieses Problem zu lösen und vorhersehbare Schlüssellängen zu erhalten, können wir einen md5-Hash verwenden:
locals = {
unique_members = { for key, member in local.members : md5("${member.member}/${member.resource}/${member.role}") => member }
}
Daraus ergeben sich die folgenden Daten:
{
"0f334c4500b1faab57203343199d5c86" = {
member = "contact@christerbeke.com"
resource = "projects/12345"
role = "roles/owner"
},
"c02f629ef8bf2b413a203c4dcafa60c1" = {
member = "test@christerbeke.com"
resource = "projects/12345"
role = "roles/reader"
}
}
Jetzt können wir sie in unserem for_each Iterator verwenden:
resource "iam_member" "default" {
for_each = local.unique_members
member = each.value.member
resource = each.value.resource
role = each.value.role
}
Jetzt kennen Sie einen einfachen Trick, um eine Liste von Maps in eine iterierbare Map mit eindeutigen Schlüsseln umzuwandeln.
Als Bonus werden Sie nun über doppelte Listeneinträge gewarnt, da diese zu doppelten Map-Schlüsseln führen würden, die Terraform zu einem Fehler veranlassen würden!
Verfasst von

Chris ter Beke
Chris ter Beke has been using Google Cloud Platform for over 8 years. He has built multiple SaaS platforms using technologies like Terraform, Kubernetes, Python, and automated CI/CD pipelines.
Contact



