Lim Seunghyun Space

[T102] Data Source 본문

IaC/Terraform

[T102] Data Source

Lim Seung Hyun 2023. 7. 15. 15:05

Data source

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

 

Data Source 구성

  • 'data'로 시작되며 이후에 '데이터 소스 유형'을 정의
data "<리소스 유형>" "<이름>" {
	<인수> = <값>
}

# Data source 예시
data "local_file" "abc" {
	filename = "${path.module}/test.txt"
}
  • 데이터 소스 유형은 '_'(Under score)를 기준으로 앞은 provider name, 뒤는 resouce type을 나타낸다.
    • 위의 예시에서는 provider name: local, resource type: file
  • 데이터 소스 유형 뒤에는 고유한 이름이 오며, 다른 데이터 소스 유형과 중복이 될 수 없다.
  • 데이터 소스 내용은 { } 안에 선언된다.

메타인수 목록

  • 데이터 소스를 정의할 때 사용 가능한 메타인수
    • depends_on: 종속성을 선언하며, 선언된 구성요소와의 생성 시점에 대해 정의
    • count: 선언된 개수에 따라 여러 데이터 소스를 선언
    • for_each: map 또는 set 타입의 데이터 배열의 값을 기준으로 여러 리소스를 생성
    • provider: 동일한 프로바이더가 다수 정의되어 있는 경우 지정
    • lifecycle: 데이터 소스의 수명주기 관리

 

데이터 소스 속성 참조

  • 리소스처럼 데이터 소스를 참조할 수 있으며 구별되게 'data'가 붙는다.
data "<리소스 유형>" "<이름"> {
	<인수> = <값>
}

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

참조 예제

  • main.tf
    • aws_availability_zones, aws_vpc를 사용해서 default VPC내 subnet 생성하기
data "aws_availability_zones" "available" {
    state = "available"
}

data "aws_vpc" "default" {
    default = true
}

resource "aws_subnet" "primary" {
    vpc_id = data.aws_vpc.default.id
    availability_zone = data.aws_availability_zones.available.names[0]
    cidr_block = "172.31.100.0/24" # Your CIDR Block

    tags = {
        Name = "primary"
    }
}

resource "aws_subnet" "secondary" {
    vpc_id = data.aws_vpc.default.id
    availability_zone = data.aws_availability_zones.available.names[0]
    cidr_block = "172.31.101.0/24" # Your CIDR Block

    tags = {
        Name = "secondary"
    }
}
  • terraform init && terraform plan && terraform apply -auto-approve
  • terraform console에서 data source 확인하기
terraform console
> data.aws_availability_zones.available
'''
{
  "all_availability_zones" = tobool(null)
  "exclude_names" = toset(null) /* of string */
  "exclude_zone_ids" = toset(null) /* of string */
  "filter" = toset(null) /* of object */
  "group_names" = toset([
    "ap-northeast-2",
  ])
  "id" = "ap-northeast-2"
  "names" = tolist([
    "ap-northeast-2a",
    "ap-northeast-2b",
    "ap-northeast-2c",
    "ap-northeast-2d",
  ])
... 
'''
> data.aws_vpc.default
'''
{
  "arn" = ...
  "cidr_block" = "172.31.0.0/16"
  "cidr_block_associations" = tolist([
    {
      "association_id" = ...
      "cidr_block" = "172.31.0.0/16"
      "state" = "associated"
    },
  ])
'''
  • Terraform Graph

Subnet 생성

728x90

'IaC > Terraform' 카테고리의 다른 글

[T102] 반복문  (0) 2023.07.16
[T102] Output  (0) 2023.07.16
[T102] Local  (0) 2023.07.16
[T102] Variable  (0) 2023.07.16
[T102] Terraform 설치 및 튜토리얼  (0) 2023.07.09