연재 시리즈

테라폼 시리즈 31편. for_each를 활용한 반복문

악분 2022. 11. 18. 18:30
반응형

영상: https://youtu.be/fhgGcC7wJoc

for_each란?

for-each는 반복(for)을 할 때 타입 값에 대해 하나하나 each object로 접근한다는 의미입니다. each object는 key, value 2개의 속성을 가지고 있습니다.

참고자료: https://developer.hashicorp.com/terraform/language/meta-arguments/for_each#the-each-object

 

each object로 접근한다는 의미가 이해하기 어려운데요. each object를 json과 비교해서 이해하면 쉽습니다. json은 key, value들의 집합입니다. value에 접근하기 위해 key를 사용합니다. 아래 world라는 값에 접근하기 위해 a[”hello”]로 접근합니다.

 

json에서 key를 이용하여 value를 접근한 것처럼 테라폼 each object도 key로 value를 얻을 수 있습니다. 하지만 for_each는 모든 타입에 대해 each object로 접근 할 수 없고 map, set타입만 허용합니다. map, set타입이 아닌 expression은 map 또는 set으로 타입변환(toset 등)을 해야합니다.

참고자료: https://developer.hashicorp.com/terraform/language/meta-arguments/for_each#the-for_each-meta-argument

 

예제

아래 예에서는 aws iam user를 생성합니다. aws_iam_user가 참조하는 variable이 list이므로 toset함수를 이용하여 set타입으로 변환하고 있습니다. set타입은 key와 value같이 같아 key/value를 선택하여 사용합니다.

provider "aws" {
    region = "ap-northeast-2"
}

variable "user_names" {
  description = "Create IAM users with these names"
  type        = list(string)
  default     = ["aaa", "bbb", "ccc"]
}

resource "aws_iam_user" "for_each_set" {
  for_each = toset(var.user_names)
  name = each.key # each.key == each.value
}

 

terraform apply명령어를 실행하여 iam user를 생성해봅시다. 명령어 실행로그를 보면 key로 접근하여 iam user를 생성하는 것을 알 수 있습니다.

terrafrom apply

 

리스트 타입은 key로 접근하는 것이 아니라 index로 접근합니다.

 

iam user를 확인하면 의도한대로 aaa, bbb, ccc가 생성이 되었습니다.

 

수정예제 - count(리스트타입)과  비교

for_each는 반복을 수행할 때 object key로 접근하므로, index로 접근하는 리스트타입과 비교(링크)하여 안전성이 있습니다. 예제에서 생성한 iam_user에서 bbb를 삭제하면, 리스트타입과 다르게 bbb만 정확히 삭제됩니다.

provider "aws" {
    region = "ap-northeast-2"
}

variable "user_names" {
  description = "Create IAM users with these names"
  type        = list(string)
  default     = ["aaa", "ccc"]
}

resource "aws_iam_user" "for_each_set" {
  for_each = toset(var.user_names)
  name = each.key
}

 

terraform apply명령어를 실행하면 의도한대로 bbb iam user만 삭제되었습니다. 리스트 타입(링크)은 bbb, ccc 계정이 삭제되고 ccc 계정을 생성하려고 합니다.

terraform apply

반응형