클라우드 인프라를 구축하면서 가장 처음에 접하는 부분이 바로 네트워크 입니다. AWS에서는 VPC (Virtual Private Cloud)라는 가상 네트워크 환경에서 Public, Private 서브넷을 구축하고 그 위에 리소스를 배포하게 됩니다. 서브넷을 구축할 때는 AWS의 가용 영역 (AZ, Availability Zone)을 선택하게 됩니다. 현재 서울 리전에는 총 4개의 가용 영역이 존재하며, 각각 a, b, c, d에 해당합니다.

AWS에서는 인터넷에서 들어오는 인바운드 데이터에 대해서 별도의 요금을 받지 않습니다. 그러나, 실제로 요금 내역을 확인해보면 몇 가지 형태의 데이터 요금이 발생하는 것을 확인할 수 있습니다. 인바운드는 무료이지만 아래와 같은 경우에는 요금이 발생하게 됩니다.

  • 서로 다른 가용 영역간에 전송되는 데이터 요금, DataTransfer-Regional-Bytes

동일 AWS 리전 내 가용 영역 또는 VPC 피어링 연결 전체에 걸쳐 Amazon EC2, Amazon RDS, Amazon Redshift, Amazon DynamoDB Accelerator(DAX), Amazon ElastiCache 인스턴스 또는 Elastic Network Interface에서 “송신” 및 “수신”되는 데이터는 각 방향에 대해 GB당 0.01 USD가 부과됩니다.

EC2 온디맨드 인스턴스 요금

  • NAT Gatway를 통해 전송되는 데이터 요금, NAT-Gateway-Bytes

VPC에 NAT 게이트웨이를 생성하는 경우, 프로비저닝되고 사용 가능한 NAT에 대해 ‘NAT 게이트웨이 시간’당 요금이 부과됩니다. 데이터 처리 요금은 트래픽 소스나 대상과 관계없이 NAT 게이트웨이를 통해 처리된 각 기가바이트에 적용됩니다.

Amazon VPC 요금

이번 글에서는 실제 비용 발생 사례를 살펴보고 이러한 비용을 발생시키지 않기 위해서 Private 엔드포인트를 어떻게 사용해야 하는지 알아보겠습니다.

OpsNow 개발계의 이상 비용

10월 5일에 내부 시스템 테스트를 위해서 개발자 A가 특정 서브넷의 라우팅 테이블을 다른 Private 서브넷에 적용된 것으로 변경하였습니다. 당시에만 해도 아무도 예측하지 못했던 문제는 10월 12일이 되어서야 이상 비용으로 나타나기 시작했습니다.

갑자기 튀어오른 요금…

또 다른 개발자 B는 S3에서 데이터를 Private 서브넷의 EMR로 가져와서 처리하고 이것을 다시 RDS에 저장하는 일련의 테스트를 진행하고 있었습니다. 해당 작업은 통상적으로 매일 반복되는 작업이었으나, 4일에 걸쳐서 집중적인 테스트가 진행되었습니다.

단순히 라우팅 테이블이 변경되었을 뿐인데, 갑자기 왜 비용이 발생했을까요? NAT와 가용 영역간의 비용, 그리고 VPC 엔드포인트의 관계는 무엇일까요?

VPC 엔드포인트가 필요한 이유

비용 발생의 이유는, S3의 데이터가 VPC로 바로 들어오지 않고 인터넷으로 나갔다가 다시 들어왔기 때문입니다. 그리고 VPC 엔드포인트는 서비스 접근을 Private하게 만들어주는 역할을 하는 것이었습니다.

개발자 B는 자신이 구축한 테스트 베드에서 S3에 대한 VPC 엔드포인트를 설정하였고, 그에 대한 라우팅이 테이블에 추가되어 있었습니다. 그런데, 개발자 B가 S3에 대한 라우팅이 없는 테이블로 서브넷의 연결을 변경하였고, 이에 따라서 S3에서 가져오는 데이터는 인터넷을 거쳐서 NAT Gateway, EMR의 인스턴스로 넘어오게 되었습니다. 그래서 NAT-Gateway-Bytes 요금이 발생하였습니다.

게다가 무척 운이 나쁘게도, NAT Gateway는 가용 영역 a에 위치하였고, EMR의 인스턴스는 가용 영역 c에 위치하여 가용 영역간의 데이터 이동에 따른 DataTransfer-Regional-Bytes 요금이 발생하였습니다. 이렇게 발생하지 않아도 되는 비용이 발생한 것이 너무나 아쉽습니다.

S3 VPC 엔드포인트 설정하기

위 사례에서 가장 문제가 되었던 S3 서비스에 대한 VPC 엔드포인트를 설정하는 방법에 대해서 알아보도록 하겠습니다. AWS의 VPC 콘솔에 접속하면 좌측 메뉴에서 엔드포인트 메뉴를 확인할 수 있습니다. 엔드포인트 생성 버튼을 눌러 아래와 같이 진행합니다.

다양한 Endpoint 중에서 S3를 선택합니다.

이후에 VPC를 선택하고 해당 VPC의 라우팅 테이블 중에서 어떤 테이블에 VPC 엔드포인트를 연결할 것인지를 지정합니다. 여기에서 선택된 라우팅 테이블을 이용하는 모든 서브넷에서는 추후 S3 연결을 할 때, 인터넷을 거치지 않고 AWS의 Private 인터넷을 이용하여 엑세스를 하게 됩니다.

비단 S3 뿐만 아니라 다양한 서비스들이 있는데, S3 엔드포인트는 Gateway 타입이라서 설정이 간단한 편입니다만 나머지 서비스들은 Interface 타입이라서 서브넷을 지정하고 보안 그룹을 추가하는 등의 추가 조치가 필요하므로 참고하시기 바랍니다.

이 글을 보시는 다른 분들도 내부적으로 데이터 전송 비용이 발생하고 있는지, 그것이 절감 가능한 비용인지 확인하시고 VPC 엔드포인트를 적극적으로 설정하시기를 권장합니다.

또 다른 내부 계정에서 불필요한 데이터 요금이 매.우. 많이 발생하였고, 이제 곧 0으로 수렴하게 될 것입니다.