다음을 통해 공유


Spring Boot 애플리케이션을 Azure Container Apps로 마이그레이션

이 가이드에서는 Azure Container Apps에서 실행되도록 기존 Spring Boot 애플리케이션을 마이그레이션할 때 알아야 할 사항에 대해 설명합니다.

사전 마이그레이션

마이그레이션을 성공적으로 수행하려면 시작하기 전에 다음 섹션에서 설명하는 평가 및 인벤토리 단계를 완료합니다.

이러한 마이그레이션 전 요구 사항 중에서 충족할 수 없는 요구 사항이 있는 경우 다음 마이그레이션 관련 가이드를 참조하세요.

  • 실행 가능한 JAR 애플리케이션을 Azure Kubernetes Service의 컨테이너로 마이그레이션(지침 계획)
  • 실행 파일 JAR 애플리케이션을 Azure Virtual Machines로 마이그레이션(지침 계획)

애플리케이션 구성 요소 검사

로컬 상태 식별

PaaS 환경에서는 애플리케이션이 지정된 시간에 정확히 한 번 실행되도록 보장되지 않습니다. 단일 인스턴스에서 실행되도록 애플리케이션을 구성하더라도 다음과 같은 경우에는 중복 인스턴스를 만들 수 있습니다.

  • 오류 또는 시스템 업데이트 때문에 애플리케이션을 물리적 호스트에 재배치해야 합니다.
  • 애플리케이션을 업데이트하는 중입니다.

이러한 경우 새 인스턴스의 시작이 완료될 때까지 원래 인스턴스는 계속 실행됩니다. 이 패턴은 애플리케이션에 다음과 같은 잠재적으로 중요한 영향을 미칠 수 있습니다.

  • 싱글톤이 진짜 단일 항목이라고 보장할 수 없습니다.
  • 외부 스토리지에 유지되지 않는 데이터는 단일 물리적 서버 또는 VM보다 빨리 손실될 수 있습니다.

Azure Container Apps로 마이그레이션하기 전에 코드에 손실되거나 중복되지 않아야 하는 로컬 상태가 포함되어 있지 않은지 확인합니다. 로컬 상태가 있는 경우 해당 상태를 애플리케이션 외부에 저장하도록 코드를 변경하세요. 클라우드 지원 애플리케이션은 일반적으로 다음 옵션과 같은 위치에 애플리케이션 상태를 저장합니다.

파일 시스템의 사용 여부 및 방법 확인

서비스가 로컬 파일 시스템에 쓰거나 읽는 인스턴스를 찾습니다. 단기/임시 파일을 쓰고 읽는 위치와 수명이 긴 파일을 쓰고 읽는 위치를 식별합니다.

Azure Container Apps는 여러 유형의 스토리지를 제공합니다. 임시 스토리지는 임시 데이터를 읽고 쓸 수 있으며 실행 중인 컨테이너 또는 복제본에서 사용할 수 있습니다. Azure File은 영구 스토리지를 제공하며 여러 컨테이너에서 공유할 수 있습니다. 자세한 내용은 Azure Container Apps에서 스토리지 탑재 사용을 참조 하세요.

읽기 전용 정적 콘텐츠

애플리케이션이 현재 정적 콘텐츠를 제공하는 경우 대체 위치가 필요합니다. 정적 콘텐츠를 Azure Blob Storage로 이동하고 전 세계적으로 빠른 다운로드를 위해 Azure CDN을 추가하는 것이 좋습니다. 자세한 내용은 Azure Storage에서 정적 웹 사이트 호스팅빠른 시작: Azure CDN과 Azure Storage 계정 통합을 참조하세요.

동적으로 게시된 정적 콘텐츠

애플리케이션이 애플리케이션 자체에서 업로드하거나 생성한 정적 콘텐츠를 지원하는 경우 생성 후 변경되지 않은 상태로 유지되는 경우 Azure Blob Storage와 Azure CDN을 통합할 수 있습니다. Azure Function을 사용하여 업로드를 관리하고 필요한 경우 CDN 새로 고침을 트리거할 수도 있습니다. Azure Functions를 사용하여 정적 콘텐츠 업로드 및 CDN 사전 로드에서 사용할 샘플 구현을 제공했습니다.

