Skip to content

[FEATURE] AWS ElastiCache 연동 #184

@syeongkim

Description

@syeongkim

상위 UserStory

#170

Feature 제목

AWS ElastiCache 연동

Feature 설명

AWS ElastiCache를 AgenticCP 플랫폼에 연동하여 사용자가 인메모리 캐시 클러스터를 생성, 조회, 수정, 삭제할 수 있도록 합니다. ElastiCache는 Redis와 Memcached를 지원하는 인메모리 캐싱 서비스로, 데이터베이스 쿼리 결과 캐싱, 세션 스토어, 실시간 데이터 처리 성능 향상 등에 활용됩니다. 본 Feature는 ElastiCache 클러스터의 전체 생명주기를 관리하는 핵심 기능을 제공합니다.

주요 기능

  • ElastiCache 클러스터 생성
    • Redis/Memcached 엔진 선택 지원
    • 노드 타입 및 개수 설정
    • 파라미터 그룹 설정 (기본/커스텀)
    • 태그 설정 포함
    • VPC 서브넷 그룹 연동
  • ElastiCache 클러스터 조회 (단건/목록)
    • 클러스터 상태 정보 포함 (creating, available, modifying, deleting)
    • 엔드포인트 정보 포함 (접속 주소)
  • ElastiCache 클러스터 수정
    • 노드 개수 조정 (스케일링)
    • 파라미터 그룹 변경
    • 태그 수정 포함
  • ElastiCache 클러스터 삭제
    • 최종 스냅샷 생성 옵션 (Redis만 지원)

API 엔드포인트

  • POST /api/v1/clouds/{cloudAccountId}/inmemory-caches
    • 클러스터 생성 (엔진, 노드, 파라미터, 태그 포함)
  • GET /api/v1/clouds/{cloudAccountId}/inmemory-caches
    • 클러스터 목록 조회 (상태 정보 포함)
  • GET /api/v1/clouds/{cloudAccountId}/inmemory-caches/{cacheClusterId}
    • 클러스터 상세 조회 (상태, 엔드포인트, 노드 정보 포함)
  • PUT /api/v1/clouds/{cloudAccountId}/inmemory-caches/{cacheClusterId}
    • 클러스터 수정 (노드 개수, 파라미터, 태그 수정 포함)
  • DELETE /api/v1/clouds/{cloudAccountId}/inmemory-caches/{cacheClusterId}
    • 클러스터 삭제 (최종 스냅샷 옵션 포함)

데이터 모델

  • Entity: CloudResource (공통 엔티티 사용)
  • DTO: InMemoryCacheClusterCreateRequest (engine, nodeType, numNodes, tags 포함), InMemoryCacheClusterUpdateRequest (numNodes, parameterGroup, tags 포함), InMemoryCacheClusterResponse (status, endpoint, properties 포함)
  • Repository

기술 스택

  • Spring Boot
  • Spring Data JPA
  • Spring Security
  • AWS SDK

기타 기술

No response

예상 작업 시간

  • 1-2시간
  • 3-4시간
  • 5-8시간
  • 1-2일
  • 3-5일

우선순위

  • 높음 (P0)
  • 중간 (P1)
  • 낮음 (P2)

예상 완료 일정

2025-12-19

아키텍처 고려사항

1. Hexagonal Architecture 적용

domain/cloud/
├── adapter/outbound/aws/elasticache/
│   ├── AwsElastiCacheManagementAdapter.java    # 클러스터 생명주기 관리
│   ├── AwsElastiCacheDiscoveryAdapter.java     # 클러스터 조회
│   ├── AwsElastiCacheMapper.java               # 도메인-AWS API 매핑
│   └── AwsElastiCacheErrorTranslator.java      # AWS 에러 변환
├── port/outbound/inmemorycache/
│   ├── InMemoryCacheManagementPort.java        # 클러스터 생명주기 포트
│   └── InMemoryCacheDiscoveryPort.java         # 클러스터 조회 포트
├── service/inmemorycache/
│   ├── InMemoryCachePortRouter.java            # 포트 라우팅
│   └── InMemoryCacheUseCaseService.java        # 유스케이스 서비스
└── controller/
    └── InMemoryCacheController.java            # REST API 컨트롤러

2. CspCapability 등록

@PostConstruct
public void initializeElastiCacheCapabilities() {
    CspCapability capability = CspCapability.builder()
        .supportsStart(false)           // ElastiCache는 start/stop 개념 없음 (reboot만 가능)
        .supportsStop(false)
        .supportsTerminate(true)        // 클러스터 삭제 가능
        .supportsTagging(true)          // 태그 지원
        .supportsListByTag(true)        // 태그 기반 조회 지원
        .build();
    
    capabilityRegistry.register(
        ProviderType.AWS,
        "ElastiCache",
        "CacheCluster",
        capability
    );
}

테스트 계획

단위 테스트

  • Adapter 레이어 테스트

    • AwsElastiCacheManagementAdapter: 클러스터 CRUD 작업 테스트
    • AwsElastiCacheMapper: 도메인 ↔ AWS SDK 모델 변환 테스트
    • AwsElastiCacheErrorTranslator: AWS 예외 → 도메인 예외 변환 테스트
  • Service 레이어 테스트

    • InMemoryCachePortRouter: 포트 라우팅 로직 테스트
    • InMemoryCacheUseCaseService: 비즈니스 로직 테스트
    • CloudResource 저장/조회 로직 테스트

관련 이슈

No response

제약사항

1. AWS ElastiCache 제약사항

  • 클러스터 삭제 전 연결된 리소스 확인 필요
  • 클러스터 수정 시 재부팅 필요한 파라미터 있음 (다운타임 발생)
  • Memcached는 스냅샷 미지원 (Redis만 스냅샷 가능)
  • VPC 내부에만 생성 가능 (Subnet Group 필수)
  • 일부 노드 타입은 특정 리전에서만 사용 가능

2. 기술적 제약사항

  • 클러스터 상태 변경 완료까지 수분~수십분 소요 (비동기 처리)
  • 노드 개수 조정 시 서비스 중단 가능성 (Redis Cluster Mode는 중단 없음)
  • JSONB 필드 제약: properties와 status는 항상 유효한 JSON 문자열이어야 함
  • 직렬화/역직렬화 오버헤드: 대량 조회 시 성능 고려 필요

3. 비즈니스 제약사항

  • 사용자의 AWS 계정에 ElastiCache 권한 필요
  • ElastiCache 서비스 한도 고려 필요 (클러스터 수, 노드 수 제한 등)
  • VPC와 Subnet Group이 미리 생성되어 있어야 함

리스크

No response

성능 요구사항

No response

보안 고려사항

No response

비고

No response

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions