VPC Endpoint란? (개념부터 실습까지)
AWS에서 프라이빗 서브넷으로 인프라를 구성하다 보면 AWS 서비스에 접근할 때 퍼블릭 인터넷을 거치지 않아야 하는 경우가 많습니다.
NAT Gateway만으로는 보안 요구사항을 충족하기 어렵습니다.
VPC Endpoint를 사용하면 인터넷을 우회하는 사설 연결을 만듭니다.
이번 글에서는 VPC Endpoint의 개념과 두 가지 종류를 설명하고 실습까지 진행합니다.
VPC Endpoint를 사용하는 이유
프라이빗 서브넷에 있는 리소스가 AWS 서비스에 접근할 때 인터넷 경로를 제거합니다.
보안 그룹과 정책으로 접근을 세밀하게 통제합니다.
VPC Endpoint란 무엇인가
VPC Endpoint는 VPC 내부에서 AWS 서비스로 가는 사설 연결 지점입니다.
AWS 백본 네트워크만 이용합니다.
Gateway Endpoint와 Interface Endpoint
VPC Endpoint는 두 가지 유형으로 나뉩니다.
Gateway Endpoint는 S3와 DynamoDB에만 제공합니다.
Interface Endpoint는 대부분의 AWS 서비스에 사용합니다.
아래 표로 두 유형을 비교합니다.
| 항목 | Gateway Endpoint | Interface Endpoint (PrivateLink) |
|---|---|---|
| 대상 서비스 | S3, DynamoDB | Secrets Manager, SSM, KMS 등 대부분 |
| 작동 방식 | 라우트 테이블에 경로 추가 | 서브넷별 ENI 생성 |
| ENI | 생성되지 않음 | 생성됨 |
| 보안 제어 | 라우트 테이블 | Security Group (TCP 443) |
| Private DNS | 필요 없음 | ON 권장 |
S3를 연결할 때는 Gateway Endpoint를 먼저 선택합니다.
설정이 단순합니다.
관리 포인트도 적습니다.
ENI가 보이면 Interface Endpoint입니다.
라우트 테이블이 핵심이면 Gateway Endpoint입니다.
Interface Endpoint 그림

Gateway Endpoint 그림

Interface Endpoint 실습 (Secrets Manager)
왜 이 실습을 하는가
Private DNS를 활성화하면 SDK 호출이 자동으로 VPC Endpoint를 사용합니다.
무엇을 구성하는가
ap-south-1 리전에서 Secrets Manager Interface Endpoint를 만듭니다.
Lambda가 secret 값을 private 경로로 읽습니다.
어떻게 구성하는가
1. VPC Endpoint를 생성합니다. 서비스로 secretsmanager를 선택합니다.
2. Private DNS를 ON으로 설정합니다.
3. Lambda를 VPC 프라이빗 서브넷에 연결합니다.
4. Lambda 역할에 AWSLambdaVPCAccessExecutionRole을 부여합니다.
5. Endpoint 보안 그룹에서 Lambda 보안 그룹의 443 포트를 허용합니다.
6. Lambda를 테스트합니다.
아래 스크립트를 Lambda에 적용합니다.
import json
import boto3
sm = boto3.client("secretsmanager")
def lambda_handler(event, context):
secret_id = "wsi-private-secret"
r = sm.get_secret_value(SecretId=secret_id)
secret = json.loads(r["SecretString"])
return {
"statusCode": 200,
"body": json.dumps({"status": "ok", "msg": secret.get("msg")})
}
Gateway Endpoint 실습 (S3)
왜 이 실습을 하는가
S3는 Gateway Endpoint가 표준입니다.
무엇을 구성하는가
ap-south-1 리전에서 S3 Gateway Endpoint를 만듭니다.
프라이빗 Lambda가 S3에 파일을 업로드합니다.
어떻게 구성하는가
1. S3 버킷 vpce-gw-lab-yuchan-001을 생성합니다.
2. VPC 콘솔에서 엔드포인트를 생성합니다.
3. 서비스 com.amazonaws.ap-south-1.s3를 선택합니다.
4. 유형을 Gateway로 선택합니다.
5. VPC의 프라이빗 라우트 테이블을 연결합니다.
6. Lambda를 VPC 프라이빗 서브넷에 연결합니다.
7. Lambda 역할에 S3 권한을 추가합니다.
8. Lambda를 테스트합니다.
아래 스크립트를 Lambda에 적용합니다.
import json
import boto3
from datetime import datetime
s3 = boto3.client("s3")
def lambda_handler(event, context):
bucket = "vpce-gw-lab-yuchan-001"
key = f"vpce-test/{datetime.utcnow().isoformat()}.txt"
body = "hello from lambda via gateway endpoint"
try:
s3.head_bucket(Bucket=bucket)
s3.put_object(Bucket=bucket, Key=key, Body=body.encode("utf-8"))
s3.list_objects_v2(Bucket=bucket, Prefix="vpce-test/", MaxKeys=5)
return {
"statusCode": 200,
"body": json.dumps({
"status": "ok",
"bucket": bucket,
"uploaded_key": key
})
}
except Exception as e:
return {
"statusCode": 500,
"body": json.dumps({
"status": "error",
"message": str(e)
})
}
자주 하는 실수
| 실수 | 증상 | 해결 방법 |
|---|---|---|
| Endpoint Service와 VPC Endpoint 혼동 | 서비스를 찾지 못함 | VPC > Endpoint 메뉴에서 생성 |
| Interface Endpoint SG를 0.0.0.0/0로 열음 | 보안 취약 | Lambda SG에서만 443 허용 |
| Lambda VPC Access Role 누락 | VPC 연결 실패 | AWSLambdaVPCAccessExecutionRole 부여 |
| Private DNS OFF | SDK 호출이 인터넷으로 나감 | Private DNS 활성화 |