이미 존재하는 클라우드/외부 정보 조회용 블록. 리소스를 생성하지 않고 읽어와 다른 리소스 정의에 활용한다.
data "<provider>_<type>" "<name>" { ... } → 참조: data.<provider>_<type>.<name>.<attr>data가 필요한가?outputs**를 읽어와 조립할 때resource vs data| 구분 | resource | data |
|---|---|---|
| 목적 | 리소스 생성/변경/삭제 | 조회(읽기 전용) |
| 상태(tfstate) | 리소스 ID 등 관리 대상 | 생성 없음(결과만 참조) |
| 생명주기 | create / update / destroy | 없음 |
| 예시 | aws_instance, aws_s3_bucket | aws_ami, aws_vpc, terraform_remote_state |
# 정의
data "aws_vpc" "default" {
default = true
}
# 참조
subnet_vpc = data.aws_vpc.default.id
for_each/count 사용 가능(읽기 반복)depends_on 사용data "aws_ssm_parameter" "al2023" {
name = "/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64"
}
locals { ami_id = data.aws_ssm_parameter.al2023.value }
resource "aws_instance" "web" {
ami = local.ami_id
instance_type = "t3.micro"
}
data "aws_vpc" "default" { default = true }
data "aws_subnet_ids" "default" { vpc_id = data.aws_vpc.default.id }
resource "aws_security_group" "web" {
vpc_id = data.aws_vpc.default.id
# ...
}
resource "aws_instance" "web" {
subnet_id = tolist(data.aws_subnet_ids.default.ids)[0]
}
data "aws_caller_identity" "me" {}
data "aws_region" "current" {}
output "account_id" { value = data.aws_caller_identity.me.account_id }
output "region" { value = data.aws_region.current.name }
data "terraform_remote_state" "network" {
backend = "s3"
config = {
bucket = "my-tf-state-bucket"
key = "network/terraform.tfstate"
region = "ap-northeast-2"
}
}
locals {
public_subnet_ids = data.terraform_remote_state.network.outputs.public_subnet_ids
}
data "aws_iam_policy_document" "sg_read_only" {
statement {
actions = ["ec2:DescribeSecurityGroups"]
resources = ["*"]
}
}
resource "aws_iam_policy" "sg_ro" {
policy = data.aws_iam_policy_document.sg_read_only.json
}
data "aws_ami" "al2023" {
most_recent = true
owners = ["137112412989"] # Amazon 공식
filter { name = "name" values = ["al2023-ami-*-kernel-6.1-*"] }
filter { name = "architecture" values = ["x86_64"] }
}
plan 중 provider API를 호출하여 값을 가져온다plan 결과를 apply에 그대로 쓰려면 plan -out → apply plan.bin 패턴 사용plan에서 변경점이 다시 계산된다(드리프트 아님, 외부 변경)owners 지정(공식/내 계정)로 공급자 고정depends_onfor_each + toset()/tomap()로 결과 정리data 소스aws_ssm_parameter — 공식 최신 AMI ID(SSM 파라미터)aws_ami — 필터 기반 AMI 검색(소유자 고정 필수)aws_vpc, aws_subnet_ids, aws_security_group — 기존 네트워크 정보aws_availability_zones — 사용 가능한 AZ 목록aws_caller_identity, aws_region — 계정/리전aws_iam_policy_document — 안전한 Policy JSON 생성terraform_remote_state — 다른 스택 outputs 재사용terraform {
required_version = "~> 1.9"
required_providers {
aws = { source = "hashicorp/aws", version = "~> 5.0" }
}
}
provider "aws" { region = "ap-northeast-2" } # 서울
# 1) 최신 AMI 조회(SSM)
data "aws_ssm_parameter" "al2023" {
name = "/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64"
}
# 2) 기존 VPC/서브넷 조회
data "aws_vpc" "default" { default = true }
data "aws_subnet_ids" "default" { vpc_id = data.aws_vpc.default.id }
# 3) EC2 생성 시 data 값 사용
resource "aws_instance" "web" {
ami = data.aws_ssm_parameter.al2023.value
instance_type = "t3.micro"
subnet_id = tolist(data.aws_subnet_ids.default.ids)[0]
vpc_security_group_ids = []
user_data = <<-EOF
#!/bin/bash
dnf -y install nginx
systemctl enable --now nginx
EOF
tags = { Name = "tf-web" }
}
output "ami_id" { value = data.aws_ssm_parameter.al2023.value }
output "subnet_0" { value = tolist(data.aws_subnet_ids.default.ids)[0] }
명령 흐름:
terraform init
terraform validate
terraform plan -out=plan.bin
terraform apply plan.bin
resource "local_file" "abc" {
content = "123!!!"
filename = "${path.module}/abc.txt"
}
data "local_file" "abc" {
filename = local_file.abc.filename
}
resource "local_file" "def" {
content = data.local_file.abc.content
filename = "${path.module}/def.txt"
}