🏁 문제 상황
- 이미지 데이터를 직접 S3에서 불러올 경우, 네트워크 지연 및 트래픽 처리 병목 현상이 발생했다.
- 특히 대용량 데이터 요청이 많아지면 시스템 성능이 저하되고, 사용자 경험에 부정적 영향을 미친다고 판단했다.
💡 CloudFront 도입 이유
1. 콘텐츠 전송 속도 향상
- AWS CloudFront는 글로벌 엣지 로케이션을 통해 데이터를 캐싱하여 사용자 가까운 곳에서 데이터를 전송할 수 있도록 한다.
- 이를 통해 네트워크 지연을 최소화하고, 빠른 응답 속도를 제공할 수 있다.
2. 비용 효율성
- S3로 직접 요청하는 횟수를 줄여 데이터 전송 비용을 절감할 수 있다.
- 자주 요청되는 데이터는 캐시에서 제공되므로 S3 I/O 비용 역시 감소한다.
3. 확장성
- 고트래픽 환경에서도 CloudFront는 자동으로 확장되어 서비스 안정성을 유지할 수 있다.
- 대규모 트래픽이 발생하더라도 성능 저하 없이 안정적으로 대응할 수 있다.
🚀 구현 순서도
- CloudFront distributions 생성

- S3 버킷 정책 설정
- S3에서 버킷 정책에 CloudFront 전용으로 제한하는 정책으로 변경
- S3 Block Public Access 설정
- CloudFront를 통해 이미지를 제공하려면 S3 버킷이 직접 공개되지 않아야 하므로, 공개 액세스를 차단하는 것이 일반적으로 권장
- CloudFront를 통해서만 접근 가능

- 도메인 연결 및 HTTPS 설정
- CloudFront 도메인을 통해 S3 파일을 접근하도록 설정
- CloudFront 기본 도메인을 사용 -> 이미 HTTPS가 활성화되어 있으니 추가 설정은 필요 없다
- CloudFront와 S3 연동 테스트
- CloudFront 배포의 도메인 이름으로 S3에 저장된 파일 요청
- S3 URL로 요청 시 403 Access Denied 오류가 반환되면 정상적으로 연동

- 코드와 연동
- 이미지를 업로드한 뒤 반환하는 URL을 CloudFront URL로 변경
- S3 URL을 그대로 사용하면 성능 최적화나 보안의 이점이 사라짐
- CloudFront의 TTL(Time-to-Live) 설정
- 캐싱된 콘텐츠의 유효 기간을 제어하여 성능 최적화와 비용 절감
- CloudFront가 캐싱된 이미지를 제공하면 대역폭 사용량과 비용 절감 가능
- 자주 변경되지 않는 이미지라서 아래와 같이 설정
- 기본 TTL: 3600초 (1시간)
- 최대 TTL: 86400초 (1일)
- 최소 TTL: 600초 (10분)
- 변경 사항이 적용되더라도 최소 10분 이후에 업데이트가 반영됨

📊 성능테스트 결과 비교

| 요청 수 | 파일크기 | 평균응답시간(ms) | 평균 TPS(/sec) | 에러율(%) |
|---|
| S3 직접 접근 | 100 | 4.1MB | 918 | 7.8 | 0 |
| CloudFront | 100 | 4.1MB | 694 | 10.4 | 0 |
| S3 직접 접근 | 1000 | 500KB | 801 | 59.4 | 0 |
| CloudFront | 1000 | 500KB | 679 | 107.6 | 0 |
1. 4.1MB 파일 테스트 (100건 요청)
- CloudFront
- 평균 응답 시간이 S3(918ms)보다 약 24.4% 더 빠름
- 평균 TPS도 S3(7.8 TPS)보다 약 33.3% 더 높음
- 대용량 파일에서도 CloudFront의 성능이 우수
2. 500KB 파일 테스트 (1000건 요청)
- CloudFront
- 평균 응답 시간이 S3(801ms)보다 약 15.2% 더 빠름
- 평균 TPS도 S3(59.4 TPS)보다 약 81.2% 더 높음
- 소용량 파일에서도 CloudFront의 성능 차이가 더욱 두드러짐
📋 결론
- 파일 크기에 관계없이 CloudFront는 S3에 직접 접근하는 것 대비 더 빠른 응답 시간과 높은 TPS를 제공하였다. 이는 엣지 서버 캐싱 및 효율적인 네트워크 처리가 주된 이유라고 판단된다.
- CloudFront는 파일 크기와 상관없이 성능이 S3 직접 접근보다 더 뛰어나며, 대규모 트래픽에서도 확장성이 훨씬 뛰어나다. 성능, 안정성, 확장성을 고려할 때 CloudFront 사용이 명확히 유리하다.
성능 테스트는 어떤걸로 하셨나요??