Virtual Private Cloud(VPC) 쉽게 이해하기 #5
이번 문서에서 다룰 주제는 VPC Endpoint입니다. VPC 내 Resource들이 VPC 외부의 서비스(S3, Dynamo DB, Cloudwatch) 등에 접근할 때 Internet Gateway, NAT Gateway 등의 외부 인터넷 전송 서비스를 타지 않고 아마존의 백본 네트워크를 통해 접근할 수 있도록 지원하는 서비스입니다.
VPC Endpoint는 왜 필요한가?
앞서 말씀드린 것처럼 AWS VPC는 사설 네트워크로 이루어진 사용자 정의 네트워크입니다. VPC 내 EC2, RDS, ELB 등을 탑재하고 ENI(Elastic Network Interface)에 사설 IP 혹은 공인 IP를 부여하여 사용하지요.
S3, Cloudwatch, Cloudfront, Dynamo DB, API Gateway 등은 어떨까요? VPC 내부에 탑재하여 사용하는 서비스들인가요? 아닙니다. AWS의 Region 내에 존재하는 것은 사실이지만 VPC 내부에 존재하지 않고 공인 IP를 가지고 외부에서 접근하는 서비스들입니다. VPC 내부의 Resource들이 S3와 같은 서비스를 이용하기 위해서는 외부 인터넷을 통해 도달해야 합니다. 먼저 손쉽게 접근할 수 있는 S3를 통해 확인해보겠습니다.
제 컴퓨터에서 S3 bucket에 대해 'nslookup'을 실시해보니 KT DNS가 52.219.x.x 공인 IP를 반환했습니다. 즉 S3는 공인 IP를 보유하고 있으며 인터넷을 통해서 접근할 수 있는 서비스임을 뜻하는 것이죠. 제 컴퓨터에 인터넷이 연결되어있지 않다면 S3에 접근하는 것은 불가능합니다.
VPC 내부의 Resource들 또한 마찬가지입니다. Internet Gateway 혹은 NAT Gateway가 생성되어있지 않아 외부 인터넷에 접근할 수 없다면 S3와 같은 서비스에 접근할 수 없습니다. 예시를 통해 확인해보겠습니다.
VPC와 Network 쉽게 이해하기 #1 ~ VPC와 Network 쉽게 이해하기 #3에서 사용했던 VPC 구성도(Cake VPC)를 다시 가져왔습니다. 그리고 전 Private Subnet '10.0.3.0/25'에 EC2 인스턴스를 생성하였고 EC2에 접속했습니다. 이 Private Subnet에는 NAT Gateway가 있어 외부 인터넷에 접근이 가능합니다. 이 EC2에서 'nslookup'을 실시하니 10.0.0.2 DNS가 S3 bucket에 대해 공인 IP(52.219.x.x)를 반환함을 알 수 있습니다. 현재 NAT Gateway가 생성된 상태이니 그곳을 거쳐 외부 인터넷으로 나아가 S3 bucket으로 가겠군요.
EC2(10.0.3.20, Private Subnet) - > NAT Gateway - > Internet Gateway - > 외부 인터넷 - > S3
'Traceroute' 명령어를 통해 확인해 보면 Private Subnet의 EC2가 NAT Gateway(10.0.1.198)를 거쳐 Internet Gateway에서 52.79.0.76의 공인 IP로 Source IP NAT되어 외부 인터넷으로 나아가 52.219.x.x IP를 갖는 S3 bucket에 도착함을 알 수 있습니다.
그런데 말입니다. 이는 결국 VPC 내부 Resource와 기타 AWS Service Endpoint(EC2 API 호출, S3 접속 등)와 통신 시 외부 인터넷에 공개적으로 연결되며 트래픽이 노출됨을 의미합니다. 보안상으로 썩 좋지 않은 방법이네요. 이를 해결하기 위한 것이 VPC Endpoint입니다.
VPC Endpoint
VPC 엔드포인트를 통해 인터넷 게이트웨이, NAT 디바이스, VPN 연결 또는 AWS Direct Connect 연결을 필요로 하지 않고 AWS PrivateLink 구동 지원 AWS 서비스 및 VPC 엔드포인트 서비스에 비공개로 연결할 수 있습니다.
VPC의 인스턴스는 서비스의 리소스와 통신하는 데 퍼블릭 IP 주소를 필요로 하지 않습니다. VPC와 기타 서비스 간의 트래픽은 Amazon 네트워크를 벗어나지 않습니다.
- 출처 : AWS VPC 설명서 -
VPC Endpoint는 VPC 내부 Resource가 VPC 외부 AWS 서비스와 통신할 때 외부 인터넷을 거치지 않고 'AWS 백본 네트워크'를 통해 서비스에 도달할 수 있도록 지원하는 서비스입니다. 그러므로 외부 AWS 서비스와 통신할 때 Public IP를 필요로 하지 않습니다. 말 그대로 VPC 내부에 Endpoint를 형성한 뒤, 이 Enpdoint를 통해 AWS 외부 서비스에 도달할 수 있도록 합니다. Interface endpoint와 Gateway endpoint로 나뉩니다.
위의 그림은 Interface endpoint를 설명하고 있습니다. 1개 이상의 Subnet에 Endpoint network interface를 생성한 뒤 사설 IP를 부여합니다. Interface endpoint를 생성하기 전(초록색 선)에는 공인 IP를 보유한 Resource만이 Internet Gateway를 통해 Kinesis Streams에 접근할 수 있었지만 Interface endpoint를 생성한 이후(파란색 선)에는 공인 IP 없이도 Subnet 1, Subnet 2의 EC2 인스턴스 모두 Endpoint network interface를 통해 Kinesis Streams에 접근할 수 있습니다. 이 모든 과정은 AWS PrivateLink를 이용하여 이루어집니다.
위의 그림은 Gateway endpoint를 설명하고 있습니다. Endpoint network interface를 생성하는 Interface endpoint와 달리 Gateway endpoint는 Gateway endpoint를 생성한 후, Subnet에서 Routing만을 추가로 생성됩니다. 자동으로 생성되므로 변경할 수 없습니다. 해당 Routing table 경로를 보고 VPC Endpoint를 통해 S3에 접근 가능합니다. S3, Dynamo DB 두 개 서비스만 사용 가능합니다.
Interface Endpoint
앞서 말씀드린 것처럼 각 서브넷마다 Elastic network interface(ENI)를 생성하여 외부 서비스에 접근하기 위한 Interface endpoint로 지정합니다. 외부 인터넷을 사용하지 않고 해당 ENI를 통해 외부 서비스로 접근이 가능하죠. Interface endpoint를 생성하면 어떤 변화가 생기는지 살펴보겠습니다.
Private subnet(10.0.3.0/25)에 EC2 인스턴스를 생성하고 EC2 API endpoint에 접근하기 위한 Interface endpoint를 생성하였습니다. 또한 Private subnet 10.0.3.0/25, 10.0.4.0/25 두 개에 Interface endpoint용 Elastic network interface(ENI) 2개를 생성하였고 대상 서비스를 EC2로 지정하였습니다.(서비스 이름에서 확인 가능합니다)
구성도 내 초록색 선과 cmd 창의 초록색 박스는 Interface endpoint 생성 전 외부인터넷을 통한 경로와 EC2 API endpoint에 도달하기 위한 IP 주소(52.95.193.73)를 뜻하고, 구성도 내 파란색 선과 cmd 창의 파란색 박스는 Interface endpoint 생성 후 경로와 EC2 API endpoint에 도달하기 위한 IP 주소(10.0.3.94, 10.0.4.71)를 뜻합니다.
위에서 말씀드린 것처럼 더 이상 공인 IP의 목적지로 가기 위해 DNS가 외부의 공인 IP를 가리키지 않고 Endpoint network interface를 가리키는 것을 볼 수 있습니다. 사용자는 Interface endpoint를 사용할 때 목적지를 아래 'DNS 이름'에 적힌 부분을 목적지로 지정해주면 됩니다.
또한 'Private DNS names enabled'를 반드시 활성화해야 합니다. 그렇지 않으면 DNS가 Endpoint network interface의 주소가 아닌 공인 IP 주소를 불러오게 됩니다.
Gateway Endpoint
이번에는 S3, Dynamo DB를 위한 Endpoint인 Gateway endpoint를 살펴 보겠습니다. Interface endpoint와 달리 Gateway endpoint는 인터페이스가 추가되지 않습니다. 다만 VPC Gateway Endpoint로 향하는 Private subnet의 Routing table에 Routing이 자동으로 추가됩니다. 이 Routing은 변경하거나 삭제할 수 없습니다. 아래 그림을 보니 S3는 52.x.x.x IP를 주로 사용하나 봅니다.
구성은 다음과 같습니다.
S3 Bucket의 공인 IP는 52.219.60.111이군요. Gateway endpoint 설정 전 Private subnet에서 S3 Bucket으로 향하는 경로를 추적해보니 NAT Gateway(10.0.1.181)와 Internet gateway를 타고 나가 외부 인터넷을 통해 S3 Bucket에 도달하는 것을 알 수 있습니다. 이제 Gateway endpoint 설정 후 경로를 살펴볼까요?
Gateway endpoint를 설정하고 난 후의 경로 변화입니다. 일단 아무것도 안 뜨는군요; 아마존 백본 네트워크는 경로를 보여주지 않는 것일까요? NAT Gateway로 나간 흔적이 보이지 않는 것을 보니 일단 외부인터넷은 타지 않고 있습니다. 기능이 제대로 되는지 확인하기 위해 'aws s3 ls' 명령어를 통해 S3 Bucket list를 불러왔습니다.
S3 Bucket list를 잘 불러오는군요. 아무래도 아마존 백본 네트워크이다보니 경로를 노출하지 않는 것이 아닌가 싶습니다. 가장 확실하게 확인하는 방법은 NAT Gateway를 삭제하고 외부 접속이 완전 차단된 서브넷에서 테스트를 해보는 것입니다.
여기까지가 VPC Endpoint입니다. 감사합니다!