Terraform:我们如何才能仅在检测到修改时更新标签

Terraform: how can we update a tag only if modification is detected

我在我的 terraform 文件中实现了带有字段 Lastupdate 的标签,如下所示

问题是每当我应用我的 tf 文件时,这个字段总是更新,即使没有变化。我希望仅在检测到更改时才更新此标签。

你知道我怎样才能做到这一点吗?

我的代码看起来像

resource "azurerm_app_service_plan" "terra_app_plan" {
  resource_group_name = azurerm_resource_group.terra_resource_group.name
  location            = azurerm_resource_group.terra_resource_group.location
  name                = local.app_serviceplan_name

  sku {
    size = var.app_serviceplan_size
    tier = var.app_serviceplan_tiers
  }
  tags = local.common_tags
}

还有这里

locals {
  common_tags = {
    costcenter  = var.cost_center
    environment = terraform.workspace
    lastupdate  = formatdate("DD-MMM-YY hh:mm:ss ZZZ", timestamp())
  }

也许我们可以为参数 lastupdate 添加一个条件项,但我不知道该怎么做

感谢大家

标签用于为您的资源的特定版本分配一个有意义的名称。标记是为特定保存创建的,即使您对资源进行了更改,它也不会更新。 重要的是,标记是 name-value 对,用于在 Azure Porta 中组织资源

无法通过 tag 检测资源中的最后更新,最好检查该特定资源的 Activiy 日志。

EDIT/CAUTION:我发现这种使用远程环境执行的方法存在问题,例如 Terraform Cloud。这在本地有效,但在目标文件在 运行 申请时间期间创建的情况下,最后修改日期基于在该 运行 时间期间创建的文件。

最佳做法是让标签有意义 key/values,如其他答案中所建议的那样。但是,如果您遇到此要求,一种方法是使用 Terraform external 数据资源来 运行 一个 shell 脚本,捕获日期,然后在您的 Terraform 中使用它作为您的标签的价值。

首先,在 Terraform 模块中创建一个 bash 脚本:

#!/bin/bash

LASTUPDATED=$(date -r )

echo '{"lastupdated":"'$LASTUPDATED'"}' | jq .

然后,在您的 Terraform 中,您可以使用结果来应用您的标签:

# so_71645084.tf
variable "costcenter" { default = "foo" }

data "external" "file_last_updated" {
  program = ["bash", "${path.module}/so_71645084.sh", "${path.module}/so_71645084.tf"]
}

locals {
  common_tags = {
    costcenter  = var.costcenter
    environment = terraform.workspace
    lastupdate  = data.external.file_last_updated.result.lastupdated
  }
}

output "common_tags" { value = local.common_tags }

您的 common_tags 输出将是:

...

 + costcenter  = "foo"
 + environment = "dev"
 + lastupdate  = "Mon Mar 28 13:32:15 UTC 2022"

总而言之,external 数据资源 运行 是针对您正在跟踪更改的目标文件的 date 命令。我们将结果用作 Terraform 中的数据资源,以将日期值应用于我们的标签。