JBoss EAP 애플리케이션을 Azure App Service의 JBoss EAP로 마이그레이션

이 가이드에서는 Azure App Service 인스턴스의 JBoss EAP에서 실행되도록 기존 JBoss EAP 애플리케이션을 마이그레이션하려는 경우 알아야 할 사항에 대해 설명합니다.

사전 마이그레이션

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

서버 용량 인벤토리화

현재 프로덕션 서버의 하드웨어(메모리, CPU, 디스크)와 평균 및 최대 요청 수, 리소스 사용률을 문서화합니다. 선택한 마이그레이션 경로에 관계없이 이 정보가 필요합니다. 예를 들어 노드 풀의 VM 크기, 컨테이너에서 사용할 메모리의 양, 컨테이너에 필요한 CPU 공유 수를 선택하는 데 도움이 됩니다.

모든 비밀 인벤토리화

프로덕션 서버의 모든 속성 및 구성 파일에 비밀과 암호가 있는지 확인합니다. WAR에서 jboss-web.xml 파일을 확인합니다. 암호 또는 자격 증명이 포함된 구성 파일은 애플리케이션 내에서도 찾을 수 있습니다.

이러한 비밀은 Azure Key Vault에 저장하는 것이 좋습니다. 자세한 내용은 Azure Key Vault 기본 개념을 참조하세요.

Key Vault 참조를 통해 App Service 인스턴스에 Key Vault 비밀을 사용할 수 있습니다. Key Vault 참조를 통해 애플리케이션의 비밀을 사용하여 안전하게 보호하고 암호화된 상태로 유지할 수 있습니다. 자세한 내용은 App Service 및 Azure Functions의 Key Vault 참조 사용을 참조하세요.

모든 인증서 인벤토리화

공용 SSL 엔드포인트에 사용되는 모든 인증서를 문서화합니다. 다음 명령을 실행하여 프로덕션 서버에서 모든 인증서를 볼 수 있습니다.

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

지원되는 Java 버전이 제대로 작동하는지 확인

Azure App Service의 JBoss EAP에는 지원되는 버전의 Java가 필요합니다. 사용할 JDK 버전에 대한 지침은 Red Hat 설명서의 지원되는 구성Azure App Service용 Java 앱 구성Java 버전 표시 섹션을 참조하세요.

참고

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

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

java -version

인벤토리 외부 리소스

데이터 원본, JMS 메시지 브로커 등과 같은 외부 리소스는 JNDI(Java 명명 및 디렉터리 인터페이스)를 통해 삽입됩니다. 이러한 리소스 중 일부는 마이그레이션 또는 재구성이 필요할 수 있습니다.

애플리케이션 내부

WEB-INF/jboss-web.xml 및/또는 WEB-INF/web.xml 파일을 검사합니다. <Context> 요소 내에서 <Resource> 요소를 찾습니다.

Datasources

데이터 원본은 type 특성이 javax.sql.DataSource로 설정된 JNDI 리소스입니다. 각 데이터 원본에 대해 다음 정보를 문서화합니다.

  • 데이터 원본 이름은 무엇인가요?
  • 연결 풀 구성이란?
  • JDBC 드라이버 JAR 파일은 어디에서 찾을 수 있나요?

자세한 내용은 JBoss EAP 설명서의 JBoss EAP 데이터 원본 정보를 참조하세요.

기타 모든 외부 리소스

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

세션 복제가 사용되는지 확인

애플리케이션에서 세션 복제를 사용하는 경우 이 종속성을 제거하도록 애플리케이션을 변경해야 합니다. App Service 인스턴스에서 서로 직접 통신할 수 없습니다.

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

애플리케이션 서버에서 파일 시스템을 사용하려면 재구성하거나 드물게 아키텍처 변경이 필요합니다. 파일 시스템은 JBoss EAP 모듈 또는 애플리케이션 코드에서 사용할 수 있습니다. 다음 섹션에서 설명하는 시나리오의 일부 또는 전부를 식별할 수 있습니다.

읽기 전용 정적 콘텐츠

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

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

애플리케이션이 애플리케이션에서 업로드/생성되었지만 생성 후 변경할 수 없는 정적 콘텐츠를 허용하는 경우, 위에서 설명한 대로 Azure Blob Storage 및 Azure CDN를 사용하여 업로드 및 CDN 새로 고침을 처리할 수 있습니다. Azure Functions를 사용하여 정적 콘텐츠 업로드 및 CDN 사전 로드에서 사용할 샘플 구현을 제공했습니다.

동적 또는 내부 콘텐츠

