Terraform v0.11.9 + provider.aws v1.41.0
我想知道是否有一种方法可以更新不是直接在计划中创建而是由计划中的资源创建的资源。该示例使用aws_directory_service_directory
创建托管Active Directory。此过程将创建一个安全组,并且我想向该安全组添加标签。这是我用来创建资源的代码段
resource "aws_directory_service_directory" "NewDS" {
name = "${local.DSFQDN}"
password = "${var.ADPassword}"
size = "Large"
type = "MicrosoftAD"
short_name = "${local.DSShortName}"
vpc_settings {
vpc_id = "${aws_vpc.this.id}"
subnet_ids = ["${aws_subnet.private.0.id}",
"${aws_subnet.private.1.id}",
]
}
tags = "${merge(var.tags, var.ds_tags, map("Name", format("%s", local.VPCname)))}"
}
我可以使用引用新创建的安全组
"${aws_directory_service_directory.NewDS.security_group_id}"
我不能用它来更新资源。我想将目录中所有的标签添加到安全性中,以及更新Name标签。我尝试使用local-exec配置器,但结果不一致,并且在不进行硬编码的情况下将标记映射映射到命令是行不通的。
谢谢
答案 0 :(得分:1)
然后,您可以将aws_ec2_tag
资源与提供者属性ignore_tags
结合使用,该资源也适用于非EC2资源。有关更多详细信息,请参阅我在该主题上所做的another answer。
答案 1 :(得分:0)
我将本地提供者从目录服务资源中移到了虚拟资源中。
resource "null_resource" "ManagedADTags"
{
provisioner "local-exec"
{
command = "aws --profile ${var.profile} --region ${var.region} ec2 create-tags --
resources ${aws_directory_service_directory.NewDS.security_group_id} --tags
Key=Name,Value=${format("${local.security_group_prefix}-%s","ManagedAD")}"
}
}
(command =
是一行)
使用format命令使我可以将整个标签列表发送到资源。 Terraform不会“管理”它,但确实允许我将其作为计划的一部分进行更新。
答案 2 :(得分:0)
aws 已经公开了 api,您可以在其中标记资源而不仅仅是资源。不知道为什么 terraform 没有实现这一点
答案 3 :(得分:-1)
也要打这个。证明标签是从目录服务传播的。因此,如果您适当地标记了目录,则目录服务中的名称标记将应用于安全组。