본문 바로가기
공부/IaC

[Terraform] For Expression을 사용해 for_each문의 output 설정하기

by haejang 2022. 2. 18.
728x90
728x90

 

https://www.terraform.io/language/expressions/for

 

For Expressions - Configuration Language | Terraform by HashiCorp

For expressions transform complex input values into complex output values. Learn how to filter inputs and how to group results.

www.terraform.io

 

예를 들어, vpc를 여러 개 만든다고 해보자

count를 사용하는 경우 :

locals {
  vpc_cidrs = [
    "10.0.0.0/16",
    "10.1.0.0/16",
    "10.2.0.0/16"
  ]
}

resource "aws_vpc" "this" {
  count      = length(local.vpc_cidrs)
  cidr_block = local.vpc_cidrs[count.index]
}

위 경우에 vpc id를 뽑아내려면

## 생성된 모든 vpc의 id를 list로 출력
output "vpc_ids" {
  value = aws_vpc.this.*.id
}

위와 같이 * 을 사용해 모든 id들을 list로 뽑을 수 있다

 

다만 for_each를 사용하는 경우에도 아래와 같이 아웃풋을 출력하려 하면

locals {
  vpc_cidrs = {
    0 = "10.0.0.0/16",
    1 = "10.1.0.0/16",
    2 = "10.2.0.0/16"
  }
}

resource "aws_vpc" "this" {
  for_each   = local.vpc_cidrs
  cidr_block = each.value
}

output "vpc_ids" {
  value = aws_vpc.this.*.id
}

 

ERROR...

id라는 속성값이 없다니

aws_vpc.this.* 만으로 output을 내보면

 

 

id라는 속성값이 너무나 잘 있다

좀 찾아본 결과...*는 결국 list용이고, for_each의 결과물은 map이여서 그런가보다

참조

뭐...aws_vpc.this["0"].id 이런식으로 하나씩 뽑아써도 되긴 하지만 (지금까지 그래왔고)

이러면 모듈 내의 for_each 문에 대해서 output 처리를 하나씩 할 수 없기 때문에 아래와 같이 사용해서 뽑으면 된다

 

# id들만 list로 뽑기
output "vpc_id_list" {
  value = [ for vpc in aws_vpc.this : vpc.id ]
}

# key값을 사용해 map으로 뽑기
output "vpc_id_map" {
  value = { for k,vpc in aws_vpc.this : k => vpc.id }
}

 

 

 

 

 

728x90
728x90

댓글