다음을 통해 공유


Azure Container Apps에서 Open Liberty 또는 WebSphere Liberty를 사용하여 Java 애플리케이션 배포

이 문서에서는 Azure Container Apps에서 Open Liberty 또는 WebSphere Liberty를 실행하는 방법을 보여줍니다. 이 문서에서는 다음 작업을 수행합니다.

  • Open Liberty 또는 WebSphere Liberty 런타임에서 Java, Java EE, Jakarta EE 또는 MicroProfile 애플리케이션을 실행합니다.
  • Liberty 컨테이너 이미지를 사용하여 애플리케이션 Docker 이미지를 빌드합니다.
  • 컨테이너화된 애플리케이션을 Azure Container Apps에 배포합니다.

Open Liberty에 대한 자세한 내용은 Open Liberty 프로젝트 페이지참조하세요. IBM WebSphere Liberty에 대한 자세한 내용은 WebSphere Liberty 제품 페이지참조하세요.

이 문서는 빠르게 배포할 수 있도록 지원하기 위한 것입니다. 프로덕션으로 이동하기 전에 Liberty 튜닝을 살펴보아야 합니다.

피드백을 제공하거나 Azure 솔루션에서 WebSphere를 개발하는 엔지니어링 팀과 함께 마이그레이션 시나리오를 긴밀히 작업하려는 경우 WebSphere 마이그레이션 대한 이 간단한 설문 조사를 작성하고 연락처 정보를 포함합니다. 긴밀한 공동 작업을 시작할 수 있도록 프로그램 관리자, 설계자 및 엔지니어 팀이 즉시 연락드립니다.

필수 구성 요소

  • Azure 구독 Azure 구독이 아직 없는 경우 시작하기 전에 체험 계정을 만듭니다.
  • Windows 또는 Unix와 유사한 운영 체제(예: Ubuntu, macOS 또는 Linux용 Windows 하위 시스템)가 설치된 로컬 컴퓨터를 준비합니다.
  • Azure CLI 2.62.0 이상을 설치하여 Azure CLI 명령을 실행합니다.
    • az login 명령을 사용하여 Azure CLI로 로그인합니다. 인증 프로세스를 완료하려면 터미널에 표시되는 단계를 수행합니다. 다른 로그인 옵션은 Azure CLI를 사용하여 Azure에 로그인을 참조하세요.
    • 메시지가 표시되면 처음 사용할 때 Azure CLI 확장을 설치합니다. 확장에 대한 자세한 내용은 Azure CLI로 확장 사용 및 관리를 참조하세요.
    • az version 실행하여 설치된 버전 및 종속 라이브러리를 찾습니다. 최신 버전으로 업그레이드하려면 az upgrade실행합니다.
  • Java SE 구현 버전 17을 설치합니다 - 예를 들어, OpenJDK의 Microsoft 빌드 .
  • Maven 3.9.8 이상을 설치합니다.
  • Git이 설치되어 있는지 확인합니다.

Azure에 로그인

az login 명령을 사용하여 Azure 구독에 로그인하고 화면의 지시를 따릅니다.

az login

참고 항목

Bash와 동일한 방식으로 PowerShell에서 대부분의 Azure CLI 명령을 실행할 수 있습니다. 차이점은 변수를 사용하는 경우에만 존재합니다. 다음 섹션에서는 필요할 때 다른 탭에서 차이점을 해결합니다.

Azure 자격 증명과 연결된 여러 Azure 테넌트가 있는 경우 로그인할 테넌트만 지정해야 합니다. --tenant 옵션을 사용하여 테넌트(예: az login --tenant contoso.onmicrosoft.com)를 지정할 수 있습니다.

하나의 테넌트 내에 여러 구독이 있는 경우, az account set --subscription <subscription-id>를 사용하여 원하는 구독으로 로그인했는지 확인하세요.

리소스 그룹 만들기

Azure 리소스 그룹은 Azure 리소스가 배포되고 관리되는 논리 그룹입니다.

eastus2 위치에서 az group create 명령을 사용하여 java-liberty-project이라는 리소스 그룹을 만듭니다. 이 리소스 그룹은 나중에 ACR(Azure Container Registry) 인스턴스 및 Azure Container Apps 인스턴스를 만드는 데 사용됩니다.

export RESOURCE_GROUP_NAME=java-liberty-project
az group create --name $RESOURCE_GROUP_NAME --location eastus2

ACR 인스턴스 만들기

az acr create 명령을 사용하여 ACR 인스턴스를 만듭니다. 다음 예제에서는 youruniqueacrnameACR 인스턴스를 만듭니다. youruniqueacrname Azure 내에서 고유한지 확인합니다.

참고 항목

이 문서에서는 Container Registry에 권장되는 암호 없는 인증 메커니즘을 사용합니다. az acr credential show을 사용하여 사용자 이름과 암호를 얻은 후에도 docker login을 사용하여 사용자 이름과 암호를 사용할 수 있습니다. 사용자 이름 및 암호를 사용하는 것은 암호 없는 인증보다 안전하지 않습니다.

export REGISTRY_NAME=youruniqueacrname
az acr create \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $REGISTRY_NAME \
    --sku Basic

잠시 후 다음 줄이 포함된 JSON 출력이 표시됩니다.

"provisioningState": "Succeeded",
"publicNetworkAccess": "Enabled",
"resourceGroup": "java-liberty-project",

다음으로, 다음 명령을 사용하여 Container Registry 인스턴스에 대한 로그인 서버를 검색합니다. 나중에 Azure Container Apps에 애플리케이션 이미지를 배포할 때 이 값이 필요합니다.

export ACR_LOGIN_SERVER=$(az acr show \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $REGISTRY_NAME \
    --query 'loginServer' \
    --output tsv)

환경 만들기

Azure Container Apps의 환경은 컨테이너 앱 그룹 주위에 보안 경계를 만듭니다. 동일한 환경에 배포된 컨테이너 앱은 동일한 가상 네트워크에 배포되고 동일한 Log Analytics 작업 영역에 로그를 씁니다. az containerapp env create 명령을 사용하여 환경을 만듭니다. 다음 예제에서는 youracaenvname환경을 만듭니다.

export ACA_ENV=youracaenvname
az containerapp env create \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $ACA_ENV

확장을 설치하라는 메시지가 표시되면 Y에 응답합니다.

잠시 후 다음 줄이 포함된 JSON 출력이 표시됩니다.

"provisioningState": "Succeeded",
"type": "Microsoft.App/managedEnvironments"
"resourceGroup": "java-liberty-project",

Azure SQL Database에서 단일 데이터베이스 만들기

이 섹션에서는 앱에 사용할 단일 데이터베이스를 Azure SQL Database에 만듭니다.

먼저 다음 명령을 사용하여 데이터베이스 관련 환경 변수를 설정합니다. <your-unique-sql-server-name> Azure SQL Database 서버의 고유한 이름으로 대체합니다.

export SQL_SERVER_NAME=<your-unique-sql-server-name>
export DB_NAME=demodb

다음으로, 다음 명령을 사용하여 Azure SQL Database에서 단일 데이터베이스를 만들고 현재 로그인한 사용자를 Microsoft Entra 관리자로 설정합니다. 자세한 내용은 빠른 시작을 참조하세요. 단일 데이터베이스 만들기 - Azure SQL Database.

export ENTRA_ADMIN_NAME=$(az account show --query user.name --output tsv)

az sql server create \
    --name $SQL_SERVER_NAME \
    --resource-group $RESOURCE_GROUP_NAME \
    --enable-ad-only-auth \
    --external-admin-principal-type User \
    --external-admin-name $ENTRA_ADMIN_NAME \
    --external-admin-sid $(az ad signed-in-user show --query id --output tsv)
az sql db create \
    --resource-group $RESOURCE_GROUP_NAME \
    --server $SQL_SERVER_NAME \
    --name $DB_NAME \
    --edition GeneralPurpose \
    --compute-model Serverless \
    --family Gen5 \
    --capacity 2

그런 다음, 다음 명령을 사용하여 로컬 컴퓨터가 나중에 로컬 테스트를 위해 데이터베이스에 연결할 수 있도록 Azure SQL Database 서버 방화벽 규칙에 로컬 IP 주소를 추가합니다.

