AWS

AWS terraform data 사용법

devfinger 2024. 10. 25. 11:24

data 블록은 AWS 리소스에 대한 정보를 가져오거나 기존 리소스를 참조할 때 사용됩니다. 이미 생성된 리소스의 정보를 활용할 수 있게 도와주며, 특정 리소스를 생성하지 않고도 접근할 수 있다.

다양한 시나리오에서 data 블록을 사용할 수 있는데, 대표적으로는 다음과 같은 경우들이 있다.

  1. 이미 존재하는 리소스 정보 참조: 예를 들어, 기존의 VPC, Subnet, AMI, IAM Role 등을 생성하지 않고도 Terraform으로 참조할 수 있다.
  2. 동적 정보 검색: 최신 버전의 AMI를 동적으로 검색하거나, 특정 조건에 맞는 리소스를 검색하는 경우
  3. 외부 리소스와 연동: 다른 팀이나 조직에서 관리하고 있는 리소스를 참조해야 할 때

예시 1: 최신 Amazon Linux 2 AMI 검색

가장 흔히 쓰이는 사용 사례 중 하나는 최신 Amazon Linux 2 AMI를 동적으로 가져오는 경우

provider "aws" {
  region = "ap-northeast-2"
}

# 최신 Amazon Linux 2 AMI 검색
data "aws_ami" "latest_amazon_linux" {
  most_recent = true
  owners      = ["amazon"]

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

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

# EC2 인스턴스 생성 시 최신 AMI ID 참조
resource "aws_instance" "example" {
  ami           = data.aws_ami.latest_amazon_linux.id
  instance_type = "t2.micro"

  tags = {
    Name = "ExampleInstance"
  }
}

 

예시 2: 기존 VPC와 Subnet 정보 가져오기

이미 생성된 VPC와 Subnet 정보를 Terraform에서 가져와서 사용하는 경우입니다.

provider "aws" {
  region = "ap-northeast-2"
}

# 기존 VPC 정보 가져오기
data "aws_vpc" "existing_vpc" {
  filter {
    name   = "tag:Name"
    values = ["my-existing-vpc"]
  }
}

# VPC에 연결된 Subnet 정보 가져오기
data "aws_subnet" "existing_subnet" {
  filter {
    name   = "vpc-id"
    values = [data.aws_vpc.existing_vpc.id]
  }

  filter {
    name   = "tag:Name"
    values = ["my-existing-subnet"]
  }
}

# EC2 인스턴스 생성 시 기존 VPC와 Subnet 참조
resource "aws_instance" "example" {
  ami           = "ami-12345678"  # 실제 AMI ID는 원하는 값으로 대체
  instance_type = "t2.micro"
  subnet_id     = data.aws_subnet.existing_subnet.id

  tags = {
    Name = "ExampleInstance"
  }
}

 

예시 3: Route 53에서 기존 도메인 정보 가져오기

이미 등록된 도메인에 대해 Route 53의 호스팅 존 정보를 가져오는 예시

provider "aws" {
  region = "ap-northeast-2"
}

# 기존 Route 53 호스팅 존 정보 가져오기
data "aws_route53_zone" "example" {
  name = "example.com"
}

# A 레코드 생성 시 호스팅 존 ID 참조
resource "aws_route53_record" "www" {
  zone_id = data.aws_route53_zone.example.zone_id
  name    = "www"
  type    = "A"
  ttl     = "300"
  records = ["1.2.3.4"]
}

 

요약

  • data 블록은 이미 존재하는 AWS 리소스의 정보를 참조하거나 검색할 때 유용함
  • 새로운 리소스를 생성하지 않으면서도, 기존 리소스의 ID나 속성값을 가져와 다른 리소스를 관리할 때 활용
  • 보통 data는 동적 검색을 통해 최신 정보를 얻거나, 외부에서 관리되고 있는 리소스와 연동할 때 자주 사용