FCK-NAT로 NAT-Gateway 비용 줄이기

시작하며

안녕하세요. 파이썬과 함께 데이터를 주무르고 있는 주니어 개발자 입니다.

최근 스터디를 진행 하며 NAT 게이트웨이에서 발생한 비용을 어떻게 절감 시킬 수 있을지 고민 했었습니다.

NAT 게이트웨이는 생성 한 시점 이후부터 비용이 발생 하기 때문에 이용하는 내부 서비스가 “외부 망과 항시 통신을 이뤄내야 할까?” 라는 질문을 던졌고 그 결과 꽤 괜찮은 솔루션를 찾았습니다.

이 글을 읽는 예상 독자는 사이드 프로젝트를 진행 하며 NAT Gateway 비용이 부담스러워 외부 망에 서비스를 몰아 넣었던 개발자입니다.

내부 서비스를 구성 하는 이유

외부에서 데이터베이스에 직접 접근 하게 되는 경우 해당 블로그와 같은 보안문제를 겪을 수 있습니다.

그렇기 때문에 흔히 사용 되는 multi tier architecture 방식으로 구성 하며 WEB — WAS — DB 형태가 가장 쉽게 접할 수 있는 구조입니다.

aws.amazon.com
https://aws.amazon.com/ko/blogs/database/deploy-aws-dms-in-a-multi-tiered-secure-network-using-an-nginx-proxy-server/

이런 내부 서비스에서 인터넷망을 사용 해야 하는 이유는 무엇일까요?

등 인터넷 망을 쓸 이유가 굉장히 많을텐데 가장 간단한 이유만 살펴봐도 NAT Gateway의 필요성을 알 수 있습니다.

해결 방안

docs.aws.amazon.com
https://docs.aws.amazon.com/ko_kr/vpc/latest/userguide/VPC_NAT_Instance.html

NAT 인스턴스를 이용 하면 보다 저렴한 비용에 인터넷 통신을 만들어 낼 수 있습니다.

이 방식은 EC2 유형에 따라 비용이 발생 하는 것이기 때문에 큰 대역폭이 아니라면 가장 작은 사양인 nano로 설정 했을 때 해결 할 수 있는 문제였죠.

하지만, 위 사진에서 볼 수 있듯이 AMI가 2018년 Amazon Linux 버전을 기반으로 구축 되어있다고 합니다.

최신 운영체제의 도움을 받지 못하는 상황이 발생 했고, 이 문제는 당장 나타나지 않지만 추후에 어떤 문제를 발생 시킬지 예상 할 수 없기 때문에 쉽게 NAT 인스턴스 도입이 꺼려지게 됩니다.

그렇다면 최신 운영체제를 지원 하는 NAT 인스턴스를 사용하면 이 문제를 쉽게 해결 할 수 있겠죠. 그렇게 구글링 하며 얻은 정보는 바로 fck-nat 입니다.

NAT 인스턴스를 매니징 하는 솔루션 fck-nat

fck-nat.dev
https://fck-nat.dev/stable/

공식문서의 본문만 읽어보더라도 비싼 NAT Gateway를 쓰고 있다면 주저 말고 fck-nat를 쓰게 만들어버리는 문구들이 많습니다.

그 중 특히 비용과 관련 된 비교 내용인데요. 이 내용을 테이블표로 정리한 것을 보면 엄청난 차이가 나타납니다.

fck-nat.dev
https://fck-nat.dev/stable/choosing_an_instance_size/

한 달에 $3.06 인데요. NAT 게이트웨이를 이용 하면 데이터 전송 비용을 빼고도 최소 $40 이상의 예상 금액이 산정 되는 것으로 알고 있습니다.

엄청난 절감을 나타내고 있는데, 그렇다면 fck-nat가 과연 프로덕션에서 사용 해도 될 솔루션인가? 라고 묻는다면 그건 아닙니다.

공식 문서에서도 얘기 하고 있지만, 대역폭이 큰 작업을 이루거나 Unmanaged 특성 상 재해나 중단에 관련 하여 예민 한 경우 NAT 게이트웨이가 더 나은 선택이라고 가이드 합니다.

하지만, 최소 비용으로 운영 하는게 목표이기 때문에 주저 없이 NAT 인스턴스를 선택 하였습니다.

FCK-NAT 인스턴스 프로비전 하기

해당 챕터의 모든 가이드는 공식 문서를 준수 하여 만들어졌습니다.

내용은 여기에서 확인 할 수 있습니다.

필요한 사전 리소스 목록

EC2 생성

  1. AMI를 선택 합니다.

현재 이미지에서 “fck-nat-al2023-hvm-1.3.0–20240125-x86_64-ebs” 를 사용 하였습니다. AMI 검색 후 Community AMIs 에서 가장 최신 이미지를 선택 하면 최신 운영체제를 지원 받을 수 있습니다. 이미지와 관련 된 내용은 fck-nat 공식 깃허브에 Issue로 관리하고 있습니다.

aws-ami

aws

2. Instance Type을 설정 합니다.

본문 fck-nat에서 제공 하는 대역폭 별 금액표를 참고 하여 인스턴스 유형을 설정합니다. 업데이트 하는 작업에서 큰 대역폭이 필요 없기 때문에 가장 작은 스펙인 “t3.nano” 를 선택 하였습니다.

aws

3. 네트워크를 설정 합니다.

aws

EC2의 ENI — source/destination check disable

AWS EC2의 ENI는 기본적으로 “source/destination check”이 활성화 되어있습니다.

해당 옵션은 자신에게 향하는 패킷만 처리 할 수 있지만 이 옵션을 비활성화 하는 경우 다른 목적지로 가야하는 패킷도 라우팅 할 수 있게 됩니다.

자세한 내용은 AWS 의 네트워크 인터페이스 개념 공식 문서를 확인 해주세요.

Private Only Routing Table과 NAT Instance 연결 하기

내부 망에서 인터넷 망 통신을 위해 전체 대역폭을 허용 하고 NAT 인스턴스를 연결 합니다.

테스트 하기

내부 서비스가 NAT 인스턴스의 Public IP를 통해 인터넷 망과 통신 하는지 테스트 해봅시다.

공인 아이피를 조회 해보면 “13.125.xxx.xxx” 가 나온 걸 볼 수 있습니다.

NAT 인스턴스의 공인 아이피를 정확히 반환 받은 걸 알 수 있습니다.

요약

  1. NAT 인스턴스를 활용 하면 NAT 게이트웨이보다 90% 가량의 금액을 절감 시킬 수 있습니다.
  2. AWS 에서 제공 하는 NAT 인스턴스 AMI는 2018년 Amazon Linux로 구성되어 있기 때문에 최신 운영체제 이미지를 지원하는 fck-nat를 이용합니다.
  3. NAT 인스턴스를 설정하면 내부 서비스에서 공인 아이피를 조회 했을 때 NAT 인스턴스의 공인 IP를 통해 인터넷 망과 통신을 하는 것을 확인 할 수 있습니다.

Refference

AWS에서 NAT Gateway의 비용을 낮춰보자!
https://spicyjo.tistory.com/48
How to Enable Cost-Effective Internet Access for AWS Lambda in a VPC?
https://stackoverflow.com/questions/78593403/how-to-enable-cost-effective-internet-access-for-aws-lambda-in-a-vpc