애플리케이션에서 자주 쓰고 읽는 파일(예: 임시 데이터 파일) 또는 애플리케이션에만 표시되는 정적 파일의 경우 앱 서비스 계획과 연결된 로컬 파일 스토리지를 사용할 수 있습니다. 자세한 내용은 Azure App Service의 운영 체제 기능Azure App Service 파일 시스템 이해를 참조하세요.

애플리케이션에서 예약된 작업을 사용하는지 확인

Quartz Scheduler 작업 또는 Unix cron 작업과 같은 예약된 작업을 Azure App Service에서 사용해서는 안 됩니다. Azure App Service는 예약된 작업이 포함된 애플리케이션을 내부적으로 배포하는 것을 방지하지 않습니다. 그러나 애플리케이션이 확장되는 경우 동일한 예약된 작업이 예약된 기간마다 두 번 이상 실행될 수 있습니다. 이 경우 의도하지 않은 결과가 발생할 수 있습니다.

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

온-프레미스 연결이 필요한지 확인

애플리케이션에서 온-프레미스 서비스에 액세스해야 하는 경우 Azure의 연결 서비스 중 하나를 프로비저닝해야 합니다. 자세한 내용은 온-프레미스 네트워크를 Azure에 연결하기 위한 솔루션 선택을 참조하세요. 또는 온-프레미스 리소스에서 노출하는 공개적으로 사용 가능한 API를 사용하도록 애플리케이션을 리팩터링해야 합니다.

JMS(Java Message Service) 큐 또는 토픽을 사용하는지 확인

애플리케이션에서 JMS 큐 또는 토픽을 사용하는 경우 외부에서 호스팅되는 JMS 서버로 마이그레이션해야 합니다. Azure Service Bus 및 AMQP(고급 메시지 큐 프로토콜)는 JMS를 사용하는 애플리케이션에 매우 유용한 마이그레이션 전략이 될 수 있습니다. 자세한 내용은 Azure Service Bus 및 AMQP 1.0에서 JMS 사용을 참조하세요.

JMS 영구 저장소가 구성된 경우 해당 구성을 캡처하여 마이그레이션 후에 적용해야 합니다.

JCA 커넥터가 사용되는지 확인

애플리케이션에서 JCA 커넥터를 사용하는 경우 JBoss EAP에서 JCA 커넥터를 사용할 수 있는지 확인합니다. JBoss EAP에서 JCA 커넥터를 사용할 수 있는 경우 JAR을 서버 클래스 경로에 추가하고 필요한 구성 파일을 JBoss EAP 서버 디렉터리의 올바른 위치에 배치해야 합니다.

JAAS가 사용 중인지 확인

애플리케이션에서 JAAS를 사용 중인 경우 JAAS가 구성된 방식을 캡처해야 합니다. 데이터베이스를 사용하는 경우 JBoss EAP에서 JAAS 도메인으로 변환할 수 있습니다. 사용자 지정 구현인 경우 JBoss EAP에서 사용할 수 있는지 확인해야 합니다.

애플리케이션에서 리소스 어댑터를 사용하는지 확인

RA(리소스 어댑터)가 필요한 애플리케이션은 JBoss EAP와 호환되어야 합니다. RA를 서버에 배포하고 적절하게 구성하여 JBoss EAP의 독립 실행형 인스턴스에서 제대로 작동하는지 확인합니다. RA가 제대로 작동하면 JAR을 App Service의 서버 클래스 경로에 추가하고 필요한 구성 파일을 JBoss EAP 서버 디렉터리의 올바른 위치에 배치해야 합니다.

애플리케이션이 여러 WAR로 구성되었는지 확인

애플리케이션이 여러 WAR로 구성된 경우 각 WAR를 별도의 애플리케이션으로 처리하고 각각에 대해 이 가이드를 수행해야 합니다.

애플리케이션이 EAR로 패키징되는지 확인

애플리케이션이 EAR 파일로 패키지되는 경우 application.xml 파일을 검사하고 해당 구성을 캡처합니다.

참고

App Service 리소스를 더 효율적으로 사용하기 위해 각 웹 애플리케이션의 크기를 독립적으로 조정하려면 EAR을 별도의 웹 애플리케이션으로 분리해야 합니다.

프로덕션 서버에서 실행되는 모든 외부 프로세스 및 디먼 확인

디먼 모니터링과 같이 애플리케이션 서버 외부에서 실행되는 프로세스가 있는 경우 이러한 프로세스를 제거하거나 다른 곳으로 마이그레이션해야 합니다.

내부 테스트 수행

컨테이너 이미지를 만들기 전에 App Service에서 사용하려는 JDK 및 JBoss EAP 버전으로 애플리케이션을 마이그레이션합니다. 호환성과 성능을 보장하기 위해 애플리케이션을 철저히 테스트합니다.

App Service의 JBoss EAP 기능 참고

