13일 차: Terraform 데이터 소스
Source: Dev.to
데이터 소스
데이터 소스를 전화번호부에 비유하면, 사용자 이름과 전화번호가 키‑값 쌍으로 API를 통해 접근되는 형태입니다. 값을 하드코딩하는 대신 키를 이용해 값을 가져올 수 있습니다.
요약하면, AWS용 Terraform 데이터 소스는 기존 AWS 리소스나 외부 데이터를 조회하여 Terraform 구성 내에서 참조할 수 있게 해줍니다.
예시: EC2 인스턴스를 만들 때 AMI ID가 필요합니다. 최신 Amazon Linux 2 AMI를 직접 찾아보는 대신, 데이터 소스를 사용해 AMI ID를 자동으로 가져올 수 있습니다.
데이터 소스는 Terraform이 기존 인프라에 대한 읽기 작업을 할 수 있게 합니다. 데이터 소스는:
- 리소스를 생성, 업데이트, 삭제하지 않음
- 다른 곳에서 관리되는 리소스를 참조할 수 있음
- 팀 간 인프라 공유를 가능하게 함
resource블록이 아니라data블록으로 정의됨

AWS 데이터 소스 사용 방법
Terraform 구성 파일에서 data 블록을 사용해 데이터 소스를 정의합니다:
data "provider_type" "name" {
# 데이터 소스를 필터링하거나 식별하기 위한 설정
}
- provider_type – AWS 데이터 소스 유형 (예:
aws_ami,aws_vpc,aws_s3_bucket). - name – 데이터 소스를 참조하기 위한 로컬 식별자.
- Configuration settings – 데이터 소스마다 다르며 보통
id,name또는filter블록(name및values인수 포함)을 포함합니다.
예시: 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 인스턴스를 배포하세요.

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"
}
}