[컴] terraform 에서 for_each에서 map 에 list 를 감싸는 이유

 테라폼 코딩 / 꼼수 / 트릭 /

terraform 에서 for_each에서 map 에 list 를 감싸는 이유

다음 module code를 보다가 궁금한게 생겼다.

code from : https://github.com/terraform-aws-modules/terraform-aws-alb/blob/a1a54c5b0a26919eda7bdd50da6b9eed5fedcc1c/main.tf#L343

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 를 사용해야 만 한다.

댓글 없음:

댓글 쓰기