App Service에서 JBoss EAP를 사용하는 경우 다음 참고 사항을 고려해야 합니다.

  • 서버 간 클러스터링: 네트워크 보안 제약 조건으로 인해 App Service의 애플리케이션 인스턴스는 서로 직접 통신할 수 없습니다. 현재 JBoss 배포에서 클러스터링을 사용하는 경우 가상 머신 확장 집합에서 JBoss EAP를 사용하거나 세션 및 상태 정보를 구체화하는 것이 좋습니다. 자세한 내용은 Red Hat 설명서에서 고가용성 구성Infinispan 및 캐시 컨테이너를 참조하세요.
  • JBoss EAP 관리 콘솔: JBoss 웹 콘솔은 App Service에 노출되지 않습니다. 대신 Azure Portal은 애플리케이션에 대한 관리형 API를 제공하며 Azure CLI, Azure Maven 플러그 인 또는 기타 Azure 개발자 도구를 사용하여 배포해야 합니다.
  • 트랜잭션: 애플리케이션 인스턴스는 상태 비저장 방식으로 실행되므로 트랜잭션 API는 현재 지원되지 않습니다. 자세한 내용은 Red Hat 설명서에서 JBoss EAP의 트랜잭션 관리를 참조하세요.
  • 관리되는 도메인 모드: 다중 서버 프로덕션 환경에서 JBoss EAP의 관리되는 도메인 모드는 중앙 집중식 관리 기능을 제공합니다. 그러나 App Service에서 JBoss EAP를 사용하는 경우 App Service 플랫폼은 서버 인스턴스의 구성 및 관리를 담당하고 있다고 가정합니다. App Service는 JBoss EAP의 관리되는 도메인 모드가 필요하지 않습니다. 도메인 모드는 가상 머신 기반 다중 서버 배포에 적합한 선택입니다. 자세한 내용은 Red Hat 설명서에서 관리되는 도메인 정보를 참조하세요.

마이그레이션

JBoss EAP 런타임용 Azure App Service 프로비전

다음 명령을 사용하여 리소스 그룹 및 Azure App Service 계획을 만듭니다. App Service 계획을 만든 후에는 JBoss EAP 런타임을 사용하여 Linux 웹앱 계획을 만듭니다. PremiumV3 및 IsolatedV2 App Service 계획 계층에서만 JBoss EAP 사이트를 만들 수 있습니다.

지정된 환경 변수에 적절한 값이 있는지 확인합니다.

참고

PremiumV3 및 IsolatedV2는 모두 예약 인스턴스 가격 책정이 적용되므로 비용을 줄일 수 있습니다. App Service 계획 계층 및 예약 인스턴스 가격 책정에 대한 자세한 내용은 App Service 가격 책정을 참조하세요.

az group create --resource-group $resourceGroup --location eastus
az acr create --resource-group $resourceGroup --name $acrName --sku Standard
az appservice plan create \
    --resource-group $resourceGroup \
    --name $jbossAppService \
    --is-linux \
    --sku P1V2
az webapp create \
    --resource-group $resourceGroup \
    --name $jbossWebApp \
    --plan $jbossAppServicePlan \
    --runtime "JBOSSEAP|7.2-java8"

애플리케이션 빌드

다음 Maven 명령을 사용하여 애플리케이션을 빌드합니다.

mvn clean install -DskipTests

애플리케이션 배포

애플리케이션이 Maven POM 파일에서 빌드되는 경우 Maven용 Webapp 플러그 인을 사용하여 Web App을 만들고 애플리케이션을 배포합니다. 자세한 내용은 빠른 시작: Azure App Service에서 Java 앱 만들기를 참조하세요.

JBoss EAP 애플리케이션의 배포를 자동화하기 위해 웹앱용 Azure Pipelines 작업 또는 Azure WebApp에 배포하기 위한 GitHub Action을 사용할 수 있습니다.

데이터 원본 설정

JBoss EAP에 데이터 원본을 등록할 때 세 가지 핵심 단계는 JDBC 드라이버 업로드, JDBC 드라이버를 모듈로 추가 및 모듈 등록입니다. 자세한 내용은 JBoss EAP 설명서의 Datasource 관리를 참조하세요. App Service는 상태 비저장 호스팅 서비스이므로, 컨테이너가 시작될 때 데이터 원본 모듈을 추가하고 등록하는 구성 명령을 스크립팅하고 적용해야 합니다.

