Terraform: Чи є лаконічний синтаксис для визначення кількох тегів для ресурсу?


10

Щоб приєднати кілька тегів до ресурсу, в даний час я використовую кілька tagблоків:

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

Це працює, але мені цікаво, чи є більш стислий синтаксис. Це також трохи схильна помилка, як ви повинні вказати propagate_at_launchдля кожного тегу.

Оновлення: Питання було написано до виходу Terrafrom v0.12. З тих пір підтримка покращилася за допомогою динамічних вкладених блоків (див. Мою відповідь нижче ).

Відповіді:


7

Для auto-scaling-groupцього це найкоротший доступний синтаксис.

Для більшості інших ресурсів ви використовуєте tagsсинтаксис, який виглядає так:

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

3

Terraform v0.12 додав підтримку для динамічних вкладених блоків. Наступний приклад виведений з публікації їхнього блогу про нові функції (див. Розділ Динамічні вкладені блоки ):

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

Інший варіант - використання terraform-null-labelмодуля. Він підтримує передачу змінної, званої tagsяк стандартна карта Terraform. Потім модуль висилає результат, tags_as_list_of_mapsякий називається, який містить теги у потрібному форматі. Але ще краща причина використовувати цей модуль - це генерувати послідовний набір ресурсів, які відповідають фіксованому умові.

Наприклад, ви можете це зробити:

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

Тож із вашого прикладу ми можемо написати щось подібне:

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

ПРИМІТКА. Я додав nameполе, щоб показати, як створити co


Який був би найкращий спосіб зробити "ім'я" uniq до кожного ресурсу? якщо ви використовуєте модуль з нульовою міткою, кожне "ім'я" в ресурсах однакове. Що робити, якщо ви хочете назвати свої підмережі суфіксом типу -private-підмережі? Чи існує спосіб, коли нульова мітка може це впоратися?
Ізак

0

Служба aws_autoscaling_groupпідтримує список тегів зараз ( https://www.terraform.io/docs/providers/aws/r/autoscaling_group.html#tags ). Але це виглядає дещо інакше, ніж синтаксис інших ресурсів тераформи:

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

Це також дозволяє динамічно будувати теги за допомогою інтерполяції.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.