13일 차: Terraform 데이터 소스

발행: (2025년 12월 8일 오전 02:34 GMT+9)
4 min read
원문: Dev.to

Source: Dev.to

데이터 소스

데이터 소스를 전화번호부에 비유하면, 사용자 이름과 전화번호가 키‑값 쌍으로 API를 통해 접근되는 형태입니다. 값을 하드코딩하는 대신 키를 이용해 값을 가져올 수 있습니다.

요약하면, AWS용 Terraform 데이터 소스는 기존 AWS 리소스나 외부 데이터를 조회하여 Terraform 구성 내에서 참조할 수 있게 해줍니다.

예시: EC2 인스턴스를 만들 때 AMI ID가 필요합니다. 최신 Amazon Linux 2 AMI를 직접 찾아보는 대신, 데이터 소스를 사용해 AMI ID를 자동으로 가져올 수 있습니다.

데이터 소스는 Terraform이 기존 인프라에 대한 읽기 작업을 할 수 있게 합니다. 데이터 소스는:

  • 리소스를 생성, 업데이트, 삭제하지 않음
  • 다른 곳에서 관리되는 리소스를 참조할 수 있음
  • 팀 간 인프라 공유를 가능하게 함
  • resource 블록이 아니라 data 블록으로 정의됨

Data source illustration

AWS 데이터 소스 사용 방법

Terraform 구성 파일에서 data 블록을 사용해 데이터 소스를 정의합니다:

data "provider_type" "name" {
  # 데이터 소스를 필터링하거나 식별하기 위한 설정
}
  • provider_type – AWS 데이터 소스 유형 (예: aws_ami, aws_vpc, aws_s3_bucket).
  • name – 데이터 소스를 참조하기 위한 로컬 식별자.
  • Configuration settings – 데이터 소스마다 다르며 보통 id, name 또는 filter 블록(namevalues 인수 포함)을 포함합니다.

예시: Data 블록 vs. Resource 블록

# Resource Block – Terraform이 이를 **관리**합니다
resource "aws_vpc" "my_vpc" {
  cidr_block = "10.0.0.0/16"
}

# Data Block – Terraform이 이를 **읽기**만 합니다
data "aws_vpc" "existing_vpc" {
  filter {
    name   = "tag:Name"
    values = ["shared-network-vpc"]
  }
}

Resource 블록에서는 Terraform이 VPC를 생성하고 관리합니다. Data 블록에서는 Terraform이 제공된 필터와 일치하는 기존 VPC에 대한 정보만 읽어옵니다.

과제

Terraform으로 VPC를 만든 뒤, 데이터 소스를 사용해 AMI ID를 가져오고 해당 VPC 안에 EC2 인스턴스를 배포하세요.

Task illustration

VPC 생성

# 다른 팀이 만든 시뮬레이션 인프라
provider "aws" {
  region = "us-east-1"
}

resource "aws_vpc" "shared" {
  cidr_block = "10.0.0.0/16"
  tags = {
    Name = "shared-network-vpc"
  }
}

resource "aws_subnet" "shared" {
  vpc_id     = aws_vpc.shared.id
  cidr_block = "10.0.1.0/24"
  tags = {
    Name = "shared-primary-subnet"  # ← 이 태그가 중요합니다!
  }
}

Terraform이 수행할 작업을 확인하려면 다음을 실행합니다:

terraform plan

전형적인 출력 (간략히 표시):

# aws_subnet.shared will be created
+ resource "aws_subnet" "shared" {
    + cidr_block = "10.0.1.0/24"
    + tags = {
        + "Name" = "shared-primary-subnet"
      }
    + vpc_id = (known after apply)
  }

# aws_vpc.shared will be created
+ resource "aws_vpc" "shared" {
    + cidr_block = "10.0.0.0/16"
    + enable_dns_support = true
    + tags = {
        + "Name" = "shared-network-vpc"
      }
  }
Back to Blog

관련 글

더 보기 »

Terraform 데이터 소스 (AWS)

Terraform 데이터 소스란 무엇인가요? 데이터 소스는 Terraform에서 기존 리소스를 읽기 전용으로 조회하는 기능입니다. 새로운 리소스를 생성하는 대신, Terraform은 ...

Day-13: Terraform의 데이터 소스

Data Sources란 무엇인가요? 데이터 소스를 사용하면 기존 VPC, 서브넷, AMI, 보안 그룹 등과 같은 정보를 가져올 수 있습니다. hcl data 'data_source_type' 'dat...