Feature/175: AWS CloudFront 연동 #183
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
[FEATURE] AWS CloudFront (CDN) 연동 기능 구현
📋 개요
AWS CloudFront CDN 서비스를 AgenticCP 플랫폼에 연동하여 사용자가 CDN Distribution의 전체 생명주기를 관리하고, 캐시 무효화 기능을 사용할 수 있도록 구현했습니다.
CloudFront는 전 세계 사용자에게 빠르고 안정적인 콘텐츠 전송을 제공하는 CDN 서비스로, 본 기능을 통해 Distribution 생성, 조회, 수정, 삭제 및 캐시 무효화를 통합 관리할 수 있습니다.
🎯 목표
CloudFront Distribution 생명주기 관리
캐시 무효화 기능
멀티 클라우드 아키텍처 준수
플랫폼 통합
🏗️ 구현 내용
1. 아키텍처
Hexagonal Architecture 패턴을 따라 Port & Adapter 구조로 구현했습니다.
Outbound Ports (인터페이스)
CDNManagementPort: Distribution 생명주기 관리 (생성, 수정, 삭제)CDNDiscoveryPort: Distribution 조회 (목록, 단건, 존재 여부)CDNInvalidationPort: 캐시 무효화 관리 (생성, 조회)Adapters (구현체)
AwsCloudFrontManagementAdapter: AWS CloudFront Distribution 관리AwsCloudFrontDiscoveryAdapter: AWS CloudFront Distribution 조회AwsCloudFrontInvalidationAdapter: AWS CloudFront 캐시 무효화AwsCloudFrontMapper: AWS SDK 모델 ↔ CloudResource 변환AwsCloudFrontErrorTranslator: AWS 예외 → 도메인 예외 변환Services
CDNPortRouter: ProviderType 기반 포트 라우팅CDNUseCaseService: 비즈니스 로직 오케스트레이션Configuration
AwsCloudFrontConfig: CloudFrontClient 빈 생성 및 ThreadLocal 자격증명 관리2. 주요 기능 구현
2.1 Distribution 관리
2.2 캐시 무효화
2.3 DB 동기화
CloudResource엔티티에 Distribution 정보 저장metadata필드(JSONB)에 Distribution 상세 정보 저장2.4 보안 및 감사
@AuditRequired어노테이션을 통한 감사 로깅CDN_DISTRIBUTION3. 데이터 모델
Port Models (내부 도메인 모델)
CreateDistributionCommand: Distribution 생성 명령UpdateDistributionCommand: Distribution 수정 명령DeleteDistributionCommand: Distribution 삭제 명령CreateInvalidationCommand: 캐시 무효화 생성 명령InvalidationResult: 캐시 무효화 결과 (내부 포트 모델)OriginConfig: Origin 설정 VOCacheBehaviorConfig: Cache Behavior 설정 VODTOs (외부 API 모델)
CDNDistributionCreateRequest: Distribution 생성 요청CDNDistributionUpdateRequest: Distribution 수정 요청CDNDistributionQueryRequest: Distribution 조회 요청CDNInvalidationRequest: 캐시 무효화 생성 요청CDNInvalidationResponse: 캐시 무효화 응답CloudResource: Distribution 조회/생성/수정 응답 (다른 리소스와 일관성 유지)4. 에러 처리
AwsCloudFrontErrorTranslator: AWS SDK 예외를 도메인 예외로 변환BusinessException: 비즈니스 로직 예외ResourceNotFoundException: 리소스 미발견 예외🧪 테스트
단위 테스트
Adapter 테스트
AwsCloudFrontManagementAdapterTest: Distribution 생성, 수정, 삭제 테스트AwsCloudFrontDiscoveryAdapterTest: Distribution 조회 테스트AwsCloudFrontInvalidationAdapterTest: 캐시 무효화 테스트Service 테스트
CDNUseCaseServiceTest: 비즈니스 로직 테스트CDNUseCaseServiceDbSyncTest: DB 동기화 테스트🚀 API 엔드포인트
Distribution 관리
POST /api/v1/clouds/{cloudAccountId}/cloudfront/distributions- Distribution 생성GET /api/v1/clouds/{cloudAccountId}/cloudfront/distributions- Distribution 목록 조회GET /api/v1/clouds/{cloudAccountId}/cloudfront/distributions/{distributionId}- Distribution 상세 조회PUT /api/v1/clouds/{cloudAccountId}/cloudfront/distributions/{distributionId}- Distribution 수정DELETE /api/v1/clouds/{cloudAccountId}/cloudfront/distributions/{distributionId}- Distribution 삭제캐시 무효화
POST /api/v1/clouds/{cloudAccountId}/cloudfront/distributions/{distributionId}/invalidations- 캐시 무효화 생성GET /api/v1/clouds/{cloudAccountId}/cloudfront/distributions/{distributionId}/invalidations/{invalidationId}- 캐시 무효화 상태 조회📝 사용 예시
Distribution 생성
캐시 무효화 생성
IAM 권한: CloudFront 작업을 수행하려면 적절한 IAM 권한이 필요합니다.
Distribution 삭제: 활성화된 Distribution을 삭제하려면 먼저 비활성화되어야 하며, 배포가 완료될 때까지 대기해야 합니다. 본 구현에서는 자동으로 처리됩니다.
배포 대기 시간: Distribution 비활성화 후 배포 완료까지 최대 10분까지 대기할 수 있습니다.
ETag 동시성 제어: Distribution 수정 및 삭제 시 ETag를 사용하여 동시성 제어를 수행합니다.
🔄 향후 개선 사항
✅ 체크리스트