[DevOps/Terraform/T1013] 2주차 - 기본 사용 2/3 (data)
✅ 이 블로깅은 테라폼으로 시작하는 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를 가져올 수 있다.
이 문서에서 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"
}
순서대로 “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를 통해서 불러온 정보를 확인할 때 유용하다!