【问题标题】:Adding tags created to child resources created by terraform将创建的标签添加到由 terraform 创建的子资源
【发布时间】:2019-04-05 23:58:10
【问题描述】:

Terraform v0.11.9 + provider.aws v1.41.0

我想知道是否有办法更新不是直接在计划中创建而是由计划中的资源创建的资源。该示例使用 aws_directory_service_directory 创建托管 Active Directory 此过程创建一个安全组,我想将标签添加到安全组。这是我用来创建资源的 sn-p

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

我不能用它来更新资源。我想将目录上的所有标签添加到安全性,以及更新名称标签。我尝试使用 local-exec 配置程序,但结果不一致,并且在没有硬编码的情况下将标签映射到命令并不起作用。

谢谢

【问题讨论】:

  • 这很难! TF 不能直接设置标签,因为它不是创建资源本身。我觉得使用 local-exec provisioner 还是有希望的;你能扩展一下你在那里尝试过的东西吗?
  • 所以我尝试了本地提供商,现在似乎可以正常工作了。我将本地提供者从目录服务资源中移出并移到了一个虚拟资源中。 [代码] 资源 "null_resource" "ManagedADTags" { 供应商 "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")}" } } [code] 使用 format 命令允许我发送资源标签的完整列表。
  • 太棒了!如果该解决方案对您有用,您可以将其作为答案发布,甚至在 48 小时后接受。

标签: terraform terraform-provider-aws


【解决方案1】:

我将本地提供程序从目录服务资源中移出并移到了一个虚拟资源中。

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】:

    也只需点击它即可。原来标签是从目录服务传播的。因此,如果您适当地标记目录,则目录服务中的名称标记将应用于安全组。

    【讨论】:

      【解决方案3】:

      然后,您可以将aws_ec2_tag 资源与提供程序属性ignore_tags 结合使用,该资源也适用于非ec2 资源。更多详情请参考我做的another answer这个话题。

      【讨论】:

        【解决方案4】:

        aws 已经公开了 api,您可以在其中标记资源而不仅仅是资源。不知道为什么 terraform 没有实现它

        【讨论】:

          猜你喜欢
          • 2021-01-22
          • 2020-11-07
          • 2019-03-19
          • 1970-01-01
          • 1970-01-01
          • 2021-01-21
          • 2019-12-16
          • 2021-03-13
          • 2022-07-24
          相关资源
          最近更新 更多