[AWS] NAT Gateway 대신 NAT Instance로 비용 절감하기 (2025 ver)

2025. 6. 28. 22:13·AWS

1. NAT Gateway 개념과 비용

NAT게이트웨이는 Network Address Translation 서비스로,

NAT 게이트웨이를 사용하면 프라이빗 서브넷의 인스턴스가 VPC 외부의 서비스에 연결할 수 있지만,

외부 서비스에서 이러한 인스턴스와의 연결을 시작할 수는 없도록 할 수 있다.

 

따라서 프라이빗 서브넷에 인스턴스를 둘 경우, 인스턴스가 외부 인터넷에 연결하기 위해서는 NAT가 필요하다.

(예: yum update, apt update 등)

 

이때, AWS에서 제공하는 NAT 게이트웨이를 사용하면 되지만 꽤 비싼 리소스다.

 

서울 리전 기준으로,

  • 시간당 요금은 0.059$
  • 처리된 데이터 GB당 요금은 0.059$
  • 서로 다른 리전간 데이터 전송 시 요금이 발생한다.

따라서 데이터 처리 없이 NAT Gateway를 단순히 1달동안 켜놓있기만해도 42.48 달러가 발생한다.

 

VPC 엔드포인트로도 충분히 과금이 발생하는데, 조금이라도 비용을 줄이려면 NAT Gateway는 좋은 선택이 아니다.

 

2. NAT Instance?

 

출처: https://docs.aws.amazon.com/

이를 대체하기 위한 방법으로 NAT 인스턴스가 있는데, 퍼블릭 서브넷 영역에 NAT Gateway 역할을 하는 인스턴스를 두고, 

 

프라이빗 서브넷의 라우팅테이블 구성 조작을 통해 프라이빗 서브넷의 인스턴스에서 퍼블릭 서브넷의 NAT 인스턴스로 인터넷 트래픽을 전송하는 방식이다.

 

따라서 NAT 인스턴스의 요금은 퍼블릭IP 정도만 들기 때문에, 비용적인 측면에서 훨씬 가성비 있다고 볼 수 있다.

아래 실습을 기준으로,

  • Amazon Linux 인스턴스 프리티어 요금은 1달 750시간 무료
  • Public IP주소 요금은 시간당 $0.005

1달동안 NAT인스턴스를 켜놓고 사용한다면 3.6달러가 청구된다. 

 

따라서 NAT Gateway 대신 NAT Instance를 사용한다면 약 12배(11.8) 비용절감효과를 가져올 수 있다.

 

NAT 인스턴스가 적절한 경우

  • 트래픽 규모가 작고, 비용을 조금이라도 더 절감하고 싶은 경우.
    (직접 부하테스트를 진행했을 때, 초당 600회 규모의 요청은 NAT Instance로 처리가 가능했다.)
  • 운영 부담을 감수할 수 있을 때.
  • 특정 포트 매핑, 프록시 기능 등의 커스텀 네트워크 기능이 필요할 때.

NAT Gateway가 적절한 경우

  • 안정성/관리편의성/자동확장이 비용보다 중요한 경우.
  • 트래픽의 규모가 큰 경우.

하지만, 2025년 현재 기준으로는 AWS가 NAT Instance를 위해 지원해주던 AMI가 삭제된 상황이다. ㅠㅠ

 

그래서 좀 더 번거롭지만, NAT 인스턴스 AMI를 직접 만들어서 사용하면 된다.

(AWS에서 제공하는 튜토리얼을 참고해서 실습을 진행했다.)

3. NAT Instance 생성

3.1 VPC 생성

AWS Management Console에서 사용할 VPC를 생성해준다.

 

VPC > VPC 생성

  • VPC과 서브넷을 모두 한번에 생성할 것이기 때문에, 생성할 리소스로 'VPC 등' 옵션을 선택한다.
  • 본 포스팅에서는 실습을 위한 최소 조건인 AZ1 - 퍼블릭1 - 프라이빗1 로 옵션을 선택했다.
    원하는 환경에 따라 다르게 선택해도 된다.
  • NAT Gateway는 없음 으로 선택했다. (NAT Gateway를 안쓰는 실습이니까...)

나머지 옵션은 기본으로 설정해주었다.

