지형 : 리소스에 여러 태그를 지정하는 간결한 구문이 있습니까?


10

리소스에 여러 태그를 첨부하기 위해 현재 여러 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가 나오기 전에 작성되었습니다. 그 이후로 Dynamic Nested Blocks (아래 내 답변 참조 )로 지원이 향상되었습니다 .

답변:


7

이를 위해 auto-scaling-group이것은 가장 간결한 구문입니다.

대부분의 다른 리소스 tags에는 다음과 같은 구문을 사용합니다 .

tags {
  Key1 = "value1"
  Key2 = "value2"
}

3

Terraform v0.12는 Dynamic Nested Blocks에 대한 지원을 추가했습니다. 다음 예제는 새로운 기능에 대한 블로그 게시물 에서 파생 된 것입니다 (섹션 동적 중첩 블록 참조 ).

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

2

다른 옵션은 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 공동 생성 방법을 보여주기 위해 필드를 추가했습니다.


각 리소스에 "이름"을 사용하지 않는 가장 좋은 방법은 무엇입니까? 널 레이블 모듈을 사용하는 경우 자원의 모든 "이름"이 동일합니다. 서브넷의 이름을 -private-subnet과 같은 접미사로 지정하려면 어떻게합니까? 널 레이블이 처리 할 수있는 방법이 있습니까?
Izac

0

(가) aws_autoscaling_group현재 태그 목록을 지원 ( https://www.terraform.io/docs/providers/aws/r/autoscaling_group.html#tags ). 그러나 이것은 다른 terraform 리소스의 구문과 약간 다르게 보입니다.

tags = [
  {
    key                 = "explicit1"
    value               = "value1"
    propagate_at_launch = true
  },
  {
    key                 = "explicit2"
    value               = "value2"
    propagate_at_launch = true
  },
]

또한 보간을 통해 동적으로 태그를 작성할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.