다크 모드
S3 구조 및 CDN
truloop-media-service의 S3 키 구조, 파일 변환 체계, CloudFront CDN 통합을 설명합니다.
S3 키 구조
모든 미디어 파일은 사용자 EID와 업로드 날짜 기반의 계층적 경로에 저장됩니다. Internal API를 통해 user_eid 없이 업로드된 파일은 system 경로에 저장됩니다.
키 패턴
users/{userEID}/{YYYY/MM/DD}/{UUID}.{ext}이미지 파일
| 변환 | S3 키 패턴 | 예시 |
|---|---|---|
| Original | users/{userEID}/{YYYY/MM/DD}/{UUID}.{ext} | users/ABC123/2026/03/09/550e8400.jpg |
| Optimized | users/{userEID}/{YYYY/MM/DD}/{UUID}_optimized.webp | users/ABC123/2026/03/09/550e8400_optimized.webp |
| Thumbnail | users/{userEID}/{YYYY/MM/DD}/{UUID}_thumbnail.webp | users/ABC123/2026/03/09/550e8400_thumbnail.webp |
비디오 파일
| 변환 | S3 키 패턴 | 예시 |
|---|---|---|
| Original | users/{userEID}/{YYYY/MM/DD}/{UUID}_original.{ext} | users/ABC123/2026/03/09/550e8400_original.mov |
| Optimized | users/{userEID}/{YYYY/MM/DD}/{UUID}_optimized.mp4 | users/ABC123/2026/03/09/550e8400_optimized.mp4 |
| Thumbnail | users/{userEID}/{YYYY/MM/DD}/{UUID}_thumbnail.webp | users/ABC123/2026/03/09/550e8400_thumbnail.webp |
키 구조 다이어그램
S3 Bucket
└── users/
└── {userEID}/
└── {YYYY}/
└── {MM}/
└── {DD}/
├── {UUID}.jpg # 이미지 원본
├── {UUID}_optimized.webp # 이미지 Optimized
├── {UUID}_thumbnail.webp # 이미지 Thumbnail
├── {UUID}_original.mov # 비디오 원본
├── {UUID}_optimized.mp4 # 비디오 Optimized (HEVC)
└── {UUID}_thumbnail.webp # 비디오 Thumbnail파일 변환 체계
이미지 변환
- 원본은 업로드 시 그대로 보관
- Optimized와 Thumbnail은 백그라운드에서 비동기 생성
- 모든 변환은 WebP 포맷
비디오 변환
- 원본은
_original접미사로 보관 - Optimized 변환은 FFmpeg HEVC로 비동기 생성 (HDR 보존)
- WebP 썸네일도 비동기 생성
- 최종 출력은 항상 MP4 (HEVC/H.265)
CDN 통합
CloudFront 설정
| 항목 | 설명 |
|---|---|
| 환경변수 | CLOUDFRONT_DOMAIN |
| 캐싱 | CloudFront 기본 정책 적용 |
| 원본 | S3 버킷 |
URL 생성
CDN 도메인이 설정된 경우, 응답 URL은 CloudFront 도메인을 사용합니다:
# CloudFront 도메인 설정 시
https://cdn.truloop.app/users/ABC123/2026/03/09/550e8400_optimized.webp
# CloudFront 미설정 시 (S3 URI 형식)
s3://bucket-name/users/ABC123/2026/03/09/550e8400_optimized.webp접근 제어
| 접근 방식 | 대상 |
|---|---|
| Public Read | CloudFront를 통한 미디어 파일 조회 |
| Authenticated Write | JWT 인증된 사용자의 업로드 |
| Internal Write | 서비스 간 업로드 (ai-server → media-service) |
| IAM | S3 GetObject, PutObject 권한 필요 |
데이터 보관 정책
| 파일 유형 | 보관 정책 |
|---|---|
| 원본 | 영구 보관 |
| Optimized/Thumbnail | 영구 보관 (원본과 동일 수명) |
| Optimized 비디오 | 영구 보관 |
정보
현재 별도의 Lifecycle Policy는 적용되지 않으며, 모든 파일은 영구 보관됩니다. 향후 비용 최적화를 위해 Glacier 전환 정책을 검토할 수 있습니다.
변경 이력
| 날짜 | 내용 |
|---|---|
| 2026-03-10 | 소스 코드 기반 전면 검증: 변환명 통일 (Public→Optimized), 비디오 썸네일 추가, 비디오 다이어그램 (HEVC), CDN 폴백 URI 형식, Internal API system 경로 설명 추가 |