✅ 이 블로깅은 테라폼으로 시작하는 IaC 책을 기반으로 작성한다.

데이터 소스는 테라폼으로 정의되지 않은 외부 리소스 또는 저장된 정보를 테라폼 내에서 참조할 때 사용한다.

데이터 소스 구성

데이터 소스 블록은 data로 시작한다.

소스 유형은 “프로바이더_리소스(= local_file)” 유형으로 선언하고 고유한 이름(= abc)을 붙인다.

data "local_file" "abc" {
  filename = "${path.module}/abc.txt"
}

데이터 소스를 정의할 때 사용 가능한 메타인수는 다음과 같다.

  • depends_on : 종속성을 선언하며, 선언된 구성요소와의 생성 시점에 대해 정의
  • count : 선언된 개수에 따라 여러 리소스를 생성
  • for_each : map 또는 set 타입의 데이터 배열의 값을 기준으로 여러 리소스를 생성
  • lifecycle : 리소스의 수명주기 관리

데이터 소스 속성 참조

데이터 소스로 읽은 대상을 참조하려면 앞에 data를 붙여야 한다.

# Terraform Code
data "<리소스 유형>" "<이름>" {
  <인수> = <값>
}

# 데이터 소스 참조
data.<리소스 유형>.<이름>.<속성>

예제 1

아래와 같이 AWS 프로바이더를 사용하여 region 내에 사용 가능한 AZ를 가져올 수 있다.

참고문서 ) Terraform Registry

이 문서에서 Arguments는 데이터 소스로 가져오기 위한 조건인 인수이고, Attributes는 가져온 데이터 소스의 내용이다.

# Declare the data source
data "aws_availability_zones" "available" {
  state = "available"
}
resource "aws_subnet" "primary" {
  availability_zone = data.aws_availability_zones.available.names[0]
  # e.g. ap-northeast-2a
}
resource "aws_subnet" "secondary" {
  availability_zone = data.aws_availability_zones.available.names[1]
  # e.g. ap-northeast-2b
}

그러나 이는 에러가 발생하게 되는데!

이는 추가로 과제로써 포스팅을 작성하였다!

[DevOps/Terraform/T1013] 2주차 도전과제1: VPC 리소스 생성 실습

예제 2

resource "local_file" "abc" {
  content  = "123!"
  filename = "${path.module}/abc.txt"
}

data "local_file" "abc" {
  filename = local_file.abc.filename
}

resource "local_file" "def" {
  content  = data.local_file.abc.content
  filename = "${path.module}/def.txt"
}

Untitled

순서대로 “abc.txt 파일 생성 → abc.txt 파일 참조 → def.txt 파일 생성” 으로 진행된다.

$ terraform state list 
	data.local_file.abc
	local_file.abc
	local_file.def

테라폼 state 내에 리소스 리스트이다.

diff abc.txt def.txt 명령어로 확인해 보면 아무 것도 출력되는 것이 없어서 두 파일이 같다는 것을 알 수 있다.

$ echo "data.local_file.abc.content" | terraform console
	"123!"

또는 state list에 있는 리소스를 테라폼 콘솔을 통해 값도 확인 가능하다! terraform console 명령은 실제 data source를 통해서 불러온 정보를 확인할 때 유용하다!

Categories:

Updated:

Leave a comment