Terraform: Czy istnieje zwięzła składnia do określania wielu znaczników zasobu?

10

Aby dołączyć wiele tagów do zasobu, obecnie używam wielu tagbloków:

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
  }
}

Działa, ale zastanawiam się, czy istnieje bardziej zwięzła składnia. Jest to również trochę podatne na błędy, ponieważ musisz określić propagate_at_launchdla każdego tagu.

Aktualizacja: Pytanie zostało napisane przed wydaniem Terrafrom v0.12. Od tego czasu obsługa poprawiła się dzięki Dynamicznym Zagnieżdżonym Blokom (patrz moja odpowiedź poniżej ).

Philipp Claßen
źródło

Odpowiedzi:

7

Za auto-scaling-groupto jest najbardziej zwięzły składnia dostępny.

W przypadku większości innych zasobów używasz tagsskładni, która wygląda następująco:

tags {
  Key1 = "value1"
  Key2 = "value2"
}
Briansbum
źródło
3

Terraform v0.12 dodał obsługę dynamicznych bloków zagnieżdżonych. Poniższy przykład pochodzi z ich postu na blogu o nowych funkcjach (patrz sekcja Dynamiczne bloki zagnieżdżone ):

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
źródło
2

Inną opcją jest użycie terraform-null-labelmodułu. Obsługuje przekazywanie zmiennej zwanej tagsstandardową mapą Terraform. Moduł następnie emituje wyjście o nazwie, tags_as_list_of_mapsktóra zawiera tagi w żądanym formacie. Ale jeszcze lepszym powodem korzystania z tego modułu jest wygenerowanie spójnego zestawu nazw zasobów zgodnych ze stałą konwencją.

Na przykład możesz to zrobić:

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"
               }
}

Na podstawie Twojego przykładu możemy napisać coś takiego:

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

UWAGA: Dodałem namepole, aby pokazać, jak wygenerować co

Erik Osterman
źródło
Jaki byłby najlepszy sposób, aby „nazwa” uniq dla każdego zasobu? jeśli użyjesz modułu pustej etykiety, każda „nazwa” w zasobach jest taka sama. Co jeśli chcesz nazwać swoje podsieci sufiksem typu -private-subnet? Czy istnieje sposób, aby poradzić sobie z tym zerowa etykieta?
Izac
0

aws_autoscaling_groupObsługuje listę tagów teraz ( https://www.terraform.io/docs/providers/aws/r/autoscaling_group.html#tags ). Ale wygląda to nieco inaczej niż składnia innych zasobów terraform:

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

Pozwala to również na dynamiczne budowanie tagów poprzez interpolację.

Fionn
źródło