10일 차: Conditional expressions, Dynamic blocks, Splat expressions in terraform

발행: (2025년 12월 4일 오전 01:08 GMT+9)
3 min read
원문: Dev.to

Source: Dev.to

조건 표현식

Terraform의 조건 표현식은 조건에 따라 두 값 중 하나를 선택할 수 있게 해줍니다. 구문은 condition ? true_value : false_value 입니다. 변수 값이나 다른 조건에 따라 리소스 속성을 설정할 때 유용합니다.

  • 환경(dev/prod)에 따라 인스턴스 선택
  • 설정에 따라 모니터링 활성화
  • 지역에 따라 다른 AMI 선택

예시

// main.tf
resource "aws_instance" "instance" {
  ami           = "ami-0fa3fe0fa7920f68e"
  region        = "us-east-1"
  instance_type = var.environment == "dev" ? "t3.micro" : "t3.small"
  count         = var.instance_count

  tags = var.tags
}

// variables.tf
variable "environment" {
  type    = string
  default = "dev"
}

스플랫 표현식

스플랫 표현식은 객체 리스트에서 여러 값을 추출할 수 있게 해줍니다. 구문은 resource_type.resource_name[*].attribute 입니다. 여러 인스턴스의 속성을 가져올 때 유용합니다.

예시

// main.tf
resource "aws_instance" "instance" {
  ami           = "ami-0fa3fe0fa7920f68e"
  region        = "us-east-1"
  instance_type = var.environment == "dev" ? "t3.micro" : "t3.small"
  count         = var.instance_count

  tags = var.tags
}

// splat expression example in Terraform
output "instance_ids" {
  value = aws_instance.instance[*].id
}

동적 블록

Terraform의 동적 블록은 리스트나 맵 변수에 기반해 리소스 내부에 여러 중첩 블록을 생성할 수 있게 해줍니다. 구문은 다음과 같습니다:

dynamic "block_name" {
  for_each = var.list_variable
  content {
    # block attributes
  }
}

코드를 중복하지 않고 유사한 구성을 여러 개 만들 때 유용합니다.

예시

// variables.tf
variable "ingress_values" {
  type = list(object({
    from_port   = number
    to_port     = number
    protocol    = string
    cidr_blocks = list(string)
  }))

  default = [
    {
      from_port   = 80
      to_port     = 80
      protocol    = "tcp"
      cidr_blocks = ["0.0.0.0/0"]
    },
    {
      from_port   = 443
      to_port     = 443
      protocol    = "tcp"
      cidr_blocks = ["0.0.0.0/0"]
    }
  ]
}

// main.tf
resource "aws_security_group" "security_group" {
  name = "sg"

  dynamic "ingress" {
    for_each = var.ingress_values
    content {
      from_port   = ingress.value.from_port
      to_port     = ingress.value.to_port
      protocol    = ingress.value.protocol
      cidr_blocks = ingress.value.cidr_blocks
    }
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

조건 표현식, 스플랫 표현식, 동적 블록을 활용하면 보다 유연하고 재사용 가능하며 유지 관리가 쉬운 Terraform 구성을 만들 수 있습니다.

@piyushsachdeva

Back to Blog

관련 글

더 보기 »

AWS Terraform 라이프사이클 규칙

소개 인프라스트럭처 코드(IaC)는 업데이트, 교체 및 삭제 시 리소스가 어떻게 동작하는지에 대한 완전한 제어가 있을 때 가장 강력합니다. Terr...

Terraform 고급

왜 Terraform인가? Terraform은 클라우드 인프라를 자동화하기 위해 사용되며, 사람이 수동으로 생성하지 않도록 합니다: - VPCs - Subnets - Security Groups - ECS clusters -...