서비스에 OS 관련 코드가 포함되어 있는지 확인

애플리케이션에 호스트 OS에 대한 종속성이 있는 코드가 포함된 경우 해당 종속성을 제거하려면 리팩터링해야 합니다. 예를 들어 파일 시스템 경로 File.Separator Paths.get/ 사용 또는 \ 사용 또는 응용 프로그램이 Windows에서 실행 중인 경우를 바꿔야 할 수 있습니다.

지원되는 플랫폼으로 전환

Dockerfile을 수동으로 만들고 컨테이너화된 애플리케이션을 Azure Container Apps에 배포하는 경우 JRE/JDK 버전을 포함하여 배포를 완전히 제어할 수 있습니다.

아티팩트에서 배포하기 위해 Azure Container Apps는 특정 버전의 Java(8, 11, 17 및 21)와 특정 버전의 Spring Boot 및 Spring Cloud 구성 요소도 제공합니다. 호환성을 보장하려면 먼저 애플리케이션을 현재 환경에서 지원되는 Java 버전 중 하나로 마이그레이션한 다음, 나머지 마이그레이션 단계를 진행합니다. 결과 구성을 완전히 테스트해야 합니다. 이러한 테스트에서 Linux 배포판의 안정적인 최신 릴리스를 사용합니다.

참고 항목

이 유효성 검사는 현재 서버가 지원되지 않는 JDK(예: Oracle JDK 또는 IBM OpenJ9)에서 실행 중인 경우에 특히 중요합니다.

현재 Java 버전을 가져오려면 프로덕션 서버에 로그인하고 다음 명령을 실행합니다.

java -version

지원되는 버전의 Java, Spring Boot 및 Spring Cloud와 업데이트에 대한 지침은 Azure Container Apps의 Java 개요를 참조하세요.

애플리케이션이 예약된 작업에 의존하는지 확인

Spring Batch 프레임워크를 기반으로 하는 Unix cron 작업 또는 짧은 라이브 애플리케이션과 같은 임시 애플리케이션은 Azure Container Apps에서 작업으로 실행되어야 합니다. 자세한 내용은 Azure Container Apps의 작업을 참조 하세요. 애플리케이션이 장기 실행 애플리케이션이고 Quartz 또는 Spring Batch와 같은 예약 프레임워크를 사용하여 정기적으로 작업을 실행하는 경우 Azure Container Apps는 해당 애플리케이션을 호스트할 수 있습니다. 그러나 스케일 아웃 또는 롤링 업그레이드 중에 동일한 애플리케이션 인스턴스가 예약된 기간당 두 번 이상 실행되는 경합 상태를 방지하기 위해 애플리케이션은 크기 조정을 적절하게 처리해야 합니다.

애플리케이션 코드 내부 또는 외부에서 프로덕션 서버에서 실행 중인 예약된 작업을 인벤토리로 작성합니다.

Spring Boot 버전 식별

마이그레이션되는 각 애플리케이션의 종속성을 검사하여 Spring Boot 버전을 확인합니다.

Maven

Maven 프로젝트에서 Spring Boot 버전은 일반적으로 POM 파일의 <parent> 요소에 있습니다.

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.3.3</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
Gradle

Gradle 프로젝트에서 Spring Boot 버전은 일반적으로 플러그 인 버전 org.springframework.boot 으로 섹션에서 찾을 plugins 수 있습니다.

plugins {
  id 'org.springframework.boot' version '3.3.3'
  id 'io.spring.dependency-management' version '1.1.6'
  id 'java'
}

3.x 이전의 Spring Boot 버전을 사용하는 애플리케이션의 경우 Spring Boot 2.0 마이그레이션 가이드 또는 Spring Boot 3.0 마이그레이션 가이드에 따라 지원되는 Spring Boot 버전으로 업데이트합니다. 지원되는 버전은 Spring Boot 및 Spring Cloud 버전을 참조 하세요.

로그 집계 솔루션 식별

마이그레이션하는 애플리케이션에서 사용 중인 로그 집계 솔루션을 식별합니다. 기록된 이벤트를 사용할 수 있도록 마이그레이션에서 진단 설정을 구성해야 합니다. 자세한 내용은 콘솔 로깅 확인 및 진단 설정 구성 섹션을 참조하세요.

