본문 바로가기

개발하자

테라폼: 수정이 감지된 경우에만 태그를 업데이트하는 방법

반응형

테라폼: 수정이 감지된 경우에만 태그를 업데이트하는 방법

나는 아래와 같은 필드로 내 테라폼 파일에 태그를 구현했다

enter image description here

문제는 내가 내 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())
  }

아마도 우리는 매개 변수에 대한 조건부 항목을 추가할 수 있지만 나는 그것을 어떻게 하는지 모르겠다

모두에게 감사드립니다




태그는 리소스의 특정 버전과 함께 의미 있는 이름을 할당하는 데 사용됩니다. 태그는 리소스를 변경한 경우에도 업데이트되지 않는 특정 저장하기 위해 생성됩니다. 태그는 Azure Porta에서 리소스를 구성하는 데 사용되는 이름과 값 쌍입니다

해당 특정 리소스에 대한 Activi 로그를 더 잘 확인하여 리소스의 마지막 업데이트를 탐지할 수 없습니다.




: 나는 테라폼 클라우드와 같은 원격 환경을 실행하기 위해 사용하는 이 접근 방식에서 문제를 발견했다. 이것은 로컬에서 작동하지만, 적용을 위해 런타임 동안 대상 파일이 생성되는 상황에서 마지막으로 수정된 날짜는 해당 런타임 동안 생성되는 파일을 기반으로 한다.

가장 좋은 방법은 다른 답변에서 제안된 것처럼 태그가 의미 있는 키/값을 갖는 것입니다. 그러나 이것이 요구되는 경우에는 Terraform 데이터 리소스를 사용하여 셸 스크립트를 실행하고 날짜를 캡처하여 Terraform의 태그 값으로 사용하는 방법이 있습니다.

먼저 Terraform 모듈에서 bash 스크립트를 생성합니다:

#!/bin/bash

LASTUPDATED=$(date -r $1)

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 }

결과 출력은 다음과 같습니다:

...

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

요약하면 데이터 리소스는 변경 사항을 추적 중인 대상 파일에 대해 명령을 실행합니다. 우리는 결과를 우리의 테라폼의 데이터 리소스로 사용하여 우리의 태그에 날짜 값을 적용하고 있다.




이것에 관심이 있는 사람이 있는지 확실하지 않다 - 나도 같은 문제가 있었다

첫 번째 실행 시에만 업데이트되거나 선택적으로 포함하는 트리거가 변경될 때 시간 프로비저닝자를 사용할 수 있습니다:

https://registry.terraform.io/providers/hashicorp/time/latest/docs

그래서 너의 것은 다음과 같을 수 있다

resource "time_static" "app_service_A" {
  triggers = {
    # Save the time each update of app service
    app_service = azurerm_app_service_plan.terra_app_plan
  }
}

로컬이 아닌 리소스에 태그를 설정한 경우:

resource "azurerm_app_service_plan" "terra_app_plan" {
  ...
  tags = {
    costcenter  = var.cost_center
    environment = terraform.workspace
    lastupdate  = time_static.app_service_A.rfc3399
  }
}

반응형