10일 차: Conditional expressions, Dynamic blocks, Splat expressions in terraform
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 구성을 만들 수 있습니다.