terraform locals

도은호·2025년 9월 17일

terraform

목록 보기
7/32

locals는 “모듈 안에서만 쓰는 계산된 값(별명/중간 변수)”.
입력은 variable, 외부로 내보내는 건 output, 그리고 사이에 반복되는 계산·규칙을 담아 깔끔하게 재사용하는 게 locals!

핵심 요약

  • 정의 위치/형태: 모듈(any *.tf) 어디든 locals { ... }
  • 역할: 복잡한 표현식에 이름 붙이기, 중복 제거(DRY), 규칙 표준화(네이밍/태깅 등)
  • 스코프: 해당 모듈 한정(자식 모듈에 자동 전달 X → 필요하면 변수로 넘김)
  • 참조: local.<이름>
  • 불변: 한 번 정의하면 재할당 불가(여러 locals {} 블록은 병합되지만 같은 키 재정의는 안 됨)
  • 상태 없음: tfstate에 리소스처럼 저장되지 않음(그냥 계산식)

가장 많이 쓰는 패턴 6가지

1) 표준 네이밍 규칙

locals {
  name_prefix = "${var.project}-${var.env}"
}

resource "aws_s3_bucket" "this" {
  bucket = "${local.name_prefix}-assets"
  tags   = { Name = local.name_prefix }
}

2) 공통 태그 + 병합

locals {
  common_tags = {
    Project = var.project
    Env     = var.env
    Owner   = var.owner
  }
}

resource "aws_instance" "web" {
  # ...
  tags = merge(local.common_tags, { Role = "web" })
}

3) 환경별 스펙 매핑(룩업 테이블)

locals {
  instance_type_by_env = { dev = "t3.micro", prod = "t3.medium" }
  instance_type        = local.instance_type_by_env[var.env]
}

4) 목록/맵 가공(For/조건)

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]
}

5) 보안그룹 규칙 정의(for_each로 사용)

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
}

6) 민감값 파생(마스킹 유지)

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" })
}
profile
`•.¸¸.•´´¯`••._.• 🎀 𝒸𝓇𝒶𝓏𝓎 𝓅𝓈𝓎𝒸𝒽💞𝓅𝒶𝓉𝒽 🎀 •._.••`¯´´•.¸¸.•`

0개의 댓글