Skip to content

Conversation

@hyobin-yang
Copy link

📋 개요

이슈 #182에 따라 AWS Lambda (Serverless Function) 관리 기능을 Hexagonal Architecture 패턴에 따라 구현했습니다. 멀티 클라우드 환경을 고려하여 CSP 중립적인 인터페이스와 AWS 전용 어댑터를 분리하여 구현했습니다.

🎯 주요 기능

1. Function CRUD 작업

  • 생성: Lambda 함수 생성 (코드 URI 또는 ZIP 바이너리 지원)
  • 조회: 단일 함수 조회 및 목록 조회 (필터링, 페이징 지원)
  • 수정: 함수 설정 및 코드 업데이트
  • 삭제: 함수 삭제 (보상 트랜잭션 포함)

2. Function 실행

  • 동기 실행: RequestResponse 타입의 함수 호출
  • 비동기 실행: Event 타입의 함수 호출
  • DryRun: 함수 검증용 호출

3. Function Discovery

  • 함수 목록 조회 (필터링: functionName, runtime, vpcId, tags)
  • 함수 상세 정보 조회
  • 함수 상태 조회
  • 함수 코드 조회

📦 구현 내용

Phase 1: Port & Model 정의

Port Interfaces

  • FunctionManagementPort: 함수 생명주기 관리 (create, update, delete)
  • FunctionDiscoveryPort: 함수 조회 및 탐색 (list, get, getStatus, getCode)
  • FunctionInvocationPort: 함수 실행 (invoke, invokeAsync)

Command Models

  • FunctionCreateCommand: 함수 생성 명령
  • FunctionUpdateCommand: 함수 수정 명령
  • FunctionDeleteCommand: 함수 삭제 명령
  • FunctionQuery: 함수 조회 쿼리
  • FunctionInvokeCommand: 함수 실행 명령
  • GetFunctionCommand: 단일 함수 조회 명령

Phase 2: Service Layer 구현

FunctionUseCaseService

  • 비즈니스 로직 오케스트레이션
  • DTO ↔ Command 변환
  • CapabilityGuard를 통한 기능 지원 여부 검증
  • CloudResourceManagementHelper를 통한 리소스 등록
  • 보상 트랜잭션 로직 (DB 저장 실패 시 CSP 리소스 삭제)

FunctionPortRouter

  • ProviderType에 따른 어댑터 라우팅
  • Management, Discovery, Invocation 포트별 라우팅

Phase 3: DTO & Controller 구현

DTOs

  • FunctionCreateRequest: 함수 생성 요청
  • FunctionUpdateRequest: 함수 수정 요청
  • FunctionDeleteRequest: 함수 삭제 요청
  • FunctionQueryRequest: 함수 조회 요청
  • FunctionInvokeRequest: 함수 실행 요청
  • FunctionResponse: 함수 응답

FunctionController

  • RESTful API 엔드포인트 제공
  • @PreAuthorize를 통한 권한 검증
  • @AuditRequired를 통한 감사 로깅
  • Swagger 어노테이션을 통한 API 문서화

Phase 4: AWS Adapter 구현

AwsFunctionManagementAdapter

  • FunctionManagementPort 구현
  • Lambda 함수 생성/수정/삭제
  • AWS SDK v2 LambdaClient 사용

AwsFunctionDiscoveryAdapter

  • FunctionDiscoveryPort 구현
  • Lambda 함수 목록 조회 (in-memory 필터링)
  • Lambda 함수 상세 조회
  • Lambda 함수 상태 조회

AwsFunctionInvocationAdapter

  • FunctionInvocationPort 구현
  • 동기/비동기 함수 실행
  • InvocationType 매핑 (RequestResponse, Event, DryRun)

AwsFunctionMapper

  • AWS SDK 모델 ↔ CloudResource 변환
  • Command → AWS SDK Request 변환
  • Runtime enum → String 변환
  • lastModified String → LocalDateTime 변환
  • S3 URI 파싱 유틸리티

AwsFunctionConfig

  • LambdaClient 생성 및 관리
  • CloudSessionCredential 기반 동적 인증
  • Region 처리

🔧 기술적 세부사항

CSP 중립성 설계

  • 모든 Command와 Port 인터페이스는 CSP 중립적으로 설계
  • CSP별 특화 설정은 providerSpecificConfig Map으로 전달
  • Service Key: "LAMBDA" (AWS), "AZURE_FUNCTIONS" (Azure), "CLOUD_FUNCTIONS" (GCP)

JIT (Just-In-Time) Session Management

  • CloudSessionCredential을 어댑터에 전달하여 동적 인증
  • 세션 만료 시 자동 갱신 처리

보상 트랜잭션

  • CSP 리소스 생성 성공 후 DB 저장 실패 시, 생성된 리소스를 자동 삭제
  • 데이터 일관성 보장

에러 처리

  • CloudErrorTranslator를 통한 AWS SDK 예외 변환
  • BusinessException을 통한 비즈니스 예외 처리

타입 변환 처리

  • AWS SDK Runtime enum → String 변환
  • AWS SDK Architecture enum List → String List 변환
  • AWS SDK lastModified String (ISO-8601) → LocalDateTime 변환

코드 배포 방식

  • S3 URI 지원: s3://bucket/key 또는 bucket/key 형식
  • ZIP 바이너리 직접 업로드 지원

📦 의존성 추가

pom.xml

<dependency>
    <groupId>software.amazon.awssdk</groupId>
    <artifactId>lambda</artifactId>
</dependency>

✅ 테스트 고려사항

  • 단위 테스트 작성 필요 (FunctionUseCaseService)
  • 어댑터 통합 테스트 작성 필요
  • API 통합 테스트 작성 필요
  • 보상 트랜잭션 시나리오 테스트 필요

🔍 알려진 제한사항

  1. 함수 코드 조회: getFunctionCode 메서드가 완전히 구현되지 않음 (빈 배열 반환)
  2. 태그 조회: AWS Lambda의 태그는 별도 API 호출 필요 (현재는 어댑터에서 전달 필요)
  3. 필터링: AWS Lambda API의 제한으로 인해 일부 필터링은 in-memory에서 수행
  4. 다중 리전 조회: 현재는 단일 리전만 조회 가능 (AWS Lambda API 제약)

📝 참고사항

  • 모든 구현은 Hexagonal Architecture 패턴을 따라 CSP 중립적으로 설계됨
  • AWS SDK v2 for Java 사용
  • Spring Boot 3.3.5, Java 17 기반
  • 감사 로깅은 @AuditRequired 어노테이션으로 처리
  • 권한 검증은 @PreAuthorize로 처리

@hyobin-yang hyobin-yang self-assigned this Dec 19, 2025
@KwonSunJae KwonSunJae merged commit 05c426a into develop Dec 31, 2025
3 checks passed
@KwonSunJae KwonSunJae deleted the feature/182 branch December 31, 2025 15:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants