재하의 개발 블로그
인프라 9 분 소요

MongoDB Atlas Private Endpoint 연결 가이드 — AWS PrivateLink 삽질기

aws mongodb private-endpoint privatelink vpc networking troubleshooting

MongoDB Atlas Private Endpoint를 AWS Default VPC의 Public Subnet EC2에서 연결하는 과정을 정리한다. 설정은 단순해 보이지만 DNS 동작 방식과 Security Group 설정에서 삽질 포인트가 여럿 있었다.

VPC, 서브넷, Interface Endpoint 등 기본 개념이 헷갈린다면 이전 편을 먼저 읽어보자.

AWS VPC 핵심 개념 정리 — 서브넷, AZ, IGW, Interface Endpoint — VPC, 서브넷, AZ, IGW, Interface Endpoint 개념을 한 번에 정리한다.

전체 구조

MongoDB Atlas Private Endpoint는 AWS PrivateLink를 기반으로 동작한다. Atlas 쪽에서 VPC Endpoint Service를 생성하고, 우리가 VPC 안에 Interface Endpoint (ENI)를 만들어 연결하는 구조다. 트래픽이 인터넷을 전혀 경유하지 않고 AWS 내부망으로만 흐른다.

flowchart TB
    EC2["EC2\n(Public Subnet)"]
    ENI["VPC Endpoint ENI\n(Private Subnet)"]
    Atlas_EP["MongoDB Atlas\nPrivate Endpoint Service"]
    Cluster["Atlas Cluster\n(포트 1024 / 1025 / 1026)"]

    EC2 -->|"local 라우팅\n같은 VPC"| ENI
    ENI -->|"AWS PrivateLink"| Atlas_EP
    Atlas_EP --> Cluster

사전 준비

Atlas에서 Private Endpoint 생성

Atlas Console → Network Access → Private Endpoints → AWS → 리전 선택 후 생성하면 아래 형태의 서비스 이름이 발급된다.

com.amazonaws.vpce.ap-northeast-2.vpce-svc-0123456789abcdef0

AWS에서 Interface Endpoint 생성

aws ec2 create-vpc-endpoint \
  --vpc-id vpc-xxxxxxxx \
  --vpc-endpoint-type Interface \
  --service-name com.amazonaws.vpce.ap-northeast-2.vpce-svc-0123456789abcdef0 \
  --subnet-ids subnet-xxxxxxxx \
  --security-group-ids sg-xxxxxxxx

생성 후 나오는 vpce-xxxxxxxxxx ID를 Atlas에 등록해 승인 처리하면 양쪽 상태가 Available이 된다.

삽질 포인트 1: private-dns-enabled가 안 된다

Interface Endpoint 생성 시 --private-dns-enabled 옵션을 시도하면 아래 오류가 난다.

Private DNS can't be enabled because the service
com.amazonaws.vpce.ap-northeast-2.vpce-svc-0123456789abcdef0
does not provide a private DNS name.

이 옵션은 AWS 자체 서비스 (S3, ECR, Secrets Manager 등) 전용이다. AWS가 직접 *.amazonaws.com DNS를 관리하는 서비스에서만 동작한다.

MongoDB Atlas 같은 서드파티 PrivateLink 서비스는 이 옵션을 지원하지 않는다. Atlas는 대신 자체 DNS로 private IP를 관리한다.

삽질 포인트 2: DNS 조회 방법이 다르다

일반 nslookup으로는 바로 resolve되지 않는다.

# 이렇게 하면 No answer
nslookup mycluster-pl-0.abc12.mongodb.net

Atlas Private Endpoint는 SRV 레코드 기반으로 동작한다. 올바른 확인 순서는 아래와 같다.

1단계 — SRV 레코드 조회

nslookup -type=SRV _mongodb._tcp.mycluster-pl-0.abc12.mongodb.net

정상이면 아래처럼 포트 3개가 나온다.

