본문 바로가기

Terraform

[Terraform] Terrafrom 사용법 반복문

이번 시간에는 반복문에 대해서 알아보겠습니다.

 

Terrafrom의 반복문은 count, for_each. for, dynamic 이 있습니다.

 

count

count는 반복문, 정수 값만큼 리소스나 모듈을 생성합니다.

 

아래와 같이 count를 이용 할 수 있습니다.

// 유저 목록을 변수로 선언
variable "user_names" {
  description = "Create IAM users with these names"
  type        = list(string)
  default     = ["test1", "test2", "test3"]
}

// provider는 aws로 설정
provider "aws" {
  region = "ap-northeast-2"
}

// count를 이용하여 변수에 선언한 유저 목록만큼 생성 
resource "aws_iam_user" "test_iam" {
  count = length(var.user_names)
  name  = var.user_names[count.index]
}

count를 사용할때 제약사항이 존재합니다.

중간에 값이 삭제되면 인덱스가 줄어들어 의도했던 중간 값에 대한 리소스가 삭제가 될 것이라고 생각되지만 실제로 중간 값에 대한 리소스만 사라지는게 아니라 인덱스가 하나씩 앞으로 오면서 재생성이  됩니다.

 

 

for_each

for_each는 리소스 또는 모듈 블록에서 입력된 데이터 형태가 map 또는 set으로 이루어지며, 선언된 key 값 개수만큼 리소스를 생성하게 됩니다.

 

아래와 같이 for_each를 사용 할 수 있습니다.

// 유저 목록을 변수로 선언
variable "user_names" {
  default = {
    first = "test1"
    second = "test2"
    third = "test3"
  }
}
// provider는 aws로 설정
provider "aws" {
  region = "ap-northeast-2"
}

// count를 이용하여 변수에 선언한 유저 목록만큼 생성 
resource "aws_iam_user" "test_iam" {
  for_each = var.user_names
  name  = each.value
}

 

위의 count 와 다른 점은 for_each는 map 또는 set 형태 이기에 key,value 갯수만 확인 하기 때문에 중간에 값이 삭제가 되도 count의 제약 조건가 다르게 에러가 나지 않습니다. 

 

for

복합 형식 값의 형태를 변환하는 데 사용합니다. JAVA나 JavaScript 등 일반 언어와 달리 for와 for_each는 다릅니다.

 

for문은 기본적으로 for <item> in <List> : output 으로 사용이 가능하며 

map 또는 set 일 경우는  for <key, item> in <Map> : output 으로 사용이 가능합니다. 

 

아래와 같이 for문을 사용할 수 있습니다.

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

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} is ${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"]
}