...
NAT 인프라
AWS에서 네트워크를 설계할때 NAT의 사용은 필수적이다.
보안상 서버들을 외부에서 접근할 수 없고 확인할 수 없도록 해야하기 때문이다.
그래서 VPC 인프라를 구축할때 Public 서브넷과 Private 서브넷을 만들어 그안에 EC2 인스턴스를 두고, Bastion Host를 통해 Public 서브넷에서 Priavate 서브넷으로 접속한후, NAT Gateway를 통해서 외부 인터넷 소스를 사설망에서 받는 식으로 운용된다.
그래서 처음에는 AWS에서 강력하게 밀어주는 최신식 NAT Gateway 서비스를 이용해서 손쉽게 사설망 외부 통신을 하지만, 간과한 것이 있으니, 바로 비용 문제 이다.
NAT 게이트웨이는 서울 지역 기준으로 시간당 0.059달러의 비용이 발생하는데, 이걸 24시간 가동하고 있으면 그야말로 요금 핵폭탄을 맞게 된다.
반면, NAT 인스턴스는 EC2 인스턴스를 NAT용으로 설정해 사용하는, 이른바 불안정하고 한물 간 구식 기술이지만 요금을 거의 1/3 수준으로 낮출수 있다는 점에서 눈길을 사로 잡았다.
만일 프리티어 인스턴스 요금제를 쓴다면 무료로도 사용할수도 있다.
따라서 토이 프로젝트를 하는 입장에서는 퍼블릭 서브넷 기능만 있으면 되므로 고민없이 NAT 게이트웨이에서 NAT 인스턴스로 전환 작업에 들어가는걸 권하는 바이다.
※ 만일 NAT과 NAT Gateway에 대한 개념이 부족하다고 생각된다면, 다음 포스팅을 참고해보자!
NAT 인스턴스
NAT Instance는 EC2 Instance를 NAT용으로 바꿔 사용하는 것을 말한다.
그래서 NAT Gateway와 인프라 구성이 약간 달라지는데 다음 그림을 보며 비교해보자.
NAT Instance vs NAT Gateway
NAT Gateway
NAT 게이트웨이 인프라 구성을 보면, Public 서브넷 안에 NAT 게이트웨이가 위치해 있으며 EIP를 통해 외부와 통신하게 된다.
그리고 외부의 트래픽을 Private 서브넷의 route table에 적힌 nat-gatewat-id에 따라 사설망으로 들여보내 통신할수 있는 것이다.
NAT Instance
NAT 인스턴스도 크게 다르지 않다.
인프라 구성을 보면, Public subnet에 NAT instance가 위치하게 된다. 그리고 EIP를 부여 받아 외부의 트래픽을 받는다.
단, Private 서브넷의 route table에 nat-instance-id 가 설정 되어 있다는 점이 다르다.
NAT Instance / Gateway 정리
- NAT Instance : 그냥 EC2 라고 생각하면 된다. 특별한 AMI를 설치한 EC2라고 보면 된다. 그래서 꺼지면 죽는다.
- NAT Gateway : aws에서 제공하는 하나의 서비스이다. 고가용성이 보장되고있어서 죽지를 않는다.
NAT Instance | NAT Gateway |
단일 인스턴스 | AWS에서 제공하는 서비스 |
= EC2 | = 서비스 |
꺼지면 죽음 | 꺼져도 죽지않음(고가용성 보장) |
보안그룹 영향 받음 | 보안그룹 영향 받지않음 |
예전 스타일 | 요즘 스타일 |
Source/Destination을 해제해야 함 | |
Bastion을 겸할 수O | Bastion을 겸할 수X |
Public Subnet에 있어야 함 | Public Subnet에 있어야 함 |
NAT 인스턴스 구축하기
해당 강의에선, 미리 Public / Private 서브넷을 구축하고 인터넷 게이트웨이를 라우팅 테이블에 연결해 외부 통신을 구축된 인프라를 기준으로 진행한다.
따라서 아직 VPC 인프라 구성 개념이 잘 안잡히신 분들은 다음 강의를 참고해보길 권한다.
NAT 인스턴스 만들기
NAT 인스턴스도 일종의 EC2 인스턴스이다.
EC2 인스턴스를 만들어 주자.
NAT 인스턴스의 소스/대상 확인변경 끄기
NAT 인스턴스의 소스/대상 확인변경을 Disabled로 변경한다.
NAT 인스턴스는 소스 또는 대상이 그 자체가 아닐 때 트래픽을 송수신할 수 있어야 하기 때문이다.
NAT 인스턴스에 탄력적 IP 주소 할당
탄력적 IP 주소를 생성해 방금 만든 인스턴스에 연결해주면, 해당 인스턴스의 IP주소는 절대 바뀌지 않는 고정 IP주소가 된다.
이 작업을 해주지 않으면, EC2 인스턴스를 재부팅 했을 경우 IP주소가 변하게 된다.
주의
EIP는 AWS에게 IP주소를 빌려오는 개념이기 때문에 EIP에 인스턴스를 연결해주지 않고 비워두면 오히려 요금이 부과되는 형태이다.
EIP에 실행중인 인스턴스를 연결해두어야 과금이 되지 않는다.
만약 EC2 인스턴스를 릴리즈(종료)할 것이라면, 꼭 EIP도 릴리즈(종료) 해줘야 과금이 안된다.
Private 서브넷 라우팅 테이블 설정
이제 NAT instance를 생성했으니, 0.0.0.0/0 트래픽을 NAT를 통해 들어올 수 있도록 라우팅 테이블에 추가하면 된다.
Routing Table 이란
IP주소에 트래픽 라우팅 경로를 정의하여 Subnet 안팎으로 나가는 트래픽에 대한 라우팅 경로 설정 기능을 수행
NAT 인스턴스의 한계
본문 초반에는 요금 하나만 보고 NAT 인스턴스를 찬양했지만, 사실 그렇게 썩 뛰어난 녀석은 아니다.
AWS가 NAT 게이트웨이를 추천하는 것도, 수입 측면에서도 있겠지만 성능이나 유지관리에 있어서 EC2 instance보다 훨씬 뛰어나기 때문이다.
NAT 인스턴스로 구성하는것은 단일 인스턴스에 단일 AZ이기 때문에 병목현상에 취약하고, 문제발생시 Private Subnet 안의 모든 서비스가 인터넷 엑세스를 잃게 된다.
NAT 인스턴스도 일종의 EC2라서 Auto scaling group에 추가하거나 multiple AZ과 multiple Route out to internet을 가질 수 있지만, 결국 점점 복잡해질 뿐이다.
서비스 특성상 다량의 트래픽이 발생하거나 혹시 모를 EC2 instance의 장애를 생각해보면 안정성에 있어서 유리한 NAT gateway를 사용하는 것이 서비스 품질에 있어서 더 좋을수 있다.
하지만 완전관리형, 고가용성의 NAT 환경이 필요하지 않은 경우라면 NAT Instance로도 무리없이 사용이 가능하다.
# 참고자료
https://docs.aws.amazon.com/ko_kr/vpc/latest/userguide/vpc-nat-comparison.html
https://galid1.tistory.com/367
https://kim-dragon.tistory.com/18
이 글이 좋으셨다면 구독 & 좋아요
여러분의 구독과 좋아요는
저자에게 큰 힘이 됩니다.