테라폼 코딩 / 꼼수 / 트릭 /
terraform 에서 for_each에서 map 에 list 를 감싸는 이유
다음 module code를 보다가 궁금한게 생겼다.
resource "aws_lb_listener_rule" "redirect_to_https" {
# rules = { <each.key> = each.value }
for_each = local.rules
...
dynamic "condition" {
for_each = try(each.value.conditions, [])
content {
dynamic "host_header" {
for_each = try([condition.value.host_header], [])
content {
values = host_header.value.values
}
}
}
}
...
}
위코드의 input은 다음과 같다.
...
conditions = [{
host_header = {
values = ["/onboarding", "/docs"]
}
}]
...
여기서 왜 아래처럼 condition.value.host_header
를 iterate
할 때, condition.value.host_header
를 로
감쌌는지 궁금했다.
...
dynamic "host_header" {
for_each = try([condition.value.host_header], [])
# 여기서 host header 는 아래와 같다.
# host_header = { values = ["/onboarding", "/docs"] },
content {
values = host_header.value.values
}
}
...
아래처럼 바로 map 을 이용할 수도 있는데 말이다.
...
dynamic "host_header" {
for_each = try(condition.value.host_header, {})
# 여기서 host header 는 아래와 같다.
# host_header.key = values, host_header.value = ["/onboarding", "/docs"]
content {
values = host_header.value
}
}
...
input 에서 map 의 특정key 를 사용하게 하도록 하기 위해
이것은 host_header.values
를 명시적으로 하기 위함인 듯
하다. 아래 input 값을 가지고 test 를 해보면 이해가 쉽다.
...
conditions = [{
path_pattern = {
vals = ["/onboarding", "/docs"]
}
}]
...
만약 map을 그대로 이용한 경우에는 values
를 사용하지
않아도, 첫번째 item 이 가지고 있는 값을 사용하게 된다. 하지만 list 로
감싸면, iterate 에서 map 을 그대로 사용하게 되기때문에, 명시적으로
values 를 사용해줘야만 한다.
그로인해 input 은 ’values’라는 key 를 사용해야 만 한다.
댓글 없음:
댓글 쓰기