(시리즈3) AWS를 이용한 클라우드 네이티브 어플리케이션 인프라 구축 (5) - NAT Gateway → NAT Instance 로 대체해서 비용 절약하기(FinOps) step by step

msyhu·2021년 6월 7일
1
post-thumbnail

이번 글에서는 NAT Gateway 대신 NAT Instance를 이용해서 비용을 0로 만든 사용기에 대해 써 보겠습니다.

선정 이유

web scrapping 서비스는 하루에 한 번만 가동되면 되므로, FaaS 서비스인 AWS Lambda 에서 구동됩니다. 그런데 scrapping을 하려고 하니, timeout 에러가 나면서 scrapping 대상 사이트에 connection 이 안 되는 현상이 발생했습니다. 원인을 찾다가, 공식 문서 에서 그 답을 찾을 수 있었습니다.

함수에 인터넷 액세스 권한을 부여하려면 연결된 VPC의 퍼블릭 서브넷에 NAT 게이트웨이(또는 NAT 인스턴스)가 있어야 합니다.

그래서 처음에는 AWS NAT Gateway 서비스를 이용해서 손쉽게 문제를 해결했습니다. 그런데 간과한 것이 있으니, 바로 비용이였습니다. 서울 지역 기준으로 시간당 0.059달러의 비용이 발생하는데요, 이걸 24시간 가동하고 있다 보니 며칠만에 상당한 값으로 요금이 불어나 있었습니다.😥

더이상 두고 볼 수 없어서 인터넷 검색 결과, NAT 인스턴스를 사용해서 비용을 줄일 수 있다는 것을 알게 되었습니다. 비교 글에 따르면 NAT 게이트웨이의 장점에 대해 이것저것 써 있지만 토이 프로젝트를 하는 입장에서는 퍼블릭 서브넷 기능만 있으면 되므로 고민없이 전환 작업에 들어갔습니다.😊

기술 소개

공식 문서에 따르면, NAT Instance 는

자체 네트워크 주소 변환 AMI 인스턴스를 생성하여 VPC의 퍼블릭 서브넷의 EC2 인스턴스에서 NAT 인스턴스로 실행하여 프라이빗 서브넷에 있는 인스턴스가 인터넷 또는 다른 AWS 서비스로의 아웃바운드 EC2 트래픽을 시작하되, 인터넷 상의 누군가가 시작한 인바운드 트래픽은 인스턴스가 수신하지 못하게 막을 수 있습니다.

라고 합니다. 제 상황에서는 어플리케이션이 scrapping 을 하기 위해 VPC 밖으로 나갈 때 NAT 인스턴스를 경유함으로써 퍼블릭 IP 주소를 통해 데이터를 주고 받을 수 있게 된다는 것으로 이해가 됩니다.

이 그림의 라우팅 메인 테이블에서 보이듯, 0.0.0.0, 즉 이미 지정된 주소를 제외한 모든 주소를 nat 인스턴스로 보내라고 하고 있습니다. 그리고 NAT 인스턴스가 있는 커스텀 라우팅 테이블에서는 모든 주소를 게이트웨이로 보내라고 하고 있습니다.

즉, 우리가 할 일은 위의 그림과 같이

  1. AZ별로 서브넷을 하나씩 만들기
  2. 서브넷 하나에 NAT Instance를 만들고 Custom Route Table, Elastic IP 설정하기
  3. 나머지 서브넷에 Main Route table 만들기
  4. 서비스들(Lambda, RDS)을 위에서 구성한 VPC로 옮기기

가 되겠습니다.👊

그러면 위 그림을 가이드로 삼아, 차근차근 진행해 보겠습니다.

작업 진행

VPC 생성

우선 AWS Network의 가장 큰 틀이라고 볼 수 있는 VPC를 생성합니다.

AWS 콘솔에서 VPC 검색으로 대시보드에 들어가, VPC를 생성합니다.

위 그림대로 10.0.0.0/16 블록으로 VPC를 생성해 주었습니다.

서브넷 생성

서브넷을 생성합니다.

그림에는 AZ가 2개밖에 없어 서브넷을 2개로 했지만, 현재 서울 지역에 AZ가 4개이므로 저는 4개를 만들어 주었습니다.

VPC 콘솔에서 왼쪽 서브넷 탭으로 들어가, 서브넷 생성을 시작합니다.

위에서 생성한 VPC를 선택합니다.

가용 영역은 ap-northeast-2a부터 2d까지 4개를, IPv4 CIDR 블록 또한 그림대로 10.0.0.0/24~10.0.3.0/24 까지 4개를 설정해서 서브넷을 4개 생성했습니다.

게이트웨이 생성

NAT Instance가 트래픽을 주고받을 gateway를 생성합니다.

VPC 콘솔에서 왼쪽 인터넷 게이트웨이 탭으로 들어가, 인터넷 게이트웨이 생성을 합니다.

라우팅 테이블 생성