현재 생성된 리소스맵을 확인해보면, 퍼블릭 서브넷은 라우팅테이블이 인터넷 게이트웨이에 연결되어있는 것을 알 수 있다.

하지만, 프라이빗 서브넷은 인터넷 게이트웨이에 대한 접근이 아직 안되는 상황이다.

3.2 NAT 인스턴스에 대한 보안 그룹 생성

NAT 인스턴스에 연결할 보안그룹을 생성한다.

이 규칙을 통해 NAT 인스턴스가 프라이빗 서브넷에 있는 인스턴스로부터 오는 인터넷 트래픽을 수신할 수 있다.

또한 NAT 인스턴스는 인터넷으로 트래픽을 전송할 수 있으며 프라이빗 서브넷의 인스턴스가 소프트웨어 업데이트를 받을 수 있다.

 

VPC > 보안그룹 > 보안그룹 생성

  • VPC는 목차 3.1에서 생성한 VPC를 선택한다.
  • 인바운드 규칙에서,
    • 유형으로 HTTP, HTTPS를 선택하고 소스로 프라이빗 서브넷의 IP주소 범위를 입력한다.
      (프라이빗 서브넷으로부터 오는 트래픽을 받고자)
    • (선택) 목차 4에서 NAT 인스턴스 Ping Test를 진행한다면, 유형으로 SSH를 선택하고 소스로 클라이언트 PC의 공인 IP 대역을 입력하면 된다.
      -> https://ip.pe.kr/ 링크에서 내 IP주소를 확인할 수 있다.
    • (선택) 목차 4에서 NAT 인스턴스 Ping Test를 진행한다면, 유형으로 모든 ICMP IPv4 를 선택하고 소스로 프라이빗 서브넷의 IP 주소를 입력한다.

  • 아웃바운드 규칙에서,
    • 유형으로 HTTP, HTTPS를 선택하고 소스로 AnywhereIPv4(0.0.0.0)을 선택한다.
    • (선택) 목차 4에서 NAT 인스턴스 Ping Test를 진행한다면, 유형으로 SSH 를 선택하고 소스로 프라이빗 서브넷의 IP 주소를 입력한다.
    • (선택) 목차 4에서 NAT 인스턴스 Ping Test를 진행한다면, 유형으로 모든 ICMP IPv4 를 선택하고 소스로 AnywhereIPv4(0.0.0.0)을 선택한다.

 

3.3 NAT AMI 생성

EC2 인스턴스에서 NAT를 실행하기 위해, NAT AMI를 구성하고 해당 AMI를 사용하여 NAT 인스턴스를 시작한다.

3.3.1 AMI 인스턴스 생성

EC2 > 인스턴스 > 인스턴스 시작

  • 애플리케이션 이미지로 Amazon Linux 2023 을 선택한다.
  • 인스턴스 유형은 프리티어 사용이 되는 t2.micro를 선택했다.

  • 네트워크 설정에서는, 3.1에서 생성한 VPC와 퍼블릭 서브넷으로 선택하였다. (프라이빗 서브넷 X)
  • 보안그룹은 기존 보안그룹 선택 > 3.2에서 생성한 test-NAT-Instance를 선택하였다.
  • SSH 연결을 위해 퍼블릭 IP 자동 할당을 선택해도 되고, 나중에 탄력적 IP주소 할당으로 퍼블릭 IP 주소를 추가해줘도 된다

SSH 연결을 할 경우, 키페어를 생성한다.

3.3.2 인스턴스 연결

인스턴스 > 연결 

  • 퍼블릭 IP를 사용 가능하므로, EC2 인스턴스 연결 또는 SSH 클라이언트로 연결한다.
    (Session manager나 SSH 클라이언트 환경이라면 다르게 연결해도 상관없다.)

  • 인스턴스에 연결해서, 아래 명령어를 순서대로 수행한다.
#1 root 비밀번호 생성
sudo passwd


#2 iptable 활성화
sudo yum install iptables-services -y
sudo systemctl enable iptables
sudo systemctl start iptables


#3 ip 전달 활성화 및 재부팅 후에도 유지되도록 설정
sudo vi /etc/sysctl.d/custom-ip-forwarding.conf

net.ipv4.ip_forward=1 # /etc/sysctl.d/custom-ip-forwarding.conf 파일에 다음 내용 작성
                      # 패킷 포워딩 활성화

sudo sysctl -p /etc/sysctl.d/custom-ip-forwarding.conf # 커널에 구성 파일 적용

sudo sysctl -p /etc/sysctl.d/custom-ip-forwarding.conf 실행 결과

#4 기본 네트워크 인터페이스 확인
netstat -i

 

다음과 같이 결과가 나오는데, 여기서 enX0이 기본 네트워크 인터페이스이다. (다른값이 나올 수도 있음)

#5 NAT 구성
sudo /sbin/iptables -t nat -A POSTROUTING -o enX0 -j MASQUERADE
sudo /sbin/iptables -F FORWARD
sudo service iptables save
  • #4에서 확인한 기본 네트워크 인터페이스의 이름으로 #5명령어 내용을 채운다.
  • NAT(출발지 변환)의 기능은 프라이빗 IP로부터 나가는 패킷의 출발지 주소를 NAT 인스턴스의 공인 주소로 바꿔서 인터넷으로 보내는 것이다. 
  • 따라서 #4에서 확인한 NAT 인스턴스의 네트워크 인터페이스(enX0)로 #5에서는 나가는 패킷의 출발지를 변경하도록 하는 명령이다.

첨부된 그림에서와 같이, NAT 인스턴스를 거치면서 나가는 패킷의 출발지 IP를 NAT 인스턴스의 퍼블릭 IP로 바꿔준다. 

3.3.3 NAT AMI 생성

3.3.2의 과정으로 NAT 인스턴스로 사용할 준비를 마쳤다면, 해당 인스턴스를 AMI 이미지로 관리한다. 

Q. 왜 인스턴스 그대로 사용안하고, AMI로 사용하는가?
멀티 AZ를 사용한다면 AZ마다 NAT 인스턴스를 둬야하기 때문에 NAT 이미지로 관리하면 위의 복잡한 과정을 거치지 않아도 되므로 훨씬 편하고 단일장애점 문제를 회피하고자 Replica를 설정하기에도 편리하다는 여러 장점이 있다

 

EC2 > 인스턴스 > 작업 > 이미지 및 템플릿 > 이미지 생성

이미지 이름을 붙여줬고, 나머지는 기본 설정으로 두었다.

 

약 5분 정도 기다리면 AMI가 대기중에서 사용가능 상태로 바뀐다.

이제 이 AMI로 인스턴스를 만들 수 있게 되었다.

 

3.4. NAT 인스턴스 시작

3.4.1 NAT 인스턴스 생성

EC2 > 인스턴스 > 인스턴스 시작

  • 인스턴스의 이미지를 3에서 직접 생성한 NAT AMI로 선택해준다.
  • 퍼블릭 IP 자동할당을 활성화하거나, NAT 인스턴스 시작 후 탄력적 IP를 할당해도 된다.
    (퍼블릭IP는 무조건 필요)
  • 나머지 설정(VPC, 서브넷, 보안그룹, ssh키) 등은 AMI 설정때와 모두 동일하게 선택한다.

3.4.2 원본/대상 확인 비활성화

인스턴스 > 작업 > 네트워크 > 소스 대상 확인 변경

  • 소스/대상 확인의 '중지'를 선택하고 저장한다.

3.4.3 라우팅 테이블 업데이트

VPC > 라우팅 테이블 > 프라이빗서브넷에 대한 라우팅 테이블 선택 > 라우팅 > 라우팅 편집

  • 첫번째 대상으로 0.0.0.0/0, 두번째 대상으로 인스턴스를 선택하고 아래에서는 NAT인스턴스의 ID를 입력한다.

 

 

4. NAT인스턴스 테스트

위의 과정을 통해 NAT인스턴스로 활용하기 위한 준비는 모두 끝났다!

NAT인스턴스가 정상적으로 작동하는지 확인하기 위해, 테스트를 진행하고자 한다.

< 참고 >
목차 3.2에서 '선택' 항목으로 작성되어있던 SSH, ICMP에 대한 인바운드&아웃바운드 설정을 모두 마쳐야 다음 실습이 가능하다.

 

4.1 테스트 인스턴스용 보안그룹 생성

EC2 > 보안그룹 > 보안그룹 생성

  • 인바운드 규칙은, 유형은 SSH 를 선택하고 소스는 NAT 인스턴스의 퍼블릭IP주소를 입력한다.
  • 아웃바운드 규칙은, 유형은 모든 ICMP IPv4를 선택하고 소스는 AnywhereIPv4(0.0.0.0)을 선택한다.

 

4.2 테스트 인스턴스 생성

EC2 > 인스턴스 > 인스턴스 시작

  • VPC는 목차 3.1에서 생성한 VPC를 선택해주고, 서브넷은 private 서브넷으로 선택한다.
  • 퍼블릭 IP 자동할당은 '비활성화'해준다. 
  • 보안그룹은 목차 4.1에서 생성한 보안그룹을 선택해준다.

  • 인스턴스 이미지는 ubuntu를 선택했다.
  • SSH키는 NAT 인스턴스에서 사용하는 것과 동일한 SSH키를 선택한다.

 

4.3 테스트 진행

#1 로컬 환경에서 AllowAgentForwarding 구성
ssh-add key.pem

#2 NAT 인스턴스 ssh 접속
ssh -A ec2-user@nat-instance-public-ip-address

#3 NAT 인스턴스 ping 인터넷 연결 테스트
[ec2-user@ip-10-0-4-184]$ ping ietf.org

NAT 인스턴스에 SSH 접속을 하여, ping 테스트를 진행한다.

이를 통해 NAT 인스턴스에 인터넷 액세스 권한이 있는지를 확인한다.

NAT 인스턴스에서 ping test

#4 NAT 인스턴스 -> 프라이빗 인스턴스 SSH 접속
[ec2-user@ip-10-0-4-184]$ ssh ec2-user@private-server-private-ip-address

#5 프라이빗 인스턴스에서 ping 인터넷 연결 테스트
[ec2-user@ip-10-0-135-25]$ ping ietf.org

프라이빗 인스턴스에서 ping test

위의 ping 테스트를 통해, 프라이빗 인스턴스에서 인터넷 연결이 성공적으로 되었다 것을 확인할 수 있다!!

 

 


+) 블로그 글 포스팅을 마치고 확인했는데, 마침 블로그 전체 조회수가 "8080" 찍혔다 ㅎㅎ

'AWS' 카테고리의 다른 글

[AWS] EC2 -> Amazon Aurora for RDS Serverless 생성 및 연결  (1) 2025.07.02
[AWS] 탄력적 IP 주소 v.s. 자동 할당 IP 주소  (1) 2025.06.28
[AWS][트러블슈팅] TargetGroup Unhealthy, 504 Bad Gateway 문제 해결  (2) 2025.06.28
[AWS][트러블슈팅] ALB의 Internet-facing vs Internal  (0) 2025.06.26
Artillery 부하테스트  (0) 2025.06.21
'AWS' 카테고리의 다른 글
  • [AWS] EC2 -> Amazon Aurora for RDS Serverless 생성 및 연결
  • [AWS] 탄력적 IP 주소 v.s. 자동 할당 IP 주소
  • [AWS][트러블슈팅] TargetGroup Unhealthy, 504 Bad Gateway 문제 해결
  • [AWS][트러블슈팅] ALB의 Internet-facing vs Internal
공부하는 나무꾼
공부하는 나무꾼
  • 공부하는 나무꾼
    헤맨 만큼 내 땅이다
    공부하는 나무꾼
  • 전체
    오늘
    어제
  • 글쓰기/관리
    • 분류 전체보기
      • AWS
      • SAA-C03
      • 네트워크 보안
      • 최신정보보안이론
      • 컴퓨터네트워크
      • OpenFaaS
      • C++
      • Java
      • HTML, CSS
      • 자료구조
      • 알고리즘
      • 정보보안인재양성
      • [MAC]트러블슈팅&Tip
      • 공부
      • Web(Django)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    등록번호
    aws-c03
    Web Server
    java #자바 #객체지향프로그래밍 #복습
    웹애플리케이션서버
    AWS
    SAA-C03
    WAS
    웹클라이언트
    웹서버
    web application server
    자격증
    클라우드
    cloud
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
공부하는 나무꾼
[AWS] NAT Gateway 대신 NAT Instance로 비용 절감하기 (2025 ver)
상단으로

티스토리툴바