데이터 원본을 설정하려면 다음 단계를 따르세요.

  1. 데이터베이스의 JDBC 드라이버를 가져옵니다.

  2. JDBC 드라이버에 대한 XML 모듈 정의 파일을 만듭니다. 아래에 표시된 예제는 PostgreSQL에 대한 모듈 정의입니다. resource-root path 값을 사용하는 JDBC 드라이버의 경로로 바꾸어야 합니다.

    <?xml version="1.0" ?>
    <module xmlns="urn:jboss:module:1.1" name="org.postgres">
        <resources>
        <!-- ***** IMPORTANT: REPLACE THIS PLACEHOLDER *******-->
        <resource-root path="/home/site/deployments/tools/postgresql-42.2.12.jar" />
        </resources>
        <dependencies>
            <module name="javax.api"/>
            <module name="javax.transaction.api"/>
        </dependencies>
    </module>
    
  3. JBoss CLI 명령을 jboss-cli-commands.cli 라는 파일에 배치합니다. JBoss 명령은 모듈을 추가하고 이를 데이터 원본으로 등록해야 합니다. 아래 예제에서는 PostgreSQL에 대한 JBoss CLI 명령을 보여 줍니다.

    #!/usr/bin/env bash
    module add --name=org.postgres --resources=/home/site/deployments/tools/postgresql-42.2.12.jar --module-xml=/home/site/deployments/tools/postgres-module.xml
    
    /subsystem=datasources/jdbc-driver=postgres:add(driver-name="postgres",driver-module-name="org.postgres",driver-class-name=org.postgresql.Driver,driver-xa-datasource-class-name=org.postgresql.xa.PGXADataSource)
    
    data-source add --name=postgresDS --driver-name=postgres --jndi-name=java:jboss/datasources/postgresDS --connection-url=${POSTGRES_CONNECTION_URL,env.POSTGRES_CONNECTION_URL:jdbc:postgresql://db:5432/postgres} --user-name=${POSTGRES_SERVER_ADMIN_FULL_NAME,env.POSTGRES_SERVER_ADMIN_FULL_NAME:postgres} --password=${POSTGRES_SERVER_ADMIN_PASSWORD,env.POSTGRES_SERVER_ADMIN_PASSWORD:example} --use-ccm=true --max-pool-size=5 --blocking-timeout-wait-millis=5000 --enabled=true --driver-class=org.postgresql.Driver --exception-sorter-class-name=org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLExceptionSorter --jta=true --use-java-context=true --valid-connection-checker-class-name=org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLValidConnectionChecker
    
  4. JBoss CLI 명령을 호출하는 startup_script.sh 라는 시작 스크립트를 만듭니다. 아래 예제에서는 jboss-cli-commands.cli 파일을 호출하는 방법을 보여줍니다. 나중에 인스턴스가 시작될 때 이 스크립트를 실행하도록 App Service를 구성합니다.

    $JBOSS_HOME/bin/jboss-cli.sh --connect --file=/home/site/deployments/tools/jboss-cli-commands.cli
    
  5. 원하는 FTP 클라이언트를 사용하여 JDBC 드라이버, jboss-cli-commands.cli, startup_script.sh 및 모듈 정의를 /site/deployments/tools/ 에 업로드합니다.

  6. 컨테이너가 시작될 때 startup_script.sh 를 실행하도록 사이트를 구성합니다. Azure Portal에서 구성 > 일반 설정 > 시작 명령 으로 이동합니다. 시작 명령 필드를 /home/site/deployments/tools/startup_script.sh 로 설정한 다음, 저장 을 선택합니다.

  7. 웹앱을 다시 시작하면 구성 스크립트가 실행됩니다.

  8. 애플리케이션의 JTA 데이터 원본 구성을 업데이트합니다. 앱에 대한 src/main/resources/META-INF/persistence.xml 파일을 열고 <jta-data-source> 요소를 찾습니다. 다음과 같이 내용을 바꿉니다.

    <jta-data-source>java:jboss/datasources/postgresDS</jta-data-source>
    

애플리케이션 빌드

다음 Maven 명령을 사용하여 애플리케이션을 빌드합니다.

mvn clean install -DskipTests

애플리케이션 배포

애플리케이션이 Maven POM 파일에서 빌드되는 경우 Maven용 Webapp 플러그 인을 사용하여 Web App을 만들고 애플리케이션을 배포합니다. 자세한 내용은 빠른 시작: Azure App Service에서 Java 앱 만들기를 참조하세요.

JBoss EAP 애플리케이션의 배포를 자동화하기 위해 웹앱용 Azure Pipelines 작업 또는 Azure WebApp에 배포하기 위한 GitHub Action을 사용할 수 있습니다.

마이그레이션 후 작업

이제 애플리케이션을 Azure App Service로 마이그레이션했으므로 예상대로 작동하는지 확인해야 합니다. 이 작업이 완료되면 애플리케이션을 클라우드 네이티브로 만들 수 있는 몇 가지 추천 사항이 있습니다.

권장 사항