Skip to content

[FEATURE] AWS ElastiCache 연동 #184

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

Fields

No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions