리소스 주소(Resource Address) 참조

리소스 주소(Resource Address) 참조

이 문서는 Terraform의 리소스 주소(resource address)에 대한 참조 정보를 설명해요. 리소스 주소는 특정 리소스 인스턴스를 식별하는 핵심 개념으로, terraform apply -replaceterraform state mv 같은 명령에서 자주 사용돼요.

출처: 문서

본문

구문 (Syntax)

리소스 주소는 전체 구성에서 0개 이상의 리소스 인스턴스를 식별하는 문자열이에요.

주소는 두 부분으로 이루어져 있어요.

[module path][resource spec]

어떤 상황에서는 Terraform이 모듈 전체만 가리키거나 다중 인스턴스 리소스의 인덱스를 생략한 불완전한 리소스 주소를 허용하기도 해요. 그런 경우 의미는 상황에 따라 달라지므로, 리소스 주소를 파싱하는 특정 기능의 문서를 참고해야 해요.

모듈 경로 (Module path)

모듈 경로는 모듈 트리 안의 모듈을 주소로 지정해요. 형식은 다음과 같아요.

module.module_name[module index]
  • module - 하위 모듈(비루트)을 나타내는 모듈 키워드. 경로에 여러 module 키워드가 있으면 중첩을 나타내요.
  • module_name - 사용자가 정의한 모듈 이름.
  • [module index] - (선택) 여러 인스턴스를 가진 모듈 호출에서 인스턴스를 선택하는 인덱스. 대괄호 문자([])로 둘러싸여 있어요.

리소스 스펙이 없는 주소, 즉 module.foo는 단일 모듈이라면 모듈 안의 모든 리소스에 적용되거나, 모듈이 여러 인스턴스를 가진다면 모듈의 모든 인스턴스에 적용돼요. 특정 모듈 인스턴스의 모든 리소스를 주소로 지정하려면 module.foo[0]처럼 모듈 인덱스를 주소에 포함해요.

모듈 경로를 생략하면 주소는 루트 모듈에 적용돼요.

module 키워드가 여러 인스턴스를 가진 두 모듈을 구분하는 예시:

module.foo[0].module.bar["a"]

모듈 인덱스는 Terraform v0.13 이상의 모듈에만 적용돼요. 이전 버전의 Terraform에서 모듈은 여러 인스턴스를 가질 수 없었어요.

리소스 스펙 (Resource spec)

리소스 스펙은 선택한 모듈의 특정 리소스 인스턴스를 주소로 지정해요. 구문은 다음과 같아요.

resource_type.resource_name[instance index]
  • resource_type - 주소를 지정하는 리소스의 유형.
  • resource_name - 사용자가 정의한 리소스 이름.
  • [instance index] - (선택) 여러 인스턴스를 가진 리소스에서 인스턴스를 선택하는 인덱스. 대괄호 문자([])로 둘러싸여 있어요.

Terraform v0.12 이상에서 모듈 경로 접두사가 없는 리소스 스펙은 루트 모듈의 리소스와만 일치해요. 이전 버전에서는 모듈 경로 접두사가 없는 리소스 스펙이 모든 하위 모듈에서 동일한 유형과 이름의 리소스와 일치했어요.

모듈과 리소스의 인덱스 값 (Index values for Modules and Resources)

다음 규칙은 여러 인스턴스를 가진 모듈과 리소스의 인덱스 값에 적용돼요.

  • [N] - count 메타 인자로 지정된 여러 인스턴스를 가진 리소스에 대한 0 기반 숫자 인덱스. count > 1인 리소스를 주소로 지정할 때 인덱스를 생략하면 모든 인스턴스를 참조한다는 의미예요.
  • ["INDEX"] - for_each 메타 인자로 지정된 여러 인스턴스를 가진 리소스에 대한 영숫자 키 인덱스.

예시 (Examples)

count 예시

다음과 같은 Terraform 구성을 가정해요.

resource "aws_instance" "web" {
  # ...
  count = 4
}

이런 주소:

aws_instance.web[3]

구성에서 마지막 인스턴스만 가리키며, 이런 주소:

aws_instance.web

네 개의 "web" 인스턴스 모두를 가리켜요.

for_each 예시

다음과 같은 Terraform 구성을 가정해요.

resource "aws_instance" "web" {
  # ...
  for_each = tomap({
    "terraform": "value1",
    "resource":  "value2",
    "indexing":  "value3",
    "example":   "value4",
  })
}

이런 주소:

aws_instance.web["example"]

구성의 "example" 인스턴스만 가리키며, "value4"로 해석돼요.

더 알아보기 (Learn more)

  • terraform state mv 명령
  • terraform apply -replace 옵션
  • count 메타 인자 문서
  • for_each 메타 인자 문서