영상: https://youtu.be/fhgGcC7wJoc
for_each란?
for-each는 반복(for)을 할 때 타입 값에 대해 하나하나 each object로 접근한다는 의미입니다. each object는 key, value 2개의 속성을 가지고 있습니다.
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 등)을 해야합니다.
예제
아래 예에서는 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
'연재 시리즈' 카테고리의 다른 글
테라폼 시리즈 33편. for expression을 이용한 반복문 (0) | 2022.11.19 |
---|---|
테라폼 시리즈 32편. 조건문 - 3항 연산자 (0) | 2022.11.19 |
테라폼 시리즈 29편. Expression 타입 (0) | 2022.11.14 |
테라폼 시리즈 30편. count를 이용한 반복문 (0) | 2022.11.14 |
테라폼 시리즈 28편. Terraform console (0) | 2022.11.14 |