Terraform: Existe uma sintaxe concisa para especificar várias tags para um recurso?

9

Para anexar várias tags a um recurso, atualmente uso vários tagblocos:

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, mas me pergunto se existe uma sintaxe mais concisa. Também é um pouco propenso a erros, pois você precisa especificar propagate_at_launchpara cada tag.

Atualização: A pergunta foi escrita antes do Terrafrom v0.12. Desde então, o suporte melhorou com os blocos aninhados dinâmicos (veja minha resposta abaixo ).

Philipp Claßen
fonte

Respostas:

7

Para um, auto-scaling-groupesta é a sintaxe mais concisa disponível.

Para a maioria dos outros recursos, você usa a tagssintaxe que se parece com:

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

O Terraform v0.12 adicionou suporte para Dynamic Nested Blocks. O exemplo a seguir é derivado de sua postagem no blog sobre os novos recursos (consulte a seção Blocos Aninhados Dinâmicos ):

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

Outra opção é usar o terraform-null-labelmódulo. Ele suporta a passagem de uma variável chamada tagscomo um mapa Terraform padrão. O módulo então emite uma saída chamada tags_as_list_of_mapsque contém as tags no formato desejado. Mas uma razão ainda melhor para usar este módulo é gerar um conjunto consistente de nomes de recursos que seguem uma convenção fixa.

Por exemplo, você pode fazer isso:

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

Portanto, a partir do seu exemplo, podemos escrever algo como isto:

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

NOTA: Adicionei o namecampo para mostrar como gerar co

Erik Osterman
fonte
Qual seria a melhor maneira de tornar uniq "nome" para cada recurso? se você usar o módulo de rótulo nulo, todos os "nomes" nos recursos serão iguais. E se você quiser nomear suas sub-redes com um sufixo como -private-subnet? Existe uma maneira de o rótulo nulo poder lidar com isso?
Izac
0

Agora aws_autoscaling_groupele suporta uma lista de tags ( https://www.terraform.io/docs/providers/aws/r/autoscaling_group.html#tags ). Mas isso parece um pouco diferente da sintaxe de outros recursos de terraform:

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

Isso também permite criar tags dinamicamente via interpolação.

Fionn
fonte