APM(애플리케이션 성능 관리) 에이전트 식별

애플리케이션에서 사용하는 애플리케이션 성능 관리 에이전트를 식별합니다. Azure Containers Apps는 APM 통합에 대한 기본 제공 지원을 제공하지 않습니다. 컨테이너 이미지를 준비하거나 APM 도구를 코드에 직접 통합해야 합니다. 애플리케이션의 성능을 측정하지만 아직 APM을 통합하지 않은 경우 Azure 애플리케이션 Insights를 사용하는 것이 좋습니다. 자세한 내용은 마이그레이션 섹션을 참조하세요.

인벤토리 외부 리소스

데이터 원본, JMS 메시지 브로커 및 다른 서비스의 URL과 같은 외부 리소스를 식별합니다. Spring Boot 애플리케이션에서는 일반적으로 application.properties 또는 application.yml 파일src/main/resources 폴더에서 이러한 리소스에 대한 구성을 찾을 수 있습니다.

데이터베이스

Spring Boot 애플리케이션의 경우 연결 문자열 일반적으로 외부 데이터베이스에 종속된 경우 구성 파일에 표시됩니다. 다음은 application.properties 파일의 예제입니다.

spring.datasource.url=jdbc:mysql://localhost:3306/mysql_db
spring.datasource.username=dbuser
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

다음은 application.yaml 파일의 예제입니다.

spring:
  data:
    mongodb:
      uri: mongodb://mongouser:deepsecret@mongoserver.contoso.com:27017

가능한 구성 시나리오는 다음 Spring Data 설명서를 참조하세요.

JMS 메시지 브로커

관련 종속성에 대한 빌드 매니페스트(일반적으로 pom.xml 또는 build.gradle 파일)를 확인하여 사용 중인 broker 또는 broker를 식별합니다.

예를 들어 ActiveMQ를 사용하는 Spring Boot 애플리케이션은 일반적으로 pom.xml 파일에 이 종속성을 포함합니다.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-activemq</artifactId>
</dependency>

상업용 브로커를 사용하는 Spring Boot 애플리케이션은 일반적으로 broker의 JMS 드라이버 라이브러리에 직접 종속성을 포함합니다. build.gradle 파일의 예제는 다음과 같습니다.

    dependencies {
      ...
      compile("com.ibm.mq:com.ibm.mq.allclient:9.4.0.5")
      ...
    }

사용 중인 broker 또는 broker를 식별한 후 해당 설정을 찾습니다. Spring Boot 애플리케이션에서 이러한 설정은 일반적으로 애플리케이션 디렉터리의 application.propertiesapplication.yml 파일에서 찾을 수 있습니다.

application.properties 파일의 ActiveMQ 예제는 다음과 같습니다.

