要将多个标签附加到一个资源,我目前使用多个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发布之前编写的。从那时起,动态嵌套块的支持得到了改善(请参见下面的答案)。

#1 楼

对于auto-scaling-group,这是可用的最简洁的语法。

对于大多数其他资源,请使用如下所示的tags语法:

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


#2 楼

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


#3 楼

另一个选择是使用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

评论


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

–伊扎克
19-6-27在15:27



#4 楼

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


这还允许通过插值动态构建标签。