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 #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
},
]
这还允许通过插值动态构建标签。
评论
使每个资源的“名称”唯一的最佳方法是什么?如果使用空标签模块,则资源上的每个“名称”都是相同的。如果要用-private-subnet之类的后缀来命名子网怎么办? null标签有没有办法解决这个问题?
–伊扎克
19-6-27在15:27