[AWS] NAT Gateway 비용 절감 — AMI로 NAT 인스턴스 구축 (1부)

글의 개요 — NAT Instance 구성 (비용 절감)

  1. Why NAT Instance (NAT Gateway 대신) — 1부
  2. AWS가 제공하는 NAT Instance AMI 이용 — 1부
  3. IP-tables로 NAT Instance 직접 구성 — 2부

이번 1부에서는 AWS 커뮤니티에서 제공되는 NAT Instance AMI를 이용한다. IP-Tables로 직접 NAT Instance를 구성하려면 2부를 참고하면 된다.

[AWS] NAT Gateway 비용 절감 — iptables로 NAT 인스턴스 직접 구축 (2부)
1부의 커뮤니티 AMI는 OS가 구형(EOS)이라 유지가 어렵다. 2부에서는 최신 Ubuntu에 직접 iptables(IP 포워딩 + MASQUERADE)를 설정해 NAT 인스턴스를 구축하고, 재부팅에도 규칙이 유지되게 한다.
taystudios.com/blog

NAT Gateway & NAT Instance?

AWS에서 네트워크·애플리케이션 아키텍처 구성을 맡으며 그린 네트워크 구성도는 아래와 같다.

NAT Gateway 대신 NAT Instance(EC2)를 이용한 Private Subnet 인터넷 연결 아키텍처 그림 1. NAT Gateway 대신 NAT Instance(EC2)로 Private Subnet을 인터넷에 연결

원래 사설망(Private Subnet)이 인터넷과 통신하려면 NAT Gateway가 필요하다. 하지만 이번 구성에서는 Public Subnet에 NAT Gateway를 따로 두지 않고, EC2(NAT Instance)로 Private Subnet의 인터넷을 연결하면서 동시에 Reverse Proxy 서버와 Bastion 서버 역할까지 겸하게 했다.

NAT Instance의 장단점은 다음과 같다.

장점

  • NAT Gateway를 직접 쓰지 않으므로 비용을 줄일 수 있다. 어차피 Proxy/Bastion 서버를 둘 거라면, 그 서버로 인터넷을 연결한다는 취지다.

단점

  • Proxy 서버가 셧다운되거나 이상이 생기면 Private Subnet의 인터넷이 끊긴다. (애플리케이션 아키텍처상 Proxy가 죽으면 뒤 서비스도 공급이 안 되는 게 맞다고 판단.)
  • AWS NAT Gateway처럼 고가용성·확장성·보안·패치 관리를 보장해주지 않는다. 즉 OS 버전·보안 등을 직접 관리해야 한다. (사실상 NAT Gateway를 쓰는 이유.)

위 단점에도 NAT Instance를 직접 구성한 이유는 프로젝트 스케일이 크지 않았고, 무엇보다 비용을 줄여야 했기 때문이다. (NAT Gateway는 대략 월 기본 $32 + 트래픽 추가 요금.)

AWS에서 NAT Instance를 만드는 방법은 크게 두 가지다.

방법 1. AWS 커뮤니티 제공 AMI 이용

1) AMI로 NAT Instance 생성

EC2 생성 창에서 '더 많은 AMI 찾아보기' 선택 그림 2. EC2 생성 창에서 '더 많은 AMI 찾아보기' 선택

EC2 생성 창에서 '더 많은 AMI 찾아보기'를 클릭한다.

커뮤니티 AMI 탭에서 amzn-ami-vpc-nat 검색 그림 3. 커뮤니티 AMI 탭에서 검색

커뮤니티 AMI 탭에서 amzn-ami-vpc-nat로 검색한다. region마다 등록된 AMI가 다른데, 서울 region에서는 여러 개가 나온다. 이 중 게시 날짜가 가장 최근인 AMI를 선택했다.

선택한 NAT AMI로 EC2(NAT Instance) 생성 화면 그림 4. NAT Instance 생성

AMI를 선택하면 그림 4처럼 해당 AMI에 맞는 CPU 아키텍처(여기선 x86_64)·스토리지 형식 등이 표시되고, 인스턴스 유형을 고를 수 있다. 이렇게 EC2를 생성하면 그 인스턴스는 외부에서 오는 트래픽을 다른 destination으로 pass하도록(=NAT Gateway 역할) 이미 설정돼 있다.

참고: SSH 접속 시 username은 그림 4처럼 ec2-user로 표기돼 있다.

EC2는 본인 VPC의 Public Subnet에 위치시킨다. Public Subnet의 라우팅 테이블은 당연히 인터넷 게이트웨이에 연결돼 있어야 하고, VPC 내부 local 통신도 되어야 한다. 보안은 보안그룹·NACL로 설정하길 권장한다. (AWS 기본 개념은 이 글에서 세부적으로 다루지 않고 언급만 한다.)

Public Subnet 라우팅 테이블 (인터넷 게이트웨이 연결) 참고 그림. Public Subnet 라우팅 테이블 — 인터넷 게이트웨이와 연결돼 있어야 외부 통신 가능