export AZ_LOCAL_IP_ADDRESS=$(curl -s https://whatismyip.akamai.com)
az sql server firewall-rule create \
    --resource-group $RESOURCE_GROUP_NAME \
    --server $SQL_SERVER_NAME \
    --name AllowLocalIP \
    --start-ip-address $AZ_LOCAL_IP_ADDRESS \
    --end-ip-address $AZ_LOCAL_IP_ADDRESS

참고 항목

보안 고려 사항에 대해 SQL 인증을 사용하지 않도록 설정된 Azure SQL 서버를 만듭니다. Microsoft Entra ID만 서버에 인증하는 데 사용됩니다. SQL 인증을 사용하도록 설정해야 하는 경우 az sql server create참조하세요.

애플리케이션 이미지 구성 및 빌드

Azure Container Apps에서 Liberty 애플리케이션을 배포하고 실행하려면 Open Liberty 컨테이너 이미지 또는 WebSphere Liberty 컨테이너 이미지를 사용하여 애플리케이션을 Docker 이미지로 컨테이너화합니다.

이 섹션의 단계에 따라 Liberty 런타임에 샘플 애플리케이션을 배치합니다. 이러한 단계에서는 Maven을 사용합니다.

애플리케이션 체크 아웃

다음 명령을 사용하여 이 가이드에 대한 샘플 코드를 준비합니다. 샘플은 GitHub에 있습니다.

git clone https://github.com/Azure-Samples/open-liberty-on-aca.git
cd open-liberty-on-aca
export BASE_DIR=$PWD
git checkout 20241118

상태에 있는 것에 detached HEAD 대한 메시지가 표시되면 이 메시지는 무시해도 안전합니다. 단지 태그를 살펴본 것일 뿐입니다.

이 문서에서는 java-app을 사용합니다. 애플리케이션의 중요한 파일의 파일 구조는 다음과 같습니다.

java-app
├─ src/main/
│  ├─ liberty/config/
│  │  ├─ server.xml
│  ├─ java/
│  ├─ resources/
│  ├─ webapp/
├─ Dockerfile
├─ Dockerfile-wlp
├─ pom.xml
├─ pom-azure-identity.xml

Java, 리소스웹앱 디렉터리에는 응용 프로그램 예제의 소스 코드가 포함됩니다. 이 코드는 jdbc/JavaEECafeDB(이)라는 데이터 원본을 선언하고 사용합니다.

java-app 루트 디렉터리에는 Open Liberty 또는 WebSphere Liberty를 사용하여 애플리케이션 이미지를 만드는 두 개의 파일이 있습니다.

liberty/config 디렉터리에서 server.xml 파일을 사용하여 Open Liberty 및 WebSphere Liberty 클러스터에 대한 데이터베이스 연결을 구성합니다. Azure SQL Database에 연결하는 데 사용되는 변수 azure.sql.connectionstring 정의합니다.

pom.xml 파일은 프로젝트의 구성 정보를 포함하는 Maven POM(프로젝트 개체 모델) 파일입니다. pom-azure-identity.xml 파일은 Microsoft Entra ID를 사용하여 Azure 서비스에 인증하는 데 사용되는 azure-identity 종속성을 선언합니다.

참고 항목

이 샘플에서는 azure-identity 라이브러리를 사용하여 보안 고려 사항에 권장되는 Microsoft Entra 인증을 사용하여 Azure SQL Database에 인증합니다. Liberty 애플리케이션에서 SQL 인증을 사용해야 하는 경우 JDBC를 통한 관계형 데이터베이스 연결을참조하세요.

프로젝트 빌드

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

cd $BASE_DIR/java-app
mvn clean install
mvn dependency:copy-dependencies -f pom-azure-identity.xml -DoutputDirectory=target/liberty/wlp/usr/shared/resources

빌드에 성공하면 빌드 끝에 다음과 유사한 출력이 표시됩니다.

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  22.651 s
[INFO] Finished at: 2023-10-26T18:58:40-04:00
[INFO] ------------------------------------------------------------------------

이 출력이 표시되지 않으면 문제를 해결한 후 계속 진행합니다.

로컬로 프로젝트 테스트

이제 다음 단계를 사용하여 Azure에 배포하기 전에 프로젝트를 로컬로 실행하고 테스트할 수 있습니다. 편의를 위해 .liberty-maven-plugin liberty-maven-plugin에 대한 자세한 내용은 Maven으로 웹 애플리케이션 빌드를 참조하세요. 애플리케이션의 경우 로컬 IDE와 같은 다른 메커니즘을 사용하여 비슷한 작업을 수행할 수 있습니다.

참고 항목

"서버리스" 데이터베이스 배포를 선택한 경우 SQL 데이터베이스가 일시 중지 모드로 전환되지 않았는지 확인합니다. 확인을 수행하는 한 가지 방법은 빠른 시작에 설명된 대로 데이터베이스 쿼리 편집기로 로그인하는 것입니다. Azure Portal 쿼리 편집기(미리 보기)를 사용하여 Azure SQL Database쿼리합니다.

  1. liberty:run를 사용하여 애플리케이션을 시작합니다.

    cd $BASE_DIR/java-app
    
    # The value of environment variable AZURE_SQL_CONNECTIONSTRING is read by the configuration variable azure.sql.connectionstring in server.xml.
    export AZURE_SQL_CONNECTIONSTRING="jdbc:sqlserver://$SQL_SERVER_NAME.database.windows.net:1433;databaseName=$DB_NAME;authentication=ActiveDirectoryDefault"
    mvn liberty:run
    
  2. 애플리케이션이 예상대로 작동하는지 확인합니다. 성공하면 명령 출력에 [INFO] [AUDIT ] CWWKZ0001I: Application javaee-cafe started in 11.086 seconds. 유사한 메시지가 표시됩니다. 브라우저에서 http://localhost:9080/ 이동하여 애플리케이션에 액세스할 수 있고 모든 함수가 작동하는지 확인합니다.

  3. Ctrl+C를 눌러 중지합니다. 일괄 처리 작업을 종료하라는 메시지가 표시되면 Y 선택합니다.

완료되면 다음 명령을 사용하여 로컬 IP 주소가 Azure SQL Database에 액세스할 수 있도록 하는 방화벽 규칙을 삭제합니다.

az sql server firewall-rule delete \
    --resource-group $RESOURCE_GROUP_NAME \
    --server $SQL_SERVER_NAME \
    --name AllowLocalIP

Azure Container Apps 배포용 이미지 빌드

이제 다음 예제와 az acr build 같이 명령을 실행하여 이미지를 빌드할 수 있습니다.

cd $BASE_DIR/java-app

az acr build \
    --registry ${REGISTRY_NAME} \
    --image javaee-cafe:v1 \
    .

az acr build 명령은 Dockerfile에 지정된 아티팩트들을 Container Registry 인스턴스에 업로드하고, 이미지를 빌드하고, Container Registry 인스턴스에 저장합니다.

Azure Container Apps에 애플리케이션 배포

다음 명령을 사용하여 ACR에서 이미지를 끌어 온 후 앱을 실행하는 Azure Container Apps 인스턴스를 만듭니다. 이 예제에서는 youracainstancenameAzure Container Apps 인스턴스를 만듭니다.

export ACA_NAME=youracainstancename
az containerapp create \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $ACA_NAME \
    --image ${ACR_LOGIN_SERVER}/javaee-cafe:v1 \
    --environment $ACA_ENV \
    --registry-server $ACR_LOGIN_SERVER \
    --registry-identity system \
    --target-port 9080 \
    --ingress 'external' \
    --min-replicas 1

성공한 출력은 속성을 "type": "Microsoft.App/containerApps"포함하는 JSON 개체입니다.

그런 다음, 다음 단계를 사용하여 Service Connector를 사용하여 Azure SQL Database 서버를 컨테이너 앱에 연결합니다.

  1. 이 샘플에서는 서비스 커넥터를 사용하여 데이터베이스에 쉽게 연결할 수 있습니다. Service Connector에 대한 자세한 내용은 Service Connector란?을 참조하세요. 다음 명령을 사용하여 Azure CLI에 대한 암호 없는 확장을 설치합니다.

    az extension add --name serviceconnector-passwordless --upgrade --allow-preview true
    
  2. 다음 명령을 사용하여 시스템 할당 관리 ID를 사용하여 데이터베이스를 컨테이너 앱에 연결합니다.

    az containerapp connection create sql \
        --resource-group $RESOURCE_GROUP_NAME \
        --name $ACA_NAME \
        --target-resource-group $RESOURCE_GROUP_NAME \
        --server $SQL_SERVER_NAME \
        --database $DB_NAME \
        --system-identity \
        --container $ACA_NAME \
        --client-type java
    

    성공한 출력은 속성을 "type": "microsoft.servicelinker/linkers"포함하는 JSON 개체입니다.

참고 항목

Service Connector는 Azure SQL Database에 대한 암호 없는 연결 문자열인 AZURE_SQL_CONNECTIONSTRING값을 포함하는 비밀을 컨테이너 앱에 만듭니다. 자세한 내용은 Azure SQL Database와 Service Connector통합하기 사용자 할당 관리 ID 섹션의 샘플 값을 참조하세요.

애플리케이션 테스트

다음 명령을 사용하여 애플리케이션에 액세스하는 정규화된 URL을 가져옵니다.

echo https://$(az containerapp show \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $ACA_NAME \
    --query properties.configuration.ingress.fqdn \
    --output tsv)

애플리케이션에 액세스하고 테스트하려면 URL에 대한 웹 브라우저를 엽니다. 다음 스크린샷은 실행 중인 애플리케이션을 보여줍니다.

Azure Container Apps에 성공적으로 배포된 Java liberty 애플리케이션을 보여 주는 스크린샷

리소스 정리

Azure 요금을 방지하려면 불필요한 리소스를 정리해야 합니다. 클러스터가 더 이상 필요하지 않은 경우 az group delete 명령을 사용하여 리소스 그룹, 컨테이너 레지스트리, 컨테이너 앱, 데이터베이스 서버 및 모든 관련 리소스를 제거합니다.

az group delete --name $RESOURCE_GROUP_NAME --yes --no-wait

다음 단계

이 가이드에 사용된 참조에서 자세히 알아볼 수 있습니다.

Azure에서 WebSphere 제품을 실행하는 옵션을 살펴보려면 Azure 에서 WebSphere 제품군을 실행하는 솔루션은 무엇인가요?