Terraform 데이터 소스 (AWS)

발행: (2025년 12월 9일 오후 10:51 GMT+9)
7 min read
원문: Dev.to

Source: Dev.to

Terraform 데이터 소스란?

Terraform에서 데이터 소스는 읽기 전용 조회 로, 이미 존재하는 리소스에 대한 정보를 가져옵니다. 새로운 리소스를 만들지 않고, Terraform이 클라우드 제공자(AWS)에게 질의하여 반환된 정보를 구성 파일 안에서 사용할 수 있습니다.

데이터 소스를 사용해야 할 때

  • 리소스가 이미 생성되어 있는 경우(예: 공유 VPC, 기존 AMI).
  • 다른 팀이 해당 리소스를 관리하고 있는 경우(네트워크 또는 보안 팀).
  • Terraform 모듈이 해당 리소스를 소유하거나 재생성하지 않아야 할 때.
  • 최신이거나 필터링된 버전이 필요할 때(예: 최신 AMI).
  • ID나 ARN과 같은 식별자를 하드코딩하고 싶지 않을 때.

데이터 소스를 사용하면 인프라 코드가 더 깔끔하고 동적으로 변합니다.

예제 1: 데이터 소스로 VPC ID 가져오기

많은 조직에서 네트워킹은 중앙에서 관리됩니다. VPC는 이미 존재하고, Terraform 코드는 그 안에 애플리케이션 리소스만 배포합니다.

data "aws_vpc" "vpc_name" {
  filter {
    name   = "tag:Name"
    values = ["default-vpc"]
  }
}
  • Name = default-vpc 태그가 붙은 VPC를 검색합니다.
  • VPC ID를 반환하며, data.aws_vpc.vpc_name.id 로 접근할 수 있습니다.
  • VPC ID를 수동으로 캡처하거나 유지관리할 필요가 없습니다.

예제 2: 특정 VPC에서 서브넷 ID 가져오기

VPC를 가져온 뒤에는 그 안에 있는 서브넷이 필요할 때가 많습니다.

data "aws_subnet" "shared_subnet" {
  filter {
    name   = "tag:Name"
    values = ["subnet-a"]
  }
  vpc_id = data.aws_vpc.vpc_name.id
}
  • Name = subnet-a 태그가 붙은 서브넷을 가져옵니다.
  • 해당 서브넷이 앞서 가져온 VPC에 속함을 보장합니다.
  • 단일 서브넷 ID를 반환하며, data.aws_subnet.shared_subnet.id 로 사용할 수 있습니다.

이를 통해 Terraform은 하드코딩 없이 올바른 공유 서브넷에 EC2 또는 Lambda 리소스를 배포할 수 있습니다.

예제 3: 최신 Amazon Linux 2 AMI 가져오기

AMI ID는 리전마다 자주 변경되며, 오래된 AMI를 하드코딩하면 배포 실패가 발생합니다.

data "aws_ami" "linux2" {
  most_recent = true
  owners      = ["amazon"]

  filter {
    name   = "name"
    values = ["amzn2-ami-hvm-*-x86_64-gp2"]
  }

  filter {
    name   = "virtualization-type"
    values = ["hvm"]
  }

  filter {
    name   = "architecture"
    values = ["x86_64"]
  }
}
  • 최신 Amazon Linux 2 AMI를 가져옵니다.
  • Amazon 계정이 소유한 공식 이미지로 결과를 제한합니다.
  • AMI가 요구되는 아키텍처와 가상화 유형을 만족하는지 확인합니다.

데이터 소스를 활용해 이미지가 자동으로 최신 상태를 유지하는 좋은 예시입니다.

데이터 소스를 사용해 EC2 인스턴스 실행하기

VPC, 서브넷, AMI를 가져온 뒤에는 이러한 동적 값을 이용해 EC2 인스턴스를 프로비저닝할 수 있습니다.

resource "aws_instance" "ec2_one" {
  ami           = data.aws_ami.linux2.id
  instance_type = var.instance_type
  subnet_id     = data.aws_subnet.shared_subnet.id
  tags          = var.tags
}
  • 데이터 소스에서 가져온 AMI를 사용합니다.
  • EC2 인스턴스를 공유 서브넷 안에 배치합니다.
  • 사용자 제공 인스턴스 타입과 태그를 적용합니다.

그 결과 재사용 가능하고, 환경에 독립적이며, 미래에도 견고한 Terraform 구성 파일이 완성됩니다.

데이터 소스가 중요한 이유

  1. 하드코딩 방지 – ID, ARN, AMI 등을 수동으로 저장할 필요가 없습니다.
  2. 다중 팀·다중 계정 활용 – 중앙 리소스를 수정 권한 없이도 참조할 수 있습니다.
  3. 재사용성 향상 – 모듈이 일반화되어 dev, test, prod 환경을 매끄럽게 지원합니다.
  4. 동적·자동 인프라 지원 – 최신 AMI를 자동으로 가져와 보안과 일관성을 유지합니다.
  5. 인적 오류 감소 – ID 복사·붙여넣기와 같은 실수를 없앱니다.

결론

Terraform 데이터 소스는 동적이고 안전하며 프로덕션 수준의 인프라를 구축하는 데 필수적입니다. 이를 통해 기존 AWS 리소스(VPC, 서브넷, AMI 등)와 코드를 직접 재생성하지 않고도 상호 작용할 수 있습니다. 위 예제들은 특히 공유 네트워크 환경에서 인프라 팀이 많이 활용하는 실제 시나리오를 보여줍니다. 데이터 소스를 효과적으로 사용하면 Terraform 설정이 더 확장 가능하고, 유지 보수가 쉬우며, 최신 DevOps 모범 사례에 부합하게 됩니다.

Back to Blog

관련 글

더 보기 »

Day-13: Terraform의 데이터 소스

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

13일 차: Terraform 데이터 소스

Data Source 데이터 소스를 전화번호부와 같이 사용자 이름과 전화번호가 key‑value 쌍으로 API를 통해 접근되는 것으로 생각해 보세요. 값을 hard‑coding 하는 대신…