2) Private Subnet 라우팅 & NAT Instance 콘솔 설정

NAT Gateway를 쓸 때도 Private Subnet에 매핑된 라우팅 테이블에서 NAT Gateway와 연결해 줬다. NAT Instance도 같은 작업이 필요하다.

Private Subnet 라우팅 테이블에서 대상을 NAT 인스턴스로 설정 그림 5. Private Subnet 라우팅 테이블 설정

Private Subnet 라우팅 테이블에서 대상을 '인스턴스'로 설정하고, 위에서 만든 NAT Instance를 선택한다(예: nat-instance). Private Subnet에서 인터넷으로 나가는 모든 트래픽이 NAT Instance를 거친다는 의미다.

대상이 eni-로 시작하는 ENI(네트워크 카드) 매핑 참고 그림. 네트워크 카드(ENI) 연결

설정 후 대상이 eni-로 시작하는데, 이는 Elastic Network Interface로 네트워크 카드 리소스와 직접 매핑된다. OS 레벨에서 2계층(데이터 링크)·3계층(네트워크)을 거쳐 다른 대상으로 트래픽을 전달함을 유추할 수 있다. (커뮤니티 AMI에 이 설정이 돼 있다.)

이번엔 EC2 인스턴스 자체 설정을 바꾼다. EC2 대시보드에서 nat-instance를 클릭 → 우측 상단 '작업' → '네트워킹' → '소스/대상 확인 변경'을 클릭한다. (라우팅 테이블 외에 인스턴스 설정도 바꿔야 한다.)

NAT 인스턴스 작업 > 네트워킹 > 소스/대상 확인 변경 메뉴 그림 6. NAT Instance 네트워킹 설정 변경

소스/대상 확인 '중지' 라디오 버튼 선택 그림 7. 소스/대상 확인 — '중지' 선택

그림 7처럼 소스/대상 확인에서 '중지'를 선택한다. AWS는 트래픽이 대상 EC2에 도달하지 않으면 버리는 방식이라, 특정 인스턴스를 통해 다른 인스턴스로 트래픽을 우회시키려면 이 설정이 필요하다.

필수 — 기본 보안그룹은 보통 SSH만 열려 있다. 최소한 통신할 수 있게 보안그룹을 설정해야 한다.

Private EC2 보안그룹 인바운드 설정 참고 그림. Private EC2 보안그룹 (예시로 모든 트래픽 허용)

여기서는 보여주기 위해 Private Subnet EC2의 보안그룹을 모든 트래픽 허용으로 설정했다. 실제로는 프로젝트 정책에 맞게 설정하면 된다.

또한 이번엔 Elastic IP를 설정하지 않았는데, EIP 없이도 NAT Instance의 public IP만 활성화돼 있으면 임의 IP가 붙는다. DHCP 정책상 EC2를 껐다 켜면 public IP가 바뀌지만, 계속 켜둘 거라면 EIP 없이도 무방하다.

NAT Instance 구축 결과

NAT Instance 연결 전 — apt-get update 실패 그림 8. NAT Instance 연결 전

NAT Instance 연결 후 — apt-get update 정상 그림 9. NAT Instance 연결 후

연결 전에는 sudo apt-get update로 Debian 계열 apt 저장소 업데이트가 안 되지만, 연결 후에는 정상적으로 받아지는 것을 확인할 수 있다.

맺음말

AWS 커뮤니티의 NAT 인스턴스용 AMI를 쓰면 별다른 설정 없이 NAT 인스턴스를 구축할 수 있다. 하지만 이 AMI는 오래된 OS 버전을 쓰고 서비스 종료(EOS) 상태다. 패키지 수동 다운로드 시 필요한 파일을 찾기 어렵고 지원 사이트도 제한적이라, 유지 관리가 매우 힘들고 NAT 기능 외 다른 용도로 쓰기 어렵다.

나는 NAT 인스턴스를 Reverse Proxy 서버로도 쓰려 했기에 OS 버전 관리가 중요하다. 최소한 HTTPS를 위한 인증서 패키지가 제공돼야 하는데 위 AMI는 이를 지원하지 않았다. 그래서 2부에서는 AWS 최신 OS 기반으로 직접 NAT 인스턴스를 구축하는 방법을 다룬다.

[AWS] NAT Gateway 비용 절감 — iptables로 NAT 인스턴스 직접 구축 (2부)
1부의 커뮤니티 AMI는 OS가 구형(EOS)이라 유지가 어렵다. 2부에서는 최신 Ubuntu에 직접 iptables(IP 포워딩 + MASQUERADE)를 설정해 NAT 인스턴스를 구축하고, 재부팅에도 규칙이 유지되게 한다.
taystudios.com/blog

📦 이 글은 제가 운영하던 티스토리 블로그에서 옮겨온(migration) 글입니다. 원문: taehyuklee.tistory.com/27

이 글 공유𝕏f

댓글