_mongodb._tcp.mycluster-pl-0.abc12.mongodb.net  service = 0 0 1024 pl-0-ap-northeast-2.abc12.mongodb.net.
_mongodb._tcp.mycluster-pl-0.abc12.mongodb.net  service = 0 0 1025 pl-0-ap-northeast-2.abc12.mongodb.net.
_mongodb._tcp.mycluster-pl-0.abc12.mongodb.net  service = 0 0 1026 pl-0-ap-northeast-2.abc12.mongodb.net.

포트 1024 / 1025 / 1026은 Atlas가 replica set 노드별로 로드밸런서에서 할당하는 고유 포트다. 27017이 아니다.

2단계 — hostname → private IP resolve 확인

nslookup pl-0-ap-northeast-2.abc12.mongodb.net

정상이면 172.31.x.x 같은 private IP가 나온다.

pl-0-ap-northeast-2.abc12.mongodb.net
  canonical name = vpce-0123456789abcdef0-pmuap28o.vpce-svc-0123456789abcdef0.ap-northeast-2.vpce.amazonaws.com.
 
Address: 172.31.xx.xx
Address: 172.31.yy.yy

public IP가 나오면 DNS가 ENI로 붙지 않은 것이다.

3단계 — 포트 연결 확인

telnet pl-0-ap-northeast-2.abc12.mongodb.net 1024
telnet pl-0-ap-northeast-2.abc12.mongodb.net 1025
telnet pl-0-ap-northeast-2.abc12.mongodb.net 1026

삽질 포인트 3: Security Group 설정 — 핵심

DNS resolve까지 성공해도 연결이 안 된다면 Security Group 문제다. Endpoint ENI SG의 Inbound 규칙 누락이 가장 흔한 원인이다.

필요한 규칙 전체

컴포넌트방향포트소스/대상
EC2 SGOutbound1024~65535Endpoint ENI의 private IP 또는 Endpoint SG
Endpoint ENI SGInbound1024~1026EC2 SG ID

포트 범위가 왜 다른가

MongoDB 공식 문서에는 EC2 SG Outbound를 1024~65535로 열라고 나온다. Endpoint SG Inbound는 1024~1026이면 충분한데, 범위가 다른 이유가 있다.

TCP 통신에서 클라이언트(EC2)는 서버에 연결할 때 OS가 ephemeral port (임시 포트)를 1024~65535 범위에서 임의로 선택한다. 응답 패킷이 이 임의 포트로 돌아오기 때문에, EC2 SG Outbound에서 해당 범위를 열어둬야 응답을 받을 수 있다.

sequenceDiagram
    participant EC2
    participant ENI as Endpoint ENI
    EC2->>ENI: src: 54231 → dst: 1024
    ENI->>EC2: src: 1024 → dst: 54231

EC2 Outbound는 넓게 (ephemeral port 대응), Endpoint Inbound는 좁게 (실제 서비스 포트만) 여는 것이 올바른 설정이다.

Security Group 설정 명령

# Endpoint SG Inbound에 EC2 SG 허용
aws ec2 authorize-security-group-ingress \
  --group-id sg-<endpoint-sg-id> \
  --protocol tcp \
  --port 1024-1026 \
  --source-group sg-<ec2-sg-id>

삽질 포인트 4: connection string이 다르다

일반 connection string을 쓰면 public으로 나간다. Atlas Console → Clusters → Connect → Private Endpoint 탭에서 별도 발급되는 string을 써야 한다.

# 일반 (쓰면 안 됨)
mongodb+srv://myuser:***@mycluster.abc12.mongodb.net/
 
# Private Endpoint용 (-pl-0 이 붙는다)
mongodb+srv://myuser:***@mycluster-pl-0.abc12.mongodb.net/

정리

항목내용
DNS 확인 방법nslookup -type=SRV _mongodb._tcp.<hostname>
Atlas PrivateLink 포트27017이 아닌 1024 / 1025 / 1026
private-dns-enabled서드파티 서비스는 지원 안 함
핵심 누락 포인트Endpoint ENI SG Inbound 1024~1026 열기
EC2 SG Outbound1024~65535 (ephemeral port 대응)
connection string-pl-0 붙은 Private Endpoint 전용 string 사용