다음으로 NAT Instance가 없는 서브넷에서는 nat instance로 트래픽을 몰아서 주고, NAT Instance가 있는 서브넷에서는 gateway로 트래픽을 몰아서 주기 위해 라우팅 테이블을 생성합니다.

VPC 콘솔에서 왼쪽 라우팅 테이블 탭으로 들어가, 라우팅 테이블 생성을 합니다.

우선,그림과 같이 NAT Instance 가 있는 subnet 을 위한 Custom Route Table 을 생성합니다.

생성 후, 첫 번째로 라우팅 탭에서 라우팅 편집에서 Destination 0.0.0.0/0 을 추가한 다음 Target으로 위에서 만든 인터넷 게이트웨이(my-gateway) 를 연결해줍니다.

두 번째로, 서브넷 연결 탭에서 위에서 생성한 첫 번째 서브넷인 my-subnet-01과 연결해 줍니다.

그 다음, 그림과 같이 나머지 subnet 을 위한 Main Route Table 을 생성합니다.

위 그림의 custom route table과 똑같은 환경을 만들어 주고 있으니, 꼭 그림 같이 확인 부탁 드립니다.

그리고 두번째 라우트 테이블인 Main Route Table도 위와 같이 설정해 줍니다. 차이점은 0.0.0.0/0 에 nat instance가, 서브넷 연결에 나머지 3개의 서브넷이 연결될 겁니다. 다만 글의 순서상 아직 NAT Instance를 생성하지 않았으므로, 생성 후 Main Route Table 작업을 실행해 주어야 합니다.

NAT Instance 생성

우리의 목적인 외부와의 통신을 위해, 퍼블릭 IP를 가진 NAT Instance를 만들어 줍니다.

기본적으로 EC2 Instance를 만드는 과정과 동일합니다. 다만 신경쓸 부분은

  1. NAT Instance 전용 이미지 선택
  2. Elastic IP 발급

입니다.

우선 전용 이미지로 NAT Instance를 생성해 보겠습니다.

이미지 선택에서 amzn-ami-vpc-nat 를 검색 후 맨 위에 있는 이미지로 선택해 줍니다. 다만 공식 문서에서는 본 이미지는 더이상 업데이트가 진행되지 않으니 Amazon Linux 2에서 자체 NAT AMI를 생성할 것을 권장합니다. 저는 작동에 문제가 없으므로 본 이미지로 진행하였습니다.

프리티어 인스턴스 선택 후, 다음: 인스턴스 세부 정보 구성 버튼을 클릭합니다.

네트워크는 만들어 놓은 VPC를, 서브넷은 첫 번째 서브넷을 선택해 줍니다.

또한 퍼블릭 IP 자동 할당을 활성화로 선택합니다.

검토 및 시작으로 인스턴스를 생성합니다. 보안을 개선하라고 하는데, 보안은 Elastic IP 설정 후 제한해 주도록 하겠습니다.

추가로 생성 후, 인스턴스 오른쪽 클릭 후 소스/대상 확인으로 들어가 중단시켜 줍니다.

이제 EC2 인스턴스로 들어가서, 왼쪽 탭의 탄력적 IP로 들어가 새 주소 할당을 눌러줍니다.

마지막으로, 아무나 접속할 수 없도록 NAT Instance의 보안을 설정해 줍니다.

인스턴스에 보안→ 인바운드로 들어가 편집해 줍니다. 어차피 Lambda와 RDS도 같은 보안 설정을 적용해주어야 하므로, DB에 접속하기 위한 3306 포트와 제 PC의 22번 포트만 인바운드로 열어 주는 보안 그룹을 생성 후 연결해 주었습니다. 아웃바운드는 상관 없으므로 모두 열어 주었습니다.

다 만드셨으면, 라우팅 테이블 생성 설명에서 아까 말씀드렸듯 두 번쨰 라우팅 테이블에 NAT Instance 를 설정해 주시면 됩니다.

AWS Lambda, RDS 새로운 VPC로 옮기기

새로운 VPC를 생성해 주었으므로, 마지막으로 기존 Lambda 와 RDS를 본 VPC로 이동시켜 주시면 됩니다. 설정에서 네트워크 부분을 새로운 VPC로 옮겨주면 되므로 그리 어렵지 않습니다. 이때 각 서비스의 보안 그룹도 위에서 만든 보안 그룹으로 함께 넣어줘야 합니다.

결론

지난달에 NAT Gateway에서 발생했던 비용을 없앨 수 있었습니다!🙌

상용화되어 많은 트래픽이 발생하지 않는 이상 NAT Instance로 대체해도 무리가 없을 거라고 생각됩니다.

혹시 글에 잘못된 점이 있다면 댓글로 지적해 주시면 정말 감사하겠습니다!

감사합니다.🙇‍♂️

profile
컨테이너, k8s, 마이크로서비스 등 클라우드 네이티브 환경에 관심이 많습니다.

0개의 댓글