Data source
Variable, Output을 이용해 데이터를 입력하거나 출력 되는 과정의 데이터를 변수에 담는 방식을 이용할 수 있다. 그 과정에 선언한 VPC, Subnet 생성 코드에는 하드코딩 된 데이터가 일부 있는데 재활용을 높이기 위해서는 이 부분을 최소화 해야 한다. 이 때 하드코딩 된 부분을 모두 변수로 선언해서 재활용을 높일 수도 있으나 Data source를 이용할 수 있다. Data source는 Terraform 외부 환경에 정의된 리소스의 Attribute 정보를 읽어와 코드에 변수 값을 저장하듯이 사용할 수 있다.
1. 서브넷 정보 확인
기존 구성된 vpc.tf 파일에서는 서브넷 정보를 아래와 같이 하드코딩 해두었다.
# vpc.tf
resource "aws_subnet" "public1" {
vpc_id = aws_vpc.main.id
cidr_block = "10.10.1.0/24" #개선이 필요한 부분 1
tags = merge(
{
"Name" = "Public1"
},
var.default_tags
)
availability_zone = "ap-northeast-2a" #개선이 필요한 부분 2
map_public_ip_on_launch = true
}
2. data source 설정
data_source.tf 파일을 추가하고, 아래 내용을 입력한다.
# data_source.tf
data "aws_availability_zones" "available" {
state = "available"
}
3. 서브넷 정보 수정
하드코딩 되어 있던 서브넷 정보를 data_source 정보로 수정한다.
# vpc.tf
resource "aws_subnet" "public1" {
vpc_id = aws_vpc.main.id
cidr_block = "10.10.1.0/24"
tags = merge(
{
"Name" = "Public1"
},
var.default_tags
)
availability_zone = data.aws_availability_zones.available.names[0] #내용수정
map_public_ip_on_launch = true
}
resource "aws_subnet" "public2" {
vpc_id = aws_vpc.main.id
cidr_block = "10.10.2.0/24"
tags = merge(
{
"Name" = "Public2"
},
var.default_tags
)
availability_zone = data.aws_availability_zones.available.names[1] #내용수정 map_public_ip_on_launch = true
}
Terraform function
Terraform에 내장되어 있는 기능을 이용해 Incoding/Decoding, Input/Output, Timestamp 등의 기능을 수행할 수 있다. Terraform은 내장 함수만 지원하고 사용자 정의 함수는 지원하지 않는다. Terraform functions을 이용해서 AWS Subnet의 CIDR을 하드코딩 하지 않고 재활용성을 높일 수 있다.
1. cidrsubnets
cidrsubnets function은 특정 CIDR 접두사 내에 일련의 연속 IP 주소 범위를 계산한다. 형식은 다음과 같다.
# cidrsubnets(prefix, newbits1, newbits2...)
cidrsubnets("10.0.0.0/16", 8, 8)
- prefix: 서브넷을 생성할 대상이 되는 VPC의 CIDR을 입력한다.
- newbits: 추가할 서브넷의 CIDR prefix의 추가 bits 값 수를 의미한다. 복수 개의 값을 콤마(,) 단위로 구분해서 넣을 수 있다.
2. locals.tf 추가
locals.tf 파일을 생성하고, 아래의 repository structure를 구성한다.
/root/terraform-starter/
├── backend.tf
├── data_source.tf
├── environments
│ ├── dev.tfvars
│ ├── terraform.tfstate
│ └── tfplan
├── locals.tf
├── output.tf
├── provider.tf
├── tfplan
├── variables.tf
├── version.tf
└── vpc.tf
# locals.tf
locals {
subnet_addresses = cidrsubnets(var.vpc_cidr,8,8)
}
3. 서브넷에서 사용하는 cidr block 정보 변경
# vpc.tf
resource "aws_subnet" "public1" {
vpc_id = aws_vpc.main.id
cidr_block = local.subnet_addresses[0] #내용수정
tags = merge(
{
"Name" = "Public1"
},
var.default_tags
)
availability_zone = data.aws_availability_zones.available.names[0]
map_public_ip_on_launch = true
}
resource "aws_subnet" "public2" {
vpc_id = aws_vpc.main.id
cidr_block = local.subnet_addresses[1] #내용수정
tags = merge(
{
"Name" = "Public2"
},
var.default_tags
)
availability_zone = data.aws_availability_zones.available.names[1]
map_public_ip_on_launch = true
}
반응형
'Programming > Terraform' 카테고리의 다른 글
| [Terraform] Attribute & Output (0) | 2025.12.19 |
|---|---|
| [Terraform] Variable & Validation (0) | 2025.12.19 |
| [Terraform] Remote Backend 구성 (0) | 2025.12.18 |
| [Terraform] 주요 명령어 세 가지 (0) | 2025.12.18 |
| [Terraform] Terraform 개요 (0) | 2025.12.17 |