terraform_remote_state 데이터 소스

terraform_remote_state 데이터 소스

terraform_remote_state 데이터 소스는 지정된 state 백엔드의 최신 state 스냅샷을 사용해서, 다른 테라폼 구성의 루트 모듈 출력 값을 가져오는 데이터 소스예요.

출처: 문서

본문

terraform_remote_state 데이터 소스는 프로바이더를 요구하거나 구성하지 않고도 사용할 수 있어요. source addressterraform.io/builtin/terraform인 내장 프로바이더를 통해 항상 사용할 수 있어요. 그 프로바이더는 다른 리소스나 데이터 소스를 포함하지 않아요.

중요: HCP Terraform이나 Terraform Enterprise에서 원격 state 출력에 접근할 때는 HCP Terraform/Enterprise Providertfe_outputs 데이터 소스를 사용하는 것을 권장해요. tfe_outputs 데이터 소스는 출력을 가져오기 위해 워크스페이스 state에 대한 전체 접근을 요구하지 않아서 더 안전해요.

구성 간 데이터 공유의 대안

루트 모듈 출력으로 데이터를 공유하는 것은 편리하지만 단점이 있어요. terraform_remote_state는 출력 값만 노출하지만, 그 사용자는 종종 민감한 정보를 포함하는 전체 state 스냅샷에 대한 접근 권한을 가져야 해요.

가능하다면 외부 소비를 위한 데이터를 원격 state를 통한 접근 대신 별도의 위치에 명시적으로 게시하는 것을 권장해요. 이렇게 하면 공유 정보와 state 스냅샷에 각각 다른 접근 제어를 적용할 수 있어요.

구성 간에 데이터를 명시적으로 공유하려면 다양한 프로바이더의 관리 리소스 타입과 데이터 소스 쌍을 사용할 수 있어요. 그중 일부는 다음과 같아요.

시스템 게시 (Publish with...) 읽기 (Read with...)
Alibaba Cloud DNS (IP 주소와 호스트명용) alicloud_alidns_record 리소스 타입 일반 DNS 조회, 또는 dns 프로바이더
Amazon Route53 (IP 주소와 호스트명용) aws_route53_record 리소스 타입 일반 DNS 조회, 또는 dns 프로바이더
Amazon S3 aws_s3_object 리소스 타입 aws_s3_object 데이터 소스
Amazon SSM Parameter Store aws_ssm_parameter 리소스 타입 aws_ssm_parameter 데이터 소스
Azure Automation azurerm_automation_variable_string 리소스 타입 azurerm_automation_variable_string 데이터 소스
Azure DNS (IP 주소와 호스트명용) azurerm_dns_a_record 리소스 타입 등 일반 DNS 조회, 또는 dns 프로바이더
Google Cloud DNS (IP 주소와 호스트명용) google_dns_record_set 리소스 타입 일반 DNS 조회, 또는 dns 프로바이더
Google Cloud Storage google_storage_bucket_object 리소스 타입 google_storage_bucket_object 데이터 소스와 http 데이터 소스
HashiCorp Consul consul_key_prefix 리소스 타입 consul_key_prefix 데이터 소스
HashiCorp HCP Terraform 일반 outputs terraform 블록 tfe_outputs 데이터 소스
Kubernetes kubernetes_config_map 리소스 타입 kubernetes_config_map 데이터 소스
OCI Object Storage oci_objectstorage_bucket 리소스 타입 oci_objectstorage_bucket 데이터 소스

이것들은 공식 테라폼 프로바이더의 흔한 옵션들이에요. 하지만 구성 저장소 옵션이 너무 많아서 여기에 모두 나열할 수는 없으며, 파트너·커뮤니티 프로바이더에도 있어요. 관리 리소스 타입과 대응하는 데이터 소스의 어떤 쌍이든 테라폼 구성 간 데이터 공유에 잠재적으로 사용될 수 있어요. 다른 가능성을 찾으려면 개별 프로바이더 문서를 참고하세요.

terraform_remote_state 대신 별도의 명시적 구성 저장소를 사용하는 핵심 장점은, 그 데이터가 컴퓨팅 인스턴스 안의 구성 관리·스케줄러 시스템 같은 테라폼 이외의 시스템에서도 읽힐 수 있다는 점이에요. 그래서 다른 인프라가 잠재적으로 활용할 수 있는 구성 저장소를 선택하는 것을 권장해요. 예를 들어:

  • IP 주소와 호스트명을 공유하고 싶다면, 그것들을 프라이빗 DNS 영역의 일반 DNS A, AAAA, CNAME, SRV 레코드로 게시한 다음 다른 인프라가 그 영역을 참조하도록 구성해서, 시스템의 내장 DNS 해석기로 인프라 객체를 찾게 할 수 있어요.
  • HashiCorp Consul을 사용한다면, 데이터를 Consul 키/값 저장소나 Consul 서비스 카탈로그에 게시해서 그 데이터를 Consul Template이나 HashiCorp Nomad template 스탠자(stanza)로도 접근 가능하게 할 수 있어요.
  • Kubernetes를 사용한다면 Config Map을 Pod에 제공할 수 있어요.

