
사건의 발단
최근 AWS 비용을 줄이기 위해 아키텍처 구조에 대한 대대적인 점검에 들어갔다.
그러던 중, 엔드포인트 점검을 하던 중 이상한 것을 발견했다.

저 ssm-endpoint, ec2messages-endpoint, ssmmessages-endpoint는 Session Manager를 위한 엔드포인트이다. (따로 글 쓸 예정)
그리고 rds-connection-ssm은 따로 rds에 접근하기 위해 만들어 놓은 엔드포인트이다. (이것도 따로 글 쓸 예정)
그래서 서버팀에게 S3 접근을 하고 있는지 물어보았다.

그러면 지금까지 S3 버킷 접근을 엔드포인트 없이 진행했다면, 혹시 인터넷으로...?
우리의 EC2는 private subnet에 있다. 그러면 인터넷으로 S3에 접근했다면 혹시 NAT...?
트래픽 비용 청구가 NAT로 이루어지고 있었던 것일까...? 비싼데

그래서 오늘은 서버팀 코드를 분석하면서 알게 된 EC2가 S3에 접근할 수 있는 방법에 대해 다뤄보려고 한다. (그리고 빠르게 전달해서 비용 절감을 해야 한다.)
EC2가 S3에 접근하는 방법
먼저 EC2 자체가 S3에 접근하는 방법에 대해서 알아보자.
1. 퍼블릭 접근 허용하기
가장 간단하고, 가장 취약한 방법으로 S3의 퍼블릭 액세스 차단을 비활성화 하는 것이다.

S3의 퍼블릭 액세스를 허용하면 누구나 URL을 통해 접근할 수 있다.
하지만 이 말을 반대로 말하면 누구나 접근 가능하기 때문에 데이터가 노출될 위험이 있다.
그리고 퍼블릭 접근을 허용해두고 DDoS처럼 파일 업로드 공격을 하면 엄청난 과금 폭탄! 을 맞을 수 있으니 저장소로 사용할 때 퍼블릭 접근을 하는 것을 매우 비추한다.
비슷한 주제의 재밌는 영상이 있으니 시청해 보면 좋겠다.
버킷은 이름도 노출시키지 않는 것이 좋다.
https://youtu.be/propgtDEMgM?si=JWnX3QWJkM67F4gU
2. 인터넷을 통한 접근
현재 우리 EC2에서 S3에 접근하고 있는 방법이다.

우리의 EC2는 프라이빗 서브넷에 위치하고 있다.
프라이빗 서브넷에 있는 EC2는 인터넷에 직접 접근할 수 없고, NAT Gateway를 통해 외부와 통신할 수 있다.
S3는 VPC 외부에 위치하기 때문에, EC2 → NAT Gateway → S3로 연결된다.
이 방법의 장점은 NAT Gateway를 사용하기 때문에 인터넷 접근과 S3 버킷을 함께 관리할 수 있다.
관리 포인트를 줄이고 라우팅 테이블 편집이 필요 없다는 점에서는 편리할 수도 있다.
하지만 NAT Gateway를 사용할 때마다 트래픽 비용이 발생하기 때문에 S3 버킷에 많이 접근할수록 비용 폭탄을 맞을 수 있다.
private subnet에 EC2를 배치한 뒤에 인터넷 연결을 설정하고 S3 버킷을 연결하면 NAT Gateway이 이미 있기 때문에 라우팅 테이블을 설정하지 않아도 S3로 연결이 되어 오 연결됐네~ 하고 넘어갈 수 있는 부분이라고 생각한다.
하지만, 다시 말하지만, NAT는 비싸다.
3. VPC Endpoint를 통한 접근
(개인적으로) 가장 권장하는 접근 방법이라고 생각한다.
VPC Endpoint를 설정하면 인터넷 연결 없이 S3에 접근할 수 있다.
이 방법은 트래픽이 AWS 내부에서만 이동하므로 인터넷을 사용하는 것에 비해 비용이 저렴하다.
비용 뿐만 아니라 트래픽이 외부에 노출되지 않기 때문에 보안적으로도 더 좋다.
VPC Endpoint의 타입에는 Interface와 Gateway type 두 종류가 있다.

Interface Endpoint는 AWS PrivateLink를 사용하는 방식이다.
Interface Endpoint를 생성하면, 생성 시 선택한 Subnet에 ENI가 생겨서 이 ENI가 EC2와 S3를 연결하고, ENI와 S3 사이는 PrivateLink로 연결된다.
통신은 Interface Endpoint의 Security group을 통해 제어할 수 있다.
ENI에 대해 더 궁금하다면 아래 영상을 보면 좋을 것 같다.
https://www.youtube.com/watch?v=roQuec3VPzc

Gateway Endpoint는 AWS PrivateLink를 사용하지 않는 방식이다.
Gateway Endpoint를 생성하면, EC2에서 Gateway Endpoint로의 라우팅을 통해 S3가 연결된다.
이 두 방법 중에서 Interface를 사용하면 PrivateLink 사용으로 인한 비용이 발생한다. 따라서 비용 부분에 초점을 맞춘다면 Gateway Endpoint를 사용하고, 세밀한 접근 제어와 보안에 초점을 맞춘다면 Interface를 사용하는 방식이 적합할 것 같다.
후속 포스트로 백엔드 코드에서 S3에 접근한 다양한 방식에 대해서도 소개하려고 한다.
https://ctrl-shit-esc.tistory.com/189
백엔드 코드는 어떻게 S3에 접근할 수 있을까?
https://ctrl-shit-esc.tistory.com/187 EC2는 S3에 어떻게 접근할 수 있을까?사건의 발단최근 AWS 비용을 줄이기 위해 아키텍처 구조에 대한 대대적인 점검에 들어갔다.그러던 중, 엔드포인트 점검을 하던
ctrl-shit-esc.tistory.com
Reference
AWS VPC Endpoint - 'Interface' vs 'Gateway' type 비교
https://velog.io/@brillog/AWS-VPC-Endpoint-Interface-vs-Gateway-type-%EB%B9%84%EA%B5%90
[AWS] ENI란? 쉽게 개념 및 특징 정리 (Elastic Network Interface)