// add_route 변수와 aws_private_route_table 을 활용해 새로운 로컬 변수 생성
locals {
add_route = [
for pair in setproduct(aws_route_table.private_routing_tables, var.add_route) : {
route_table_id = pair[0].id
destination_cidr_block = pair[1].dst_cidr
create_route = pair[1].create_route
route_table_name = pair[0].tags.Name
}
]
}
setproduct 와 for 반복문을 함께 돌려서 ' : ' 뒤에 내가 원하는 값을 넣어주었다. route_table_id 는 aws_route_table.private_routing_tables.id 값 destination_cidr_block 은 var.add_route 의 dst_cidr 값
해당 원리를 이용하면 어떤 식으로든지 원하는 리스트를 생성해낼 수 있다. 해당 변수의 값은 다음과 같다.
딱 봐도 내가 원하는 대로 2*3 의 모든 경우의 수가 들어가있는 것을 확인할 수 있다. 또한, for_each 반복문을 돌리기 예쁘게 출력되어 있다.
다만 for_each 는 기본적으로 List 타입을 지원하지 않으니 해당 값을 map 형식으로 바꾼 후에 반복을 돌려야한다.
resource "aws_route" "add_route" {
for_each = {
for pair in local.add_route :
"${pair.route_table_name}:${pair.destination_cidr_block}" => pair
if pair.create_route == true
}
route_table_id = each.value.route_table_id
destination_cidr_block = each.value.destination_cidr_block
transit_gateway_id = data.aws_ec2_transit_gateway_attachment.tgw_attachment.id
}
for_each 를 위해 생성한 로컬 변수를 for 반복문을 사용하여 map 형식으로 바꿔주었다. 유일한 map object 명을 지정하기 위해 "${pair.route_table_name}:${pair.destination_cidr_block}" 를 사용했다.
또한, 각 서브넷 마다 TGW 로 보내는 라우팅을 생성할지 말지 선택하기 위해 if 조건문을 부여했다.
for_each 를 돌리기 위해 map 형식으로 치환한 값이 궁금하면 아래의 사진을 참고해보자.
Cartesian Product 반복이 종료된 결과 화면이다.
주의 사항
route_table 내 dynamic route 와 aws_route 을 함께 사용하면, plan 및 apply 시 라우팅 누락이 발생
원인은 Dynamic Route 은 변경이 되면 route_table 자체를 재생성하게 되고,
aws_route 는 기존의 route_table 에 라우팅 설정을 추가하고 제거하는 것이기 때문.