Network Firewall Terraform 모듈로 구축시 이슈
- Aws
- January 23, 2024
테라폼으로 Network Firewall 구축시 상당히 애를 많이 힘들었습니다.
겪었던 문제는 2가지로
- Network Firewall의 엔드포인트를 찾기 힘듬.
- VPC 서브넷 라우팅테이블에 Network Firewall 엔드포인트로 라우팅 하독록 생성할 떄 엔드포인트가 서브넷과 같은 Zone의 엔드포인트가 아닌 다른 Zone의 엔드포인트로 라우팅 테이블이 만들어짐.
많은 시도 끝에 문제는 해결 하였고 아래의 링크에서 많은 도움을 받았습니다.
우선 1번째 에러의 원인은 Network Firewall의 Attribute가 Map안에 Map구성으로 되어 있어 기존 방식 처럼 출력 하기가 어려웠습니다.
무슨말이냐 하면 만약 인스터스를 테라폼으로 만들고 그 인스턴스의 id를 출력하려고 하면 아래의 코드로 간단하게 출력하면 됩니다.
aws_instance.example.id
반면에 network firewall에서 원하는 endpoint_id를 뽑고 싶다 하면
이렇게 인덱스와 딕셔너리를 타고 타고 들어가야 합니다.
firewall_status[0].sync_states[0].attachment[0].endpoint_id
진짜 힘들게 했던건 2번째 문제 였습니다 attachment 딕셔너리 안에있는 endpoint_id가 예상하는 인덱스로 되어있지 않고 불규칙하게 출력되는 것입니다.
왜 그런가 하면 attachment에서 출력되는 sync_states의 출력 순서가 아마 subnet id인데 나열 기준이 subnet_id의 알파벳 순서로 추정됩니다.
즉 만약 azone에 있는 subnet id가 “subnet-967cxxx” 이고 bzone에 있는 subnet id가 “subnet-02afcxxx이면 B zone이 attachment[0]이 될수도 있는게 이건 저의 의견입니다.
이와 관련된 Terraform 내용은 아래의 이미지를 참고 하면됩니다.
그럼 결국 테라폼에서 라우팅 테이블을 만들때 항상 같은 가용영역으로 network firewall의 endpoint를 입력하고 싶다면 아래 처럼 if 문으로 가용영역을 일치 출력해야한다.
(아래 코드는 예시로 aws_subnet.network_firewall은 항상 azone, bzone, czone이렇게 규칙적으로 만들기에 가용영역을 일치 시킬 수가 있다.)
vpc_endpoint_id = element([for ss in tolist(var.network_firewall_firewall.firewall_status[0].sync_states) : ss.attachment[0].endpoint_id if ss.attachment[0].subnet_id == aws_subnet.network_firewall[count.index % length(var.avaliable_zones)].id], 0)