Terraform: ¿Existe una sintaxis concisa para especificar múltiples etiquetas para un recurso?

9

Para adjuntar múltiples etiquetas a un recurso, actualmente uso múltiples tagbloques:

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

Funciona, pero me pregunto si hay una sintaxis más concisa. También es un poco propenso a errores, ya que debe especificar propagate_at_launchpara cada etiqueta.

Actualización: la pregunta se escribió antes de que saliera Terrafrom v0.12. Desde entonces, el soporte ha mejorado con Dynamic Nested Blocks (vea mi respuesta a continuación ).

Philipp Claßen
fuente

Respuestas:

7

Para auto-scaling-groupesto, esta es la sintaxis más concisa disponible.

Para la mayoría de los otros recursos, utiliza la tagssintaxis que se parece a:

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

Terraform v0.12 agregó soporte para Dynamic Nested Blocks. El siguiente ejemplo se deriva de su publicación de blog sobre las nuevas características (consulte la sección Bloques dinámicos anidados ):

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
fuente
1

Otra opción es usar el terraform-null-labelmódulo. Admite pasar una variable llamada tagscomo un mapa de Terraform estándar. Luego, el módulo emite una salida llamada tags_as_list_of_mapsque contiene las etiquetas en el formato que desee. Pero una razón aún mejor para usar este módulo es generar un conjunto consistente de nombres de recursos que sigan una convención fija.

Por ejemplo, puedes hacer esto:

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

Entonces, a partir de su ejemplo, podemos escribir algo como esto:

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

NOTA: Agregué el namecampo para mostrar cómo generar co

Erik Osterman
fuente
¿Cuál sería la mejor manera de hacer "nombre" uniq para cada recurso? Si utiliza el módulo de etiqueta nula, cada "nombre" en los recursos es el mismo. ¿Qué sucede si desea nombrar sus subredes con un sufijo como -private-subnet? ¿Hay alguna forma en que la etiqueta nula pueda manejar eso?
Izac
0

La aws_autoscaling_grouphace apoyar una lista de etiquetas ahora ( https://www.terraform.io/docs/providers/aws/r/autoscaling_group.html#tags ). Pero esto se ve un poco diferente a la sintaxis de otros recursos de terraformación:

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

Esto también permite construir dinámicamente etiquetas mediante interpolación.

Fionn
fuente