Terraform

[ Terraform101 Study - 2w ] 데이터소스

su''@ 2024. 6. 23. 06:25
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"
}