Terraform: Existe-t-il une syntaxe concise pour spécifier plusieurs balises pour une ressource?

10

Pour attacher plusieurs balises à une ressource, j'utilise actuellement plusieurs tagblocs:

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

Cela fonctionne, mais je me demande s'il existe une syntaxe plus concise. C'est aussi un peu sujet aux erreurs car vous devez spécifier propagate_at_launchpour chaque balise.

Mise à jour: La question a été écrite avant la sortie de Terrafrom v0.12. Depuis lors, la prise en charge s'est améliorée avec les blocs imbriqués dynamiques (voir ma réponse ci-dessous ).

Philipp Claßen
la source

Réponses:

7

Pour un auto-scaling-groupc'est la syntaxe la plus concise disponible.

Pour la plupart des autres ressources, vous utilisez la tagssyntaxe qui ressemble à:

tags {
  Key1 = "value1"
  Key2 = "value2"
}
Briansbum
la source
3

Terraform v0.12 a ajouté la prise en charge des blocs dynamiques imbriqués. L'exemple suivant est dérivé de leur article de blog sur les nouvelles fonctionnalités (voir la section Blocs imbriqués dynamiques ):

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
la source
2

Une autre option consiste à utiliser le terraform-null-labelmodule. Il prend en charge le passage d'une variable appelée en tagstant que carte Terraform standard. Le module émet alors une sortie appelée tags_as_list_of_mapsqui contient les balises au format souhaité. Mais une raison encore meilleure d'utiliser ce module est de générer un ensemble cohérent de noms de ressources qui suivent une convention fixe.

Par exemple, vous pouvez faire ceci:

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

Donc, à partir de votre exemple, nous pouvons alors écrire quelque chose comme ceci:

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

REMARQUE: j'ai ajouté le namechamp pour montrer comment générer des co

Erik Osterman
la source
Quelle serait la meilleure façon de rendre uniq "nom" à chaque ressource? si vous utilisez le module null-label, chaque "nom" sur les ressources est le même. Et si vous voulez nommer vos sous-réseaux avec un suffixe comme -private-subnet? Existe-t-il un moyen pour le label nul de gérer cela?
Izac
0

Le aws_autoscaling_groupprend désormais en charge une liste de balises ( https://www.terraform.io/docs/providers/aws/r/autoscaling_group.html#tags ). Mais cela semble un peu différent de la syntaxe des autres ressources terraform:

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

Cela permet également de créer dynamiquement des balises par interpolation.

Fionn
la source