Terrafrom T101 4기 실습 스터디 게시글입니다.
"테라폼으로 시작하는 IaC" 도서를 참고하여 정리했습니다.
데이터 소스는 테라폼으로 정의되지 않은 외부 리소스 또는 저장된 정보를 테라폼 내에서 참조할 때 사용한다
- 데이터 소스 구성
- 신규 디렉터리 생성 후 열기 → main.tf 파일 생성
mkdir 3.5 && cd 3.5 touch main.tf
- 데이터 소스 블록은 data 로 시작, 이후 ‘데이터 소스 유형’을 정의 ← Resource 블록 정의와 유사
- 데이터 소스 유형은 첫 번째 _를 기준으로 앞은 프로바이더 이름, 뒤는 프로바이더에서 제공하는 리소스 유형을 의미한다.
- 데이터 소스 유형을 선언한 뒤에는 고유한 이름을 붙인다. 리소스의 이름과 마찬가지로 이름은 동일한 유형에 대한 식별자 역할을 하므로 중복될 수 없다.
- 이름 뒤에는 데이터 소스 유형에 대한 구성 인수들은 { } 안에 선언한다. 인수가 필요하지 않은 유형도 있지만, 그때에도 { } 는 입력한다
data "local_file" "abc" { filename = "${path.module}/abc.txt" }
- 데이터 소스를 정의할 때 사용 가능한 메타인수는 다음과 같다.
- depends_on : 종속성을 선언하며, 선언된 구성요소와의 생성 시점에 대해 정의
- count : 선언된 개수에 따라 여러 리소스를 생성
- for_each : map 또는 set 타입의 데이터 배열의 값을 기준으로 여러 리소스를 생성
- lifecycle : 리소스의 수명주기 관리
- 실습 확인
# 실습 확인을 위해서 abc.txt 파일 생성 echo "t101 study - 2week" > abc.txt # terraform init && terraform plan && terraform apply -auto-approve terraform state list **** # 테라폼 콘솔 : 데이터 소스 참조 확인 terraform console > data.local_file.abc ... data.local_file.abc.filename data.local_file.abc.content data.local_file.abc.id exit
- Terraform console을 사용해 선언된 데이터 소스에서 얻고자 하는 데이터를 확인할 수 있다.
- 데이터 소스로 읽은 대상을 참조하는 방식은 리소스와 구별되게 data가 앞에 붙는다. 속성 값은 다음과 같이 접근할 수 있다.
# Terraform Code
data "<리소스 유형>" "<이름>" {
<인수> = <값>
}
# 데이터 소스 참조
data.<리소스 유형>.<이름>.<속성>
- 코드 예시 : 데이터 소스를 활용해 AWS 가용영역 인수를 정의 → 리전 내에서 사용 가능한 가용영역 목록 가져오기 - specitic 한 값을 입력하는게 아니라 데이터 소스 참조해 data를 가지고 온다.
# 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
}
- 아래 문서에서 데이터 소스로 가져오기 위한 조건인 인수는 Argument로 표현되어 있고, 가져온 데이터 소스의 내용은 Attributes에 안내되어 있다.
Terraform Registry
registry.terraform.io
- 예시 코드 확인 - AZ datasource
- main.tf 파일 코드 수정
data "aws_availability_zones" "seoul" { state = "available" }
- 확인
# terraform init -upgrade && terraform plan && terraform apply -auto-approve terraform state list terraform state show data.aws_availability_zones.seoul # data.aws_availability_zones.seoul: data "aws_availability_zones" "seoul" { group_names = [ "ap-northeast-2", ] id = "ap-northeast-2" names = [ "ap-northeast-2a", "ap-northeast-2b", "ap-northeast-2c", "ap-northeast-2d", ] state = "available" zone_ids = [ "apne2-az1", "apne2-az2", "apne2-az3", "apne2-az4", ] } # 테라폼 콘솔 : 데이터 소스 참조 확인 terraform console > data.aws_availability_zones.seoul ... data.aws_availability_zones.seoul.id data.aws_availability_zones.seoul.names data.aws_availability_zones.seoul.zone_ids exit # Tip. terraform console 값 echo로 확인 echo "data.aws_availability_zones.seoul" | terraform console echo "data.aws_availability_zones.seoul.names" | terraform console echo "data.aws_availability_zones.seoul.names[0]" | terraform console echo "data.aws_availability_zones.seoul.names[1]" | terraform console echo "data.aws_availability_zones.seoul.zone_ids[0]" | terraform console
- main.tf 파일 코드 수정
resource "local_file" "abc" { # local_file = provider
content = "abc!"
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"
}
'Terraform' 카테고리의 다른 글
[ Terraform101 Study - 2w ] Count 실습 (0) | 2024.06.23 |
---|---|
[ Terraform101 Study - 2w] VPC + 보안그룹 + EC2 배포 실습 (0) | 2024.06.23 |
[ Terraform101 Study - 2w ] 반복문(1) (0) | 2024.06.23 |
[ Terraform101 Study - 2w ] 입력변수 variable (0) | 2024.06.23 |
[ Terraform 101 Study - 1w ] 기본사용 (0) | 2024.06.13 |