위에 나열된 데이터 저장소 중 일부는 작은 구성 값을 저장하도록 특별히 설계된 반면, 다른 것들은 일반적인 blob 저장 시스템이에요. 일반적인 시스템의 경우 jsonencode 함수jsondecode 함수를 각각 사용해 구조화된 데이터를 저장하고 가져올 수 있어요.

게시된 구성 데이터를 가져오는 구현 세부 사항은 필요한 데이터 소스 구성과 JSON 디코딩 같은 사후 처리를 담은 데이터 전용 모듈(data-only module)을 작성해서 캡슐화할 수 있어요. 나중에 여러 테라폼 구성 간 데이터 공유 전략을 바꾸면 그 모듈을 변경하면 돼요.

사용 예제 (remote 백엔드)

data "terraform_remote_state" "vpc" {
  backend = "remote"

  config = {
    organization = "hashicorp"
    workspaces = {
      name = "vpc-prod"
    }
  }
}

# Terraform >= 0.12
resource "aws_instance" "foo" {
  # ...
  subnet_id = data.terraform_remote_state.vpc.outputs.subnet_id
}

# Terraform <= 0.11
resource "aws_instance" "foo" {
  # ...
  subnet_id = "${data.terraform_remote_state.vpc.subnet_id}"
}

사용 예제 (local 백엔드)

data "terraform_remote_state" "vpc" {
  backend = "local"

  config = {
    path = "..."
  }
}

# Terraform >= 0.12
resource "aws_instance" "foo" {
  # ...
  subnet_id = data.terraform_remote_state.vpc.outputs.subnet_id
}

# Terraform <= 0.11
resource "aws_instance" "foo" {
  # ...
  subnet_id = "${data.terraform_remote_state.vpc.subnet_id}"
}

인자 레퍼런스 (Argument Reference)

다음 인자들이 지원돼요.

  • backend - (필수) 사용할 원격 백엔드.
  • workspace - (선택) 백엔드가 워크스페이스를 지원한다면, 사용할 테라폼 워크스페이스.
  • config - (선택, 객체) 원격 백엔드의 구성. 이 인자는 선택으로 나열되지만 대부분의 백엔드는 어느 정도 구성이 필요해요.

config 객체는 동등한 terraform { backend "<TYPE>" { ... } } 블록에서 유효한 인자를 무엇이든 사용할 수 있어요. 자세한 내용은 선택한 백엔드의 문서를 참고하세요.

참고: 백엔드 구성이 중첩 블록을 요구한다면, 여기서는 정상 속성으로 객체 값을 지정하세요. (예: workspaces { ... } 대신 workspaces = { ... }.)

  • defaults - (선택, 객체) state 파일이 비어 있거나 필요한 출력이 없을 경우를 위한 출력의 기본값.

속성 레퍼런스 (Attributes Reference)

위 사항 외에도 다음 속성이 내보내져요.

  • (v0.12+) outputs - 원격 state의 모든 루트 레벨 출력을 담은 객체.
  • (<= v0.11) <OUTPUT NAME> - 원격 state의 각 루트 레벨 출력이 데이터 소스의 최상위 속성으로 나타나요.

루트 출력만 해당 (Root Outputs Only)

원격 state 스냅샷에서 루트 레벨 출력 값만 모듈의 다른 곳에서 사용하도록 노출돼요. 중첩 모듈의 리소스 데이터와 출력 값은 접근할 수 없어요.

중첩 모듈의 출력 값을 루트 모듈 출력 값으로 접근 가능하게 만들고 싶다면, 루트 모듈에서 패스스루(passthrough)를 명시적으로 구성해야 해요. 예:

module "app" {
  source = "..."
}

output "app_value" {
  # This syntax is for Terraform 0.12 or later.
  value = module.app.example
}

이 예제에서 "app" 모듈의 example이라는 출력 값은 루트 모듈 출력 값 app_value로 사용할 수 있어요. 이 구성에 output "app_value" 블록이 없다면 그 데이터는 terraform_remote_state로 접근할 수 없어요.

경고: terraform_remote_state는 구성에서 사용할 다른 state 스냅샷 정보는 노출하지 않지만, state 스냅샷 데이터는 단일 객체예요. 그래서 루트 모듈 출력 값을 읽을 수 있는 충분한 접근 권한을 가진 사용자나 서버는 항상 직접 네트워크 요청으로 전체 state 스냅샷 데이터에도 접근할 수 있어요. 구성의 리소스 중 어느 것이라도 민감하다고 생각하는 데이터를 다룬다면 terraform_remote_state를 사용하지 마세요.

더 알아보기 (Learn more)