본문 바로가기
  • lakescript
스터디 이야기/Terraform

[T101] 3-2. Terraform - 반복문 (for)

by lakescript 2024. 6. 24.

 

더보기

이 스터디는 CloudNet@에서 진행하는 T101 스터디를 참여하면서 공부하는 내용을 기록하는 블로그 포스팅입니다.

CloudNet@에서 제공해주는 자료들과 테라폼으로 시작하는 IaC 를 바탕으로 작성되었습니다.

 

반복문

for

for문은 복합적인 형식의 값 형태를 변환하는 데에 사용됩니다. 예를 들어, list값의 포맷을 변경하거나 특정 접두사를 추가할 수도 있고, output에 원하는 형태로 반복적인 결과를 표현할 수도 있습니다.

  • list 타입인 경우 value 또는 index와 value을 반환
  • map 타입인 경우 key 또는 key와 value를 반환
  • set 타입의 경우 key 값에 대해 반환
variable "names"{
    default = ["a", "b", "c"]
}

resource "local_file" "abc" {
    content = jsonencode(var.names)
    filename = "${path.module}/abc.txt"
}

위와같이 main.tf에 list의 내용을 파일에 담는 리소스를 생성하는 코드를 작성합니다. 

var.name의 내용이 결과 파일에 content로 작성됩니다.

 

variable "names"{
    default = ["a", "b", "c"]
}

resource "local_file" "abc" {
    content = jsonencode([for s in var.names: upper(s)])
    filename = "${path.module}/abc.txt"
}

위의 코드는 var.name의 값을 순차적으로 대문자로 변환하는 코드입니다. 

content 값을 정의하는 부분에 for 구문을 사용하면 내부의 값을 순차적으로 변경할 수 있습니다.

 

사용 규칙

  • list 유형의 경우 반환 받는 값이 1개로 되어 있으면 value, 2개인 경우 앞의 인수가 index를 반환하고 뒤의 인수가 value를 반환 (i,v)
  • map 유형의 경우 반환 받는 값이 1개로 되어 있으면 key, 2개인 경우 앞의 인수가 key를 반환하고 뒤의 인수가 value를 반환 -> k,v
  • 결과 값은 for문을 묶는 기호가 [ ] 인경우 tuple로 반환되고 { }인 경우 object 형태로 반환
  • object 형태의 경우 key와 value에 대한 쌍은 => 기호로 구분
  • { } 형식을 사용해 object 형태로 결과를 반환하는 경우 key는 고유해야 하므로 value뒤에 그룹화 모드 심볼(...)을 붙여서 key의 중복을 방지
  • if 구문을 추가해 조건 부여 가능

 

list 유형

variable "names" {
  type = list(string)
  default = ["a", "b", "c"]
}

output "A_upper_value" {
  value = [for v in var.names: upper(v)]
}

output "B_index_and_value" {
  value = [for i,v in var.names: "${i} == ${v}"]
}

output "C_make_object" {
  value = {for v in var.names: v => upper(v)}
}

output "D_with_filter" {
  value = [for v in var.names: upper(v) if v != "a"]
}

list 유형에 대한 for 구문 처리 및 몇 가지 예를 확인하기 위해 위와 같이 main.tf 파일을 작성하고 output을 확인해보겠습니다.

  • output.A_upper_value의 경우 var.names를 순차적으로 돌면서 value의 값을 대문자로 변환하여 출력합니다.
  • output.B_index_and_value의 경우 var.name를 순차적으로 돌면서 index와 value를 출력합니다.
  • output.C_make_object의 경우 tuple 형태로 선언된 값을 object 형태로 변환하여 출력합니다.
  • output.D_with_filter는 var.names를 순차적으로 돌면서 "a"가 아닌 값만 출력합니다.

 

map 유형

variable "members" {
    type = map(object({
        role = string
    }))
    default = {
        member-dev = {role = "member", group = "dev"}
        admin-dev = {role = "admin", group = "dev"}
        member-ops = {role = "member", group = "ops"}
    }
}

output "A_to_tuple" {
  value = [for k, v in var.members: "${k} is ${v.role}"]
}

output "B_get_only_role" {
  value = {
    for name, user in var.members: name => user.role
    if user.role == "admin"
  }
}

output "C_group" {
    value = {
        for name, user in var.members: user.role => name...
    }

}

map 유형에 대한 for 구문 처리 및 몇 가지 예를 확인하기 위해 위와 같이 main.tf 파일을 작성 후 output을 확인해보겠습니다.

 

  • output.A_to_tuple은 var.names를 순차적으로 돌면서 key와 value 값을 출력합니다.
  • output.B_get_only_role은 var.names를 순차적으로 돌면서 role이 admin인 쌍을 출력합니다.
  • output.C_group은 var.names를 순차적으로 돌면서 role별로 그룹화하여 출력합니다.