VPC Endpoint로 EC2에서 S3, ECR, Bedrock에 프라이빗하게 접근하기
안녕하세요 클래스메소드 김재욱(Kim Jaewook) 입니다. 이번에는 VPC Endpoint로 EC2에서 S3, ECR, Bedrock에 프라이빗하게 접근하는 방법을 정리해 봤습니다.
구성도
AWS 구성은 EC2에서 VPC Endpoint를 통해 S3, ECR, Bedrock에 접근하는 구성입니다.

각 서비스에 접근하기 위해 아래와 같은 VPC Endpoint의 서비스를 생성합니다.
- com.amazonaws.ap-northeast-1.bedrock
- com.amazonaws.ap-northeast-1.ecr.dkr
- com.amazonaws.ap-northeast-1.ecr.api
- com.amazonaws.ap-northeast-1.s3
VPC Endpoint 타입
각 서비스별 VPC Endpoint 타입은 아래와 같습니다.
| 서비스 | Endpoint 타입 | 특징 |
|---|---|---|
| S3 | Gateway 타입 | 라우팅 테이블에 등록, 추가 비용 없음 |
| ECR (dkr/api) | Interface 타입 | ENI 생성, 보안 그룹 설정 필요 |
| Bedrock | Interface 타입 | ENI 생성, 보안 그룹 설정 필요 |
Gateway 타입 vs Interface 타입
Gateway 타입 (S3)
- 라우팅 테이블에 경로를 추가하는 방식
- ENI(Elastic Network Interface)를 생성하지 않음
- 추가 비용 없음
- DNS 설정 불필요
- S3, DynamoDB만 지원
Interface 타입 (ECR, Bedrock)
- VPC 내에 ENI를 생성하는 방식
- 보안 그룹 설정 필요
- DNS 해석을 통해 프라이빗 IP로 접근
- 시간당 비용 발생
- 대부분의 AWS 서비스 지원
VPC Endpoint 설정 시 확인 사항
VPC Endpoint를 설정할 때는 아래 사항을 반드시 확인해 주세요.
- 보안 그룹 : VPC Endpoint에 연결된 보안 그룹에서 443 포트 인바운드 허용 여부
- ※ Interface 타입(ECR, Bedrock)에만 해당
- 라우팅 테이블 : S3는 Gateway 타입이므로 라우팅 테이블에 등록 여부
- ※ Gateway 타입(S3)에만 해당
- DNS 설정 : VPC의 DNS 해석 및 DNS 호스트네임 활성화 여부
- ※ Interface 타입(ECR, Bedrock)에만 해당
- IAM 권한 : EC2에 연결된 IAM Role에 각 서비스에 대한 적절한 권한 부여 여부
S3에 접근
aws cli 명령어로 특정 S3 버킷의 내용물을 불러와 보면, mp4 객체 하나가 저장된 것을 확인할 수 있습니다.
$ aws s3 ls s3://ap-northeast1-xxxxxx-bucket --region ap-northeast-1
2024-10-05 11:30:18 xxxxxxx ruya.webm.mp4
이어서 cp 명령어를 통해 해당 객체를 다운로드해 보면, 성공적으로 다운로드된 것을 확인할 수 있습니다.
$ aws s3 cp \
s3://ap-northeast1-xxxxxx-bucket/ruya.webm.mp4 \
/tmp/ruya.webm.mp4 \
--region ap-northeast-1
download: s3://ap-northeast1-xxxxxx-bucket/ruya.webm.mp4 to ../../../../tmp/ruya.webm.mp4
ECR에 접근
다음은 ECR의 엔드포인트 DNS를 확인해 봅시다.
$ nslookup \
계정ID.dkr.ecr.ap-northeast-1.amazonaws.com
Server: xxx.0.0.53
Address: xxx.0.0.53#53
Non-authoritative answer:
Name: 계정ID.dkr.ecr.ap-northeast-1.amazonaws.com
Address: xx.x.xxx.xxx
Name: 계정ID.dkr.ecr.ap-northeast-1.amazonaws.com
Address: xx.x.xxx.xx
다음은 ECR에 로그인을 시도해 봅시다.
$ sudo aws ecr get-login-password --region ap-northeast-1 | sudo docker login --username AWS --password-stdin 계정ID.dkr.ecr.ap-northeast-1.amazonaws.com
WARNING! Your credentials are stored unencrypted in '/root/.docker/config.json'.
Configure a credential helper to remove this warning. See
https://docs.docker.com/go/credential-store/
Login Succeeded
이제 마지막으로 ECR의 이미지를 pull해 봅시다.
$ sudo docker pull \
계정ID.dkr.ecr.ap-northeast-1.amazonaws.com/ECR이미지명:latest
latest: Pulling from ECR이미지명
Digest: sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Status: Image is up to date for 계정ID.dkr.ecr.ap-northeast-1.amazonaws.com/ECR이미지명:latest
계정ID.dkr.ecr.ap-northeast-1.amazonaws.com/ECR이미지명:latest
Bedrock에 접근
Bedrock의 엔드포인트 DNS를 확인해 봅시다.
$ nslookup bedrock-runtime.ap-northeast-1.amazonaws.com
Server: xxx.x.x.xxx
Address: xxx.0.0.53#53
Non-authoritative answer:
Name: bedrock-runtime.ap-northeast-1.amazonaws.com
Address: xx.x.xxx.xxx
Name: bedrock-runtime.ap-northeast-1.amazonaws.com
Address: xx.x.xxx.xxx
다음은 handshake를 확인합니다.
여기서 말하는 handshake는 실제 API 호출이 아닌, EC2에서 Bedrock 엔드포인트까지 네트워크 연결이 되는지 확인하는 것입니다.
- DNS 해석 - 엔드포인트 도메인이 올바르게 해석되는지
- white_check_mark: TCP 연결 - 443 포트로 연결이 되는지
- white_check_mark: TLS 핸드셰이크 - SSL/TLS 인증서 교환이 정상인지
- 실제 인증 - AWS 인증 정보가 없으므로 403 또는 401 에러 예상
- 타임아웃이 발생하면 VPC Endpoint 설정을 다시 확인해야 합니다
$ curl -vvv https://bedrock-runtime.ap-northeast-1.amazonaws.com/model/global.anthropic.claude-sonnet-4-5-20250929-v1:0/invoke-with-response-stream
마지막으로 Bedrock 모델 테스트를 진행합니다. Claude AI 모델에게 "hello"라고 말을 걸어서 실제 응답을 받아오는 명령어를 실행합시다.
$ aws bedrock-runtime invoke-model \
--region ap-northeast-1 \
--model-id global.anthropic.claude-haiku-4-5-20251001-v1:0 \
--body '{"anthropic_version":"bedrock-2023-05-31","max_tokens":100,"messages":[{"role":"user","content":"hello"}]}' \
--cli-binary-format raw-in-base64-out \
/tmp/bedrock-response.json && cat /tmp/bedrock-response.json
{
"contentType": "application/json"
}
{
"model": "claude-haiku-4-5-20251001",
"id": "msg_bdrk_xxxxxxxxxxxxxxxxxxxx",
"type": "message",
"role": "assistant",
"content": [
{
"type": "text",
"text": "Hello! 👋 How can I help you today?"
}
],
"stop_reason": "end_turn",
"stop_sequence": null,
"usage": {
"input_tokens": 8,
"cache_creation_input_tokens": 0,
"cache_read_input_tokens": 0,
"cache_creation": {
"ephemeral_5m_input_tokens": 0,
"ephemeral_1h_input_tokens": 0
},
"output_tokens": 16
}
}
마무리
이번 블로그에서는 VPC Endpoint를 생성하여 EC2에서 S3, ECR, Bedrock에 프라이빗하게 접근하는 방법을 정리해 봤습니다.
VPC Endpoint를 사용하면 인터넷 게이트웨이나 NAT 게이트웨이 없이도 AWS 서비스에 안전하게 접근할 수 있습니다. 이를 통해 보안성을 높이고, 네트워크 비용을 절감할 수 있다는 점이 큰 장점입니다.
이번 테스트에서 확인한 내용을 정리하면 아래와 같습니다.
- S3 : VPC Endpoint를 통해 버킷의 객체 목록 조회 및 다운로드 성공
- ECR : VPC Endpoint를 통해 로그인 및 이미지 Pull 성공
- Bedrock : VPC Endpoint를 통해 Claude AI 모델 호출 및 응답 수신 성공
특히 Bedrock의 경우, 처음 사용 시 Anthropic 사용 목적 폼 제출이 필요하다는 점을 주의해야 합니다. 폼 제출 후 15분 ~ 1시간 정도 대기하면 정상적으로 사용할 수 있습니다.








