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发布之前编写的。从那时起,使用动态嵌套块的支持得到了改善(请参阅下面的答案)。

Answers:


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字段以显示如何生成协同


使每个资源的“名称”唯一的最佳方法是什么?如果使用null标签模块,则资源上的每个“名称”都是相同的。如果要用-private-subnet之类的后缀来命名子网怎么办?null标签有没有办法解决这个问题?
伊扎克·

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.