spring.activemq.brokerurl=broker:(tcp://localhost:61616,network:static:tcp://remotehost:61616)?persistent=false&useJmx=true
spring.activemq.user=admin
spring.activemq.password=tryandguess

ActiveMQ 구성에 대한 자세한 내용은 Spring Boot 메시징 설명서를 참조하세요.

application.yaml 파일의 IBM MQ 예제는 다음과 같습니다.

ibm:
  mq:
    queueManager: qm1
    channel: dev.ORDERS
    connName: localhost(14)
    user: admin
    password: big$ecr3t

IBM MQ 구성에 대한 자세한 내용은 IBM MQ Spring 구성 요소 설명서를 참조 하세요.

외부 캐시 확인

사용 중인 외부 캐시를 확인합니다. Redis는 Spring Data Redis를 통해 자주 사용됩니다. 구성 정보는 Spring Data Redis 설명서를 참조하세요.

Java 또는 XML에서 각 구성을 검색하여 Spring Session을 통해 세션 데이터가 캐시되는지 여부를 확인합니다.

ID 공급자

애플리케이션에서 사용하는 ID 공급자를 식별합니다. ID 공급자를 구성하는 방법에 대한 자세한 내용은 다음을 참조하세요.

비표준 포트에 의존하는 클라이언트 식별

Azure Container Apps를 사용하면 Azure Container Apps 리소스 구성에 따라 포트를 노출할 수 있습니다. 예를 들어 Spring Boot 애플리케이션은 기본적으로 8080 포트를 수신 대기하지만 필요에 따라 환경 변수 SERVER_PORT 또는 함께 server.port 설정할 수 있습니다.

기타 모든 외부 리소스

이 가이드에서 가능한 모든 외부 종속성을 문서화하는 것은 불가능합니다. 마이그레이션 후에는 애플리케이션의 모든 외부 종속성을 충족할 수 있는지 확인해야 합니다.

인벤토리 구성 원본 및 비밀

인벤토리 암호 및 보안 문자열

모든 비밀 문자열 및 암호는 프로덕션 배포의 모든 속성 및 구성 파일 및 모든 환경 변수를 확인합니다. Spring Boot 애플리케이션에서는 일반적으로 application.properties 또는 application.yml 파일에서 이러한 문자열을 찾을 수 있습니다.

인증서 인벤토리화

공용 SSL 엔드포인트 또는 백 엔드 데이터베이스 및 기타 시스템과의 통신에 사용되는 모든 인증서를 문서화합니다. 다음 명령을 실행하여 프로덕션 서버에서 모든 인증서를 볼 수 있습니다.

keytool -list -v -keystore <path to keystore>

배포 아키텍처 검사

각 서비스에 대한 하드웨어 요구 사항 문서화

Spring Boot 애플리케이션에 대한 다음 정보를 문서화합니다.

  • 실행되는 인스턴스 수
  • 각 인스턴스에 할당되는 CPU 수
  • 각 인스턴스에 할당되는 RAM 양

지역 복제/배포 문서화

Spring Boot 애플리케이션 인스턴스가 현재 여러 지역 또는 데이터 센터에 분산되어 있는지 확인합니다. 마이그레이션하는 애플리케이션의 작동 시간 요구 사항/SLA를 문서화합니다.

마이그레이션

Azure Container Apps 환경 만들기 및 앱 배포

Azure 구독에서 Azure Container Apps 인스턴스를 프로비전합니다. 보안 호스팅 환경이 함께 만들어집니다. 자세한 내용은 빠른 시작: Azure Portal을 사용하여 첫 번째 컨테이너 앱 배포를 참조하세요.

콘솔 로깅 확인 및 진단 설정 구성

모든 출력이 파일이 아닌 콘솔로 라우팅되도록 로깅을 구성합니다.

애플리케이션이 Azure Container Apps에 배포된 후에는 하나 이상의 로그 대상을 정의하도록 Container Apps 환경 내에서 로깅 옵션을 구성할 수 있습니다. 이러한 대상에는 Azure Monitor Log Analytics, Azure Event Hub 또는 기타 타사 모니터링 솔루션이 포함될 수 있습니다. 또한 로그 데이터를 사용하지 않도록 설정하고 런타임에만 로그를 볼 수 있는 옵션도 있습니다. 자세한 구성 지침은 Azure Container Apps의 Log Storage 및 모니터링 옵션을 참조 하세요.

영구 스토리지 구성

애플리케이션의 일부가 로컬 파일 시스템에 읽거나 쓰는 경우 로컬 파일 시스템을 대체하도록 영구 스토리지를 구성해야 합니다. 앱 설정을 통해 컨테이너에 탑재할 경로를 지정하고 앱에서 사용 중인 경로에 맞출 수 있습니다. 자세한 내용은 Azure Container Apps에서 스토리지 탑재 사용을 참조 하세요.

모든 인증서를 KeyVault로 마이그레이션

Azure Containers Apps는 앱 간의 보안 통신을 지원합니다. 애플리케이션은 보안 통신을 설정하는 프로세스를 관리할 필요가 없습니다. 프라이빗 인증서를 Azure Container Apps에 업로드하거나 Azure Container Apps에서 제공하는 무료 관리형 인증서를 사용할 수 있습니다. Azure Key Vault를 사용하여 인증서를 관리하는 것이 좋습니다. 자세한 내용은 Azure Container Apps의 인증서를 참조 하세요.

APM(애플리케이션 성능 관리) 통합 구성

앱이 컨테이너 이미지 또는 코드에서 배포되었는지 여부에 관계없이 Azure Container Apps는 이미지 또는 코드를 방해하지 않습니다. 따라서 애플리케이션을 APM 도구와 통합하는 것은 사용자 고유의 기본 설정 및 구현에 따라 달라집니다.

애플리케이션에서 지원되는 APM을 사용하지 않는 경우 Azure 애플리케이션 Insights가 한 가지 옵션입니다. 자세한 내용은 Spring Boot와 함께 Azure Monitor Application Insights 사용을 참조하세요.

애플리케이션 배포

az containerapp up 명령을 사용하여 Azure Container Apps 배포에 설명된 대로 마이그레이션된 각 마이크로 서비스(Spring Cloud Config Server 및 Spring Cloud Service Registry 포함 안 됨)를 배포합니다.

서비스별 비밀 및 외부화된 설정 구성

각 애플리케이션에 환경 변수로 구성 설정을 삽입할 수 있습니다. 이러한 변수를 수동으로 항목으로 설정하거나 비밀에 대한 참조로 설정할 수 있습니다. 구성에 대한 자세한 내용은 Azure Container Apps의 환경 변수 관리를 참조 하세요.

ID 공급자 마이그레이션 및 사용

Spring Cloud 애플리케이션에 인증 또는 권한 부여가 필요한 경우 ID 공급자에 액세스하도록 구성되었는지 확인합니다.

  • ID 공급자가 Microsoft Entra ID인 경우 변경할 필요가 없습니다.
  • ID 공급자가 온-프레미스 Active Directory 포리스트인 경우 Microsoft Entra ID를 사용하여 하이브리드 ID 솔루션을 구현하는 것이 좋습니다. 자세한 내용은 하이브리드 ID 설명서를 참조 하세요.
  • ID 공급자가 PingFederate와 같은 다른 온-프레미스 솔루션인 경우 Microsoft Entra Connect 토픽의 사용자 지정 설치를 참조하여 Microsoft Entra ID와의 페더레이션을 구성합니다. 또는 Spring Security를 사용하여 OAuth2/OpenID Connect 또는 SAML을 통해 ID 공급자를 사용하는 것이 좋습니다.

애플리케이션 공개

기본적으로 Azure Container Apps에 배포된 애플리케이션은 애플리케이션 URL을 통해 액세스할 수 있습니다. 앱이 자체 가상 네트워크를 사용하여 관리되는 환경의 컨텍스트에서 배포되는 경우 가상 네트워크에서만 퍼블릭 수신 또는 수신을 허용하도록 앱의 접근성 수준을 결정해야 합니다. 자세한 내용은 Azure Container Apps 환경의 네트워킹을 참조하세요.

마이그레이션 후

이제 마이그레이션을 완료했으므로 애플리케이션이 예상대로 작동하는지 확인합니다. 그 후에는 다음 권장 사항에 따라 애플리케이션을 클라우드 네이티브로 만들 수 있습니다.

  • 애플리케이션이 Spring Cloud Registry에서 작동하도록 설정하는 방안을 고려해 보세요. 이 구성 요소를 사용하면 배포된 다른 Spring 애플리케이션 및 클라이언트에서 애플리케이션을 동적으로 검색할 수 있습니다. 자세한 내용은 Azure Container Apps에서 Spring용 Eureka Server 구성 요소에 대한 설정 구성을 참조 하세요. 그런 다음 Spring Client Load Balancer를 사용하도록 애플리케이션 클라이언트를 수정합니다. Spring Client Load Balancer를 사용하면 클라이언트가 애플리케이션의 실행 중인 모든 인스턴스의 주소를 가져오고 다른 인스턴스가 손상되거나 응답하지 않는 경우 작동하는 인스턴스를 찾을 수 있습니다. 자세한 내용은 Spring 블로그의 Spring Tips: Spring Cloud Load Balancer를 참조하세요.

  • 애플리케이션을 공개하는 대신 Spring Cloud Gateway 인스턴스를 추가하는 것이 좋습니다. Spring Cloud Gateway는 Azure Container Apps 환경에 배포된 모든 애플리케이션에 대해 단일 엔드포인트를 제공합니다. Spring Cloud Gateway가 이미 배포된 경우 트래픽을 새로 배포된 애플리케이션으로 라우팅하도록 라우팅 규칙이 구성되어 있는지 확인합니다.

  • Spring Cloud 구성 서버를 추가하여 모든 Spring Cloud 애플리케이션에 대한 구성을 중앙에서 관리하고 버전 제어하는 것이 좋습니다. 먼저 구성을 보관하고 사용하도록 앱 인스턴스를 구성하는 Git 리포지토리를 만듭니다. 자세한 내용은 Azure Container Apps에서 Spring 구성 요소용 Config Server에 대한 설정 구성을 참조 하세요. 그런 다음, 다음 단계를 사용하여 구성을 마이그레이션합니다.

    1. 애플리케이션의 src/main/resources 디렉터리 내에서 다음 내용이 포함된 bootstrap.yml 파일을 만듭니다.

        spring:
          application:
            name: <your-application-name>
      
    2. 구성 Git 리포지토리에서 이전 단계와 동일한 애플리케이션 이름>.yml 파일을 your-application-name 만듭니<다. src/main/resources의 application.yml 파일에서 만든 새 파일로 설정을 이동합니다. 설정이 이전에 .properties 파일에 있었으면 먼저 YAML로 변환합니다. 온라인 도구 또는 IntelliJ 플러그인을 찾아서 이 변환을 수행할 수 있습니다.

    3. 위의 디렉터리에 application.yml 파일을 만듭니다. 이 파일을 사용하여 Azure Container Apps 환경의 모든 애플리케이션 간에 공유되는 설정 및 리소스를 정의할 수 있습니다. 이러한 설정에는 일반적으로 데이터 원본, 로깅 설정, Spring Boot Actuator 구성 등이 포함됩니다.

    4. 변경 내용을 Git 리포지토리에 커밋하고 푸시합니다.

    5. 애플리케이션에서 application.properties 또는 application.yml 파일을 제거합니다.

  • Spring 관리 구성 요소 관리자를 추가하여 actuator 엔드포인트를 노출하는 Spring Boot 웹 애플리케이션에 대한 관리 인터페이스를 사용하도록 설정하는 것이 좋습니다. 자세한 내용은 Azure Container Apps에서 Spring Boot 관리자 구성 요소 구성을 참조 하세요.

  • 일관된 자동 배포를 위해 배포 파이프라인을 추가하는 것이 좋습니다. 지침은 Azure Pipelines 및 GitHub Actions사용할 수 있습니다.

  • 컨테이너 앱 수정 버전, 수정 레이블 및 수신 트래픽 가중치를 사용하여 최종 사용자가 일부 또는 전부를 사용할 수 있도록 하기 전에 프로덕션의 코드 변경 내용을 테스트할 수 있는 청록색 배포를 사용하도록 설정하는 것이 좋습니다. 자세한 내용은 Azure Container Apps의 Blue-Green 배포를 참조 하세요.

  • 서비스 바인딩을 추가하여 애플리케이션을 지원되는 Azure 데이터베이스에 연결하는 것이 좋습니다. 이러한 서비스 바인딩을 사용하면 자격 증명을 포함한 연결 정보를 Spring Cloud 애플리케이션에 제공할 필요가 없습니다.

  • Java 개발 스택을 사용하도록 설정하여 애플리케이션에 대한 JVM 핵심 메트릭을 수집하는 것이 좋습니다. 자세한 내용은 Azure Container Apps의 Java 앱에 대한 Java 메트릭을 참조 하세요.

  • Azure Monitor 경고 규칙 및 작업 그룹을 추가하여 비정상적인 조건을 신속하게 감지하고 해결하는 것이 좋습니다. 자세한 내용은 Azure Container Apps에서 경고 설정을 참조 하세요.

  • Azure Container Apps 영역 중복성을 사용하도록 설정하여 지역의 영역에서 앱을 복제하는 것이 좋습니다. 영역 중단이 발생하면 트래픽이 부하 분산되고 복제본으로 자동으로 라우팅됩니다. 중복 설정에 대한 자세한 내용은 Azure Container Apps의 안정성을 참조 하세요.

  • Application Gateway에서 웹 애플리케이션 방화벽을 사용하여 일반적인 악용 및 취약성으로부터 Azure Container Apps를 보호하는 것이 좋습니다. 자세한 내용은 Application Gateway에서 웹 애플리케이션 방화벽을 사용하여 Azure Container Apps 보호를 참조 하세요.