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

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

사전 마이그레이션

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

인벤토리 서버 용량

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

AKS에서 노드 풀의 크기를 조정할 수 있습니다. 방법을 알아보려면 AKS(Azure Kubernetes Service)의 노드 풀 크기 조정을 참조하세요.

모든 비밀 인벤토리

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

이러한 비밀을 Azure KeyVault에 저장하는 것이 좋습니다. 자세한 내용은 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 VM의 JBoss EAP에는 지원되는 버전의 Java가 필요합니다. 사용할 JDK 버전에 대한 지침은 Red Hat 설명서의 지원되는 구성을 참조하세요.

참고 항목

이 유효성 검사는 현재 서버가 지원되지 않는 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.DataSourceJNDI 리소스입니다. 각 데이터 원본에 대해 다음 정보를 문서화합니다.

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

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

기타 모든 외부 리소스

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

세션 복제본(replica) 사용 여부 확인

애플리케이션이 세션 복제본(replica) 의존하는 경우 애플리케이션을 변경하여 이 종속성을 제거해야 합니다. App Service는 인스턴스가 서로 직접 통신하는 것을 허용하지 않습니다.

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

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

읽기 전용 정적 콘텐츠

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

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

애플리케이션이 애플리케이션에서 업로드/생성되었지만 생성 후 변경할 수 없는 정적 콘텐츠를 허용하는 경우, 위에서 설명한 대로 Azure Blob Storage 및 Azure CDN과 Azure Function을 사용하여 업로드 및 CDN 새로 고침을 처리할 수 있습니다. Azure Functions를 사용하여 정적 콘텐츠를 업로드 및 CDN 미리 로드할 때 사용할 샘플 구현을 제공했습니다. Azure Spring Apps Enterprise 계획의 앱에 정적 콘텐츠를 직접 배포할 수도 있습니다. 자세한 내용은 웹 정적 파일 배포를 참조 하세요.

동적 또는 내부 콘텐츠

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

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

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

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

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

애플리케이션이 온-프레미스 서비스에 액세스해야 하는 경우 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 커넥터를 사용할 수 있는 경우 JBoss EAP 서버 디렉터리의 올바른 위치에 서버 클래스 경로에 JAR을 추가하고 필요한 구성 파일을 배치해야 합니다.

JAAS가 사용 중인지 확인

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

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

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

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

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

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

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

참고 항목

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

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

애플리케이션 서버 외부에서 실행 중인 프로세스(예: 디먼 모니터링)가 있는 경우 해당 프로세스를 제거하거나 다른 곳으로 마이그레이션해야 합니다.

현재 위치 테스트 수행

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

App Service의 JBoss EAP 기능 정보

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

  • 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의 관리되는 do기본 모드가 필요하지 않습니다. 도메인 모드는 가상 머신 기반 다중 서버 배포에 적합한 선택입니다. 자세한 내용은 Red Hat 설명서의 관리되는 do기본s 정보를 참조하세요.

  • 서버-서버 클러스터링: 2022년 3월 15일부터 JBoss EAP의 클러스터형 배포가 공개 미리 보기에서 지원됩니다. 이 지원은 App Service에 배포하기 전에 애플리케이션에서 다음 기능을 더 이상 제거할 필요가 없음을 의미합니다.

    • 상태 저장 세션 콩.
    • 분산 트랜잭션.
    • 인스턴스 간 통신 또는 고가용성이 필요한 유사한 기능입니다.

    자세한 내용은 Azure 앱 Service용 Java 앱 구성의 릴리스 알림JBoss EAP클러스터링 섹션을 참조하세요.

마이그레이션

앱용 Red Hat 마이그레이션 도구 키트

Red Hat Migration Toolkit for Applications는 Visual Studio Code용 무료 확장입니다. 이 확장은 애플리케이션 코드 및 구성을 분석하여 온-프레미스에서 클라우드로 마이그레이션하기 위한 권장 사항을 제공합니다. 자세한 내용은 애플리케이션용 마이그레이션 도구 키트 개요를 참조하세요.

이 가이드의 내용은 올바른 App Service 계획 유형 선택, 세션 상태 외부화 및 Azure를 사용하여 JBoss 관리 인터페이스 대신 EAP 인스턴스를 관리하는 등 마이그레이션 과정의 다른 구성 요소를 해결하는 데 도움이 됩니다.

JBoss EAP 런타임에 대한 Azure 앱 서비스 프로비전

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

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

참고 항목

PremiumV3 및 IsolatedV2는 모두 Reserved Instance 가격 책정에 적합하므로 비용을 줄일 수 있습니다. 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-java8"
    #  Or use "JBOSSEAP|7-java11" if you're using Java 11

애플리케이션 빌드

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

mvn clean install -DskipTests

애플리케이션 배포

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

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

데이터 원본 설정

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

데이터 원본을 설정하려면 다음 단계를 사용합니다.

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

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

    <?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 명령을 보여 줍니다.

    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에서 Configuration > General 설정 > 시작 명령으로 이동합니다. 시작 명령 필드를 /home/site/deployments/tools/startup_script.sh로 설정한 다음 저장을 선택합니다.

  7. 웹앱을 다시 시작하여 구성 스크립트를 실행합니다.

  8. 애플리케이션에 대한 JTA 데이터 원본 구성을 업데이트합니다. 앱에 대한 src/기본/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 플러그 인을 사용하여 웹앱을 만들고 애플리케이션을 배포합니다. 자세한 내용은 빠른 시작: Azure 앱 Service에서 Java 앱 만들기를 참조하세요.

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

마이그레이션 후

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

권장 사항

  • 파일 스토리지에 /home 디렉터리를 사용하도록 선택한 경우 Azure Storage로 바꾸는 것이 좋습니다. 자세한 내용은 App Service의 컨테이너에서 네트워크 공유로 Azure Storage에 액세스하세요.

  • /home 디렉터리에 연결 문자열, SSL 키 및 기타 비밀 정보를 포함하는 구성이 있는 경우 가능한 경우 애플리케이션 설정과 함께 Azure Key Vault 및/또는 매개 변수 삽입을 사용하는 것이 좋습니다. 자세한 내용은 App Service 및 Azure Functions에 대한 Key Vault 참조 사용Azure Portal에서 App Service 앱 구성을 참조하세요.

  • 가동 중지 시간이 없는 안정적인 배포를 위해 배포 슬롯을 사용하는 것이 좋습니다. 자세한 내용은 Azure 앱 Service에서 스테이징 환경 설정을 참조하세요.

  • DevOps 전략을 설계하고 구현합니다. 개발 속도를 높이면서 안정성을 기본 위해 Azure Pipelines를 사용하여 배포 및 테스트를 자동화하는 것이 좋습니다. 자세한 내용은 Java 웹앱 빌드 및 배포를 참조 하세요. 배포 슬롯을 사용하는 경우 슬롯에 대한 배포를 자동화한 다음, 슬롯 교환을 수행할 수 있습니다. 자세한 내용은 Azure 웹앱 배포(Linux)슬롯에 배포 섹션을 참조하세요.

  • 비즈니스 연속성 및 재해 복구 전략을 설계하고 구현합니다. 중요 업무용 애플리케이션의 경우 다중 지역 배포 아키텍처를 고려하세요. 자세한 내용은 고가용성 다중 지역 웹 애플리케이션을 참조 하세요.