Terraform: Apakah ada sintaksis ringkas untuk menentukan beberapa tag untuk sumber daya?

10

Untuk melampirkan banyak tag ke sumber daya, saat ini saya menggunakan beberapa tagblok:

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

Berhasil, tapi saya ingin tahu apakah ada sintaksis yang lebih ringkas. Ini juga agak rawan kesalahan karena Anda harus menentukan propagate_at_launchuntuk setiap tag.

Pembaruan: Pertanyaan ini ditulis sebelum Terrafrom v0.12 keluar. Sejak itu, dukungan telah ditingkatkan dengan Dynamic Nested Blocks (lihat jawaban saya di bawah ).

Philipp Claßen
sumber

Jawaban:

7

Untuk auto-scaling-groupini adalah sintaksis paling ringkas yang tersedia.

Untuk sebagian besar sumber daya lain Anda menggunakan tagssintaks yang terlihat seperti:

tags {
  Key1 = "value1"
  Key2 = "value2"
}
Briansbum
sumber
3

Terraform v0.12 menambahkan dukungan untuk Dynamic Nested Blocks. Contoh berikut berasal dari posting blog mereka tentang fitur-fitur baru (lihat bagian Dynamic Nested Blocks ):

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
sumber
2

Pilihan lain adalah menggunakan terraform-null-labelmodul. Ini mendukung melewati variabel yang disebut tagssebagai peta Terraform standar. Modul kemudian memancarkan output yang disebut tags_as_list_of_mapsyang berisi tag dalam format yang Anda inginkan. Tetapi alasan yang lebih baik untuk menggunakan modul ini adalah untuk menghasilkan seperangkat nama sumber daya yang konsisten yang mengikuti konvensi tetap.

Misalnya, Anda dapat melakukan ini:

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

Jadi dari contoh Anda, kami kemudian dapat menulis sesuatu seperti ini:

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

CATATAN: Saya menambahkan namebidang untuk menunjukkan cara menghasilkan co

Erik Osterman
sumber
Apa yang akan menjadi cara terbaik untuk membuat "nama" uniq untuk setiap sumber daya? jika Anda menggunakan modul label-nol setiap "nama" pada sumber daya adalah sama. Bagaimana jika Anda ingin memberi nama subnet Anda dengan sufiks seperti -private-subnet? Apakah ada cara label-nol dapat mengatasinya?
Izac
0

Itu aws_autoscaling_groupmendukung daftar tag sekarang ( https://www.terraform.io/docs/providers/aws/r/autoscaling_group.html#tags ). Tapi ini terlihat sedikit berbeda dengan sintaks sumber daya terraform lainnya:

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

Ini juga memungkinkan untuk membuat tag secara dinamis melalui interpolasi.

Fionn
sumber