locals는 “모듈 안에서만 쓰는 계산된 값(별명/중간 변수)”.
입력은 variable, 외부로 내보내는 건 output, 그리고 사이에 반복되는 계산·규칙을 담아 깔끔하게 재사용하는 게 locals!
locals { ... }local.<이름>locals {} 블록은 병합되지만 같은 키 재정의는 안 됨)locals {
name_prefix = "${var.project}-${var.env}"
}
resource "aws_s3_bucket" "this" {
bucket = "${local.name_prefix}-assets"
tags = { Name = local.name_prefix }
}
locals {
common_tags = {
Project = var.project
Env = var.env
Owner = var.owner
}
}
resource "aws_instance" "web" {
# ...
tags = merge(local.common_tags, { Role = "web" })
}
locals {
instance_type_by_env = { dev = "t3.micro", prod = "t3.medium" }
instance_type = local.instance_type_by_env[var.env]
}
locals {
public_subnet_cidrs = [for s in var.subnets : s.cidr if s.public]
az_names = [for z in data.aws_availability_zones.current.names : z]
}
locals {
sg_rules = {
ssh = { port = 22, cidr = "0.0.0.0/0" }
http= { port = 80, cidr = "0.0.0.0/0" }
}
}
resource "aws_security_group_rule" "ingress" {
for_each = local.sg_rules
type = "ingress"
from_port = each.value.port
to_port = each.value.port
protocol = "tcp"
cidr_blocks = [each.value.cidr]
security_group_id = aws_security_group.web.id
}
locals {
db_pass_masked = sensitive(var.db_password)
}
# 파생값은 기본적으로 민감성이 전파됨. 콘솔 노출이 필요하면 아주 조심해서 nonsensitive() 사용.
Q. locals에서 리소스/데이터소스를 참조해도 돼?
A. 가능해요. 그 값을 쓰는 곳에서 암시적 의존성이 생깁니다(명시적 depends_on는 locals에 쓸 수 없음).
Q. 변수랑 뭐가 달라?
A. variable은 외부 입력, locals는 내부 계산/별칭, output은 외부 공개.
Q. 여러 locals {}를 나눠 써도 돼?
A. 네. Terraform이 병합해서 취급합니다(단, 같은 키 중복 정의는 에러).
# locals.tf
locals {
name_prefix = "${var.project}-${var.env}"
common_tags = {
Project = var.project
Env = var.env
}
itype_by_env = { dev = "t3.micro", prod = "t3.medium" }
instance_type = local.itype_by_env[var.env]
}
# 사용 예시
resource "aws_s3_bucket" "assets" {
bucket = "${local.name_prefix}-assets"
tags = local.common_tags
}
resource "aws_instance" "web" {
ami = data.aws_ami.al2023.id
instance_type = local.instance_type
tags = merge(local.common_tags, { Role = "web" })
}