Skip to content

Conversation

@hyobin-yang
Copy link

[FEATURE] AWS Route53(DNS) 관리 기능 구현

개요

Issue #181에 따라 AWS Route53(DNS) 호스팅 존 관리 기능을 헥사고날 아키텍처로 구현했습니다.
멀티 클라우드 환경을 고려하여 CSP 중립적인 인터페이스를 제공하며, 현재는 AWS Route53을 지원합니다.

구현 범위

  • Phase 1: Command 모델 및 포트 인터페이스 정의
  • Phase 2: AWS Route53 어댑터 구현
  • Phase 3: Service 계층 구현
  • Phase 4: Controller 및 DTO 구현
  • Phase 5: Capability 등록

구현 내용

1. CloudResource 리소스 타입 확장

  • CloudResource.ResourceTypeDNS_ZONE 추가
  • DNS 호스팅 존을 식별할 수 있는 리소스 타입 정의

2. AWS Route53 설정 클래스 (AwsDnsConfig)

위치: src/main/java/com/agenticcp/core/domain/cloud/adapter/outbound/aws/config/AwsDnsConfig.java

  • 세션 자격증명 기반 Route53Client 생성
  • Route53은 글로벌 서비스이므로 Region.AWS_GLOBAL 사용
  • 멀티 테넌트 환경 지원 (세션 기반 자격증명)

주요 기능:

  • createRoute53Client(): 세션 자격증명으로 Route53Client 생성
  • 세션 검증 및 AWS 세션 캐스팅
  • 자격증명 변환 (도메인 모델 → AWS SDK)

3. AWS Route53 매퍼 (AwsDnsMapper)

위치: src/main/java/com/agenticcp/core/domain/cloud/adapter/outbound/aws/dns/AwsDnsMapper.java

  • AWS SDK 객체와 CloudResource 간 변환 담당
  • CSP 중립적 Command를 AWS SDK 요청으로 변환

주요 기능:

  • toCloudResource(): HostedZone → CloudResource 변환 (다양한 Command 타입 지원)
  • toCreateRequest(): DnsCreateCommand → CreateHostedZoneRequest 변환
  • Zone name trailing dot 처리 (Route53은 . 포함, CSP 중립적으로 저장)
  • Zone ID 형식 변환 (/hostedzone/Z1234567890Z1234567890)
  • Public/Private Zone 구분 처리
  • VPC 연결 지원 (Private Zone)
  • Configuration 및 Metadata JSON 구성

4. AWS Route53 관리 어댑터 (AwsDnsManagementAdapter)

위치: src/main/java/com/agenticcp/core/domain/cloud/adapter/outbound/aws/dns/AwsDnsManagementAdapter.java

  • DnsManagementPort 인터페이스 구현
  • 호스팅 존의 생명주기 관리 (생성/수정/삭제)

주요 기능:

  • createHostedZone(): 호스팅 존 생성
    • Public/Private Zone 지원
    • VPC 연결 지원 (Private Zone)
    • Caller Reference 자동 생성 (UUID)
  • updateHostedZone(): 호스팅 존 수정
    • Comment 업데이트 지원
    • 업데이트 후 최신 정보 조회
  • deleteHostedZone(): 호스팅 존 삭제
    • 레코드 존재 시 삭제 불가 처리
    • 에러 메시지 기반 예외 처리

5. AWS Route53 발견 어댑터 (AwsDnsDiscoveryAdapter)

위치: src/main/java/com/agenticcp/core/domain/cloud/adapter/outbound/aws/dns/AwsDnsDiscoveryAdapter.java

  • DnsDiscoveryPort 인터페이스 구현
  • 호스팅 존 조회 기능 제공

주요 기능:

  • listHostedZones(): 호스팅 존 목록 조회
    • 페이징 지원
    • Zone name 필터링 (메모리 기반)
    • Zone type 필터링 (PUBLIC/PRIVATE)
    • VPC ID 필터링 (성능 고려하여 제한적 지원)
  • getHostedZone(): 특정 호스팅 존 조회
    • Zone ID 기반 조회
    • NotFoundException 처리
  • getZoneStatus(): 호스팅 존 상태 조회
    • ACTIVE/NOT_FOUND 반환

6. 의존성 추가

파일: pom.xml

  • AWS SDK Route53 의존성 추가
    <dependency>
        <groupId>software.amazon.awssdk</groupId>
        <artifactId>route53</artifactId>
    </dependency>

아키텍처 특징

헥사고날 아키텍처 준수

  • 포트 인터페이스: DnsManagementPort, DnsDiscoveryPort 구현
  • 어댑터 분리: AWS 전용 로직은 adapter/outbound/aws/dns/에만 존재
  • 의존성 방향: Service → Port → Adapter (단방향)
  • 도메인 모델: CloudResource 엔티티 활용

CSP 독립성 보장

  • Command 모델: CSP 중립적 필드 사용
  • ProviderSpecificConfig: CSP별 특화 설정 지원
  • Mapper: CSP 특화 변환 로직 캡슐화

보안 및 자격증명 관리

  • JIT 세션 관리: Service 레벨에서 세션 획득 및 Port에 전달
  • ThreadLocal 자격증명: 멀티 테넌트 환경 지원
  • 세션 검증: 유효성 검사 및 만료 확인

Route53 특화 고려사항

1. 글로벌 서비스

  • Route53은 리전 개념이 없지만, 일관성을 위해 리전 파라미터는 유지
  • AwsDnsConfig에서 Region.AWS_GLOBAL 사용
  • VPC 연결 시에만 리전이 필요

2. 호스팅 존 이름 형식

  • Route53은 zone name 끝에 trailing dot(.)을 포함 (예: example.com.)
  • 매퍼에서 trailing dot 제거하여 저장 (CSP 중립적)
  • 표시 시에는 trailing dot 없이 표시

3. Private Zone과 VPC 연결

  • Private Zone은 VPC와 연결되어야 함
  • DnsCreateCommandvpcId 필드로 VPC 지정
  • AWS의 경우 VPC.vpcId()VPC.vpcRegion() 모두 필요

4. 네임서버 정보

  • 호스팅 존 생성 시 네임서버 정보 제공
  • CreateHostedZoneResponse.delegationSet().nameServers()에서 추출
  • configurationmetadata JSON에 저장

5. Caller Reference

  • Route53은 중복 생성 방지를 위해 callerReference 필수
  • UUID 생성하여 사용

파일 구조

src/main/java/com/agenticcp/core/domain/cloud/
├── adapter/outbound/aws/
│   ├── config/
│   │   └── AwsDnsConfig.java              # Route53 클라이언트 설정
│   └── dns/
│       ├── AwsDnsMapper.java              # AWS SDK ↔ CloudResource 변환
│       ├── AwsDnsManagementAdapter.java   # 호스팅 존 생명주기 관리
│       └── AwsDnsDiscoveryAdapter.java    # 호스팅 존 조회
├── entity/
│   └── CloudResource.java                 # ResourceType.DNS_ZONE 추가
└── ...

참고

체크리스트

  • CloudResource.ResourceType에 DNS_ZONE 추가
  • AwsDnsConfig 클래스 생성
  • AwsDnsMapper 클래스 생성
  • AwsDnsManagementAdapter 구현
  • AwsDnsDiscoveryAdapter 구현
  • ProviderScoped 인터페이스 구현
  • pom.xml에 Route53 의존성 추가
  • 단위 테스트 작성
  • 통합 테스트 작성

@hyobin-yang hyobin-yang self-assigned this Dec 19, 2025
@KwonSunJae KwonSunJae merged commit 4cf3b7a into develop Dec 31, 2025
3 checks passed
@KwonSunJae KwonSunJae deleted the feature/181 branch December 31, 2025 15:03
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