Terraform: Gibt es eine präzise Syntax zum Angeben mehrerer Tags für eine Ressource?

9

Um mehrere Tags an eine Ressource anzuhängen, verwende ich derzeit mehrere tagBlöcke:

resource "aws_autoscaling_group" "instance" {
  ...

  tag {
    key                 = "Name"
    value               = "${var.cluster_prefix}"
    propagate_at_launch = true
  }

  tag {
    key                 = "Owner"
    value               = "${var.tag_Owner}"
    propagate_at_launch = true
  }

  tag {
    key                 = "Project"
    value               = "${var.tag_Project}"
    propagate_at_launch = true
  }
}

Es funktioniert, aber ich frage mich, ob es eine präzisere Syntax gibt. Es ist auch ein bisschen fehleranfällig, da Sie propagate_at_launchfür jedes Tag angeben müssen.

Update: Die Frage wurde geschrieben, bevor Terrafrom v0.12 herauskam. Seitdem hat sich die Unterstützung mit Dynamic Nested Blocks verbessert (siehe meine Antwort unten ).

Philipp Claßen
quelle

Antworten:

7

Für eine ist auto-scaling-groupdies die prägnanteste verfügbare Syntax.

Für die meisten anderen Ressourcen verwenden Sie die folgende tagsSyntax:

tags {
  Key1 = "value1"
  Key2 = "value2"
}
Briansbum
quelle
2

Terraform v0.12 hat Unterstützung für dynamische verschachtelte Blöcke hinzugefügt. Das folgende Beispiel stammt aus ihrem Blogbeitrag über die neuen Funktionen (siehe Abschnitt Dynamisch verschachtelte Blöcke ):

locals {
  standard_tags = {
    Name    = var.cluster_prefix
    Owner   = var.tag_Owner
    Project = var.tag_Project
  }
}

resource "aws_autoscaling_group" "example" {
  # ...

  dynamic "tag" {
    for_each = local.standard_tags

    content {
      key                 = tag.key
      value               = tag.value
      propagate_at_launch = true
    }
  }
}
Philipp Claßen
quelle
1

Eine andere Möglichkeit ist die Verwendung des terraform-null-labelModuls. Es unterstützt die Übergabe einer Variablen, die tagsals Standard-Terraform-Karte bezeichnet wird. Das Modul gibt dann eine Ausgabe aus, die aufgerufen wird tags_as_list_of_mapsund die Tags im gewünschten Format enthält. Ein noch besserer Grund für die Verwendung dieses Moduls besteht darin, einen konsistenten Satz von Ressourcennamen zu generieren, die einer festen Konvention folgen.

Zum Beispiel können Sie dies tun:

module "example" {
  source     = "git::https://github.com/cloudposse/terraform-null-label.git?ref=master"
  namespace  = "eg"
  stage      = "prod"
  name       = "bastion"
  tags       = { 
                 "BusinessUnit" = "XYZ" 
                 "Snapshot" = "true"
               }
}

Aus Ihrem Beispiel können wir also so etwas schreiben:

resource "aws_autoscaling_group" "instance" {
  ...
  name = "${module.example.id}"
  ...
  tags = "${module.example.tags_as_list_of_maps}"
  ...
}

HINWEIS: Ich habe das nameFeld hinzugefügt , um zu zeigen, wie Co generiert wird

Erik Osterman
quelle
Was wäre der beste Weg, um "Name" für jede Ressource eindeutig zu machen? Wenn Sie das Null-Label-Modul verwenden, ist jeder "Name" in den Ressourcen gleich. Was ist, wenn Sie Ihre Subnetze mit einem Suffix wie -private-subnet benennen möchten? Gibt es eine Möglichkeit, wie das Null-Label damit umgehen kann?
Izac
0

Das aws_autoscaling_groupunterstützt jetzt eine Liste von Tags ( https://www.terraform.io/docs/providers/aws/r/autoscaling_group.html#tags ). Dies sieht jedoch etwas anders aus als die Syntax anderer Terraform-Ressourcen:

tags = [
  {
    key                 = "explicit1"
    value               = "value1"
    propagate_at_launch = true
  },
  {
    key                 = "explicit2"
    value               = "value2"
    propagate_at_launch = true
  },
]

Dies ermöglicht auch das dynamische Erstellen von Tags durch Interpolation.

Fionn
quelle