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 เพิ่มการรองรับสำหรับ 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
    }
  }
}

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เขตข้อมูลเพื่อแสดงวิธีสร้าง บริษัท


อะไรจะเป็นวิธีที่ดีที่สุดในการสร้าง "ชื่อ" uniq ให้กับแต่ละแหล่งทรัพยากร ถ้าคุณใช้โมฆะโมดูลป้ายชื่อ "ทุก" ใน ressources เหมือนกัน ถ้าคุณต้องการตั้งชื่อซับเน็ตด้วยคำต่อท้ายเช่น -private-subnet มีวิธีใดที่ null-label สามารถจัดการได้หรือไม่?
Izac

0

สิ่งaws_autoscaling_groupนี้สนับสนุนรายการแท็กทันที ( https://www.terraform.io/docs/providers/aws/r/autoscaling_group.html#tags ) แต่นี่จะดูแตกต่างจาก syntax ของทรัพยากร terraform อื่น ๆ เล็กน้อย:

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

สิ่งนี้ยังอนุญาตให้สร้างแท็กแบบไดนามิกผ่านการแก้ไข

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.