Terraform: esiste una sintassi concisa per specificare più tag per una risorsa?


10

Per collegare più tag a una risorsa, attualmente uso più tagblocchi:

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

Funziona, ma mi chiedo se ci sia una sintassi più concisa. È anche un po 'soggetto a errori, come devi specificare propagate_at_launchper ogni tag.

Aggiornamento: la domanda è stata scritta prima dell'uscita di Terrafrom v0.12. Da allora il supporto è migliorato con Dynamic Nested Blocks (vedi la mia risposta di seguito ).

Risposte:


7

Per auto-scaling-groupquesto questa è la sintassi più concisa disponibile.

Per la maggior parte delle altre risorse si utilizza la tagssintassi che assomiglia a:

tags {
  Key1 = "value1"
  Key2 = "value2"
}

3

Terraform v0.12 ha aggiunto il supporto per Dynamic Nested Blocks. L'esempio seguente deriva dal loro post sul blog sulle nuove funzionalità (vedere la sezione Blocchi nidificati dinamici ):

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

2

Un'altra opzione è quella di utilizzare il terraform-null-labelmodulo. Supporta il passaggio di una variabile chiamata tagscome mappa Terraform standard. Il modulo quindi emette un output chiamato tags_as_list_of_mapsche contiene i tag nel formato desiderato. Ma un motivo ancora migliore per utilizzare questo modulo è generare un insieme coerente di nomi di risorse che seguono una convenzione fissa.

Ad esempio, puoi farlo:

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

Quindi, dal tuo esempio, possiamo quindi scrivere qualcosa del genere:

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

NOTA: ho aggiunto il namecampo per mostrare come generare co


Quale sarebbe il modo migliore per rendere "name" uniq per ogni risorsa? se si utilizza il modulo null-label ogni "nome" sulle risorse è lo stesso. Cosa succede se si desidera assegnare un nome alle sottoreti con un suffisso come -private-subnet? C'è un modo in cui l'etichetta null può gestirlo?
Izac,

0

Il aws_autoscaling_groupsupporta un elenco di tag ora ( https://www.terraform.io/docs/providers/aws/r/autoscaling_group.html#tags ). Ma questo sembra un po 'diverso dalla sintassi di altre risorse terraform:

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

Ciò consente anche di creare dinamicamente tag tramite interpolazione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.