Open Liberty または WebSphere Liberty を使用する Java アプリケーションを Azure Container Apps にデプロイする

この記事では、Open Liberty または WebSphere Liberty を Azure Container Apps で実行する方法を示します。 この記事では、次のアクティビティを実行します。

  • Open Liberty または WebSphere Liberty ランタイムで、Java、Java EE、Jakarta EE、または MicroProfile アプリケーションを実行します。
  • Liberty コンテナー イメージを使用して、アプリケーションの Docker イメージをビルドします。
  • コンテナ化されたアプリケーションを Azure Container Apps にデプロイします。

Open Liberty の詳細については、Open Liberty プロジェクトのページを参照してください。 IBM WebSphere Liberty の詳細については、WebSphere Liberty の製品ページを参照してください。

この記事は、デプロイをすばやく行うのに役立ちます。 運用環境に移行する前に、Tuning Liberty について調べる必要があります。

WebSphere on Azure ソリューションを開発しているエンジニアリング チームと密接に連携しながら移行シナリオに取り組むことに関心がある場合は、こちらの簡単な WebSphere 移行に関するアンケートに内容を記入し、連絡先情報を含めてください。 プログラム マネージャー、アーキテクト、エンジニアのチームからすぐに連絡があり、緊密なコラボレーションが開始されます。

前提条件

  • Azure サブスクリプション。 Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。
  • Windows、または Unix のようなオペレーティング システム (Ubuntu、macOS、Linux 用 Windows サブシステムなど) がインストールされているローカル マシンを準備します。
  • Azure CLI 2.53.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.5.0 以上をインストールします。
  • お使いの OS 用の Docker をインストールします。
  • Git がインストールされていることを確認します。

Azure へのサインイン

まだ行っていない場合は、az login コマンドを使用して Azure サブスクリプションにサインインし、画面上の指示に従います。

az login

Note

PowerShell では、Bash と同様に、ほとんどの Azure CLI コマンドを実行できます。 違いがあるのは、変数を使用する場合だけです。 以降のセクションでは、必要に応じてさまざまなタブでその違いについて説明します。

複数の Azure テナントがお使いの Azure 資格情報に関連付けられている場合は、サインインするテナントを指定する必要があります。 これは、--tenant オプションを使用して、たとえば az login --tenant contoso.onmicrosoft.com として行うことができます。

1 つのテナントに複数のサブスクリプションがある場合は、az account set --subscription <subscription-id> により、使用する予定のサブスクリプションでサインインしていることを確認してください。

リソース グループを作成する

Azure リソース グループは、Azure リソースが展開され管理される論理グループです。

az group create コマンドを使用して、eastus の場所に java-liberty-project というリソース グループを作成します。 このリソース グループは、後で Azure Container Registry (ACR) インスタンスと Azure Container Apps インスタンスを作成するために使用します。

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

ACR インスタンスを作成する

az acr create コマンドを使用して ACR インスタンスを作成します。 次の例では、youruniqueacrname という名前の ACR インスタンスを作成します。 youruniqueacrname が Azure 内で一意であることを確認します。

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

しばらくすると、次の行を含む JSON 出力が表示されます。

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

ACR インスタンスに接続する

イメージをプッシュする前に、ACR インスタンスにサインインする必要があります。 ローカルでコマンドを実行する場合は、docker デーモンが実行されていることを確認し、次のコマンドを実行して接続を確認します。

export ACR_LOGIN_SERVER=$(az acr show \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $REGISTRY_NAME \
    --query 'loginServer' \
    --output tsv)
export ACR_USER_NAME=$(az acr credential show \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $REGISTRY_NAME \
    --query 'username' \
    --output tsv)
export ACR_PASSWORD=$(az acr credential show \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $REGISTRY_NAME \
    --query 'passwords[0].value' \
    --output tsv)

docker login $ACR_LOGIN_SERVER -u $ACR_USER_NAME -p $ACR_PASSWORD

ACR インスタンスに正常にログインした場合は、コマンド出力の最後に Login Succeeded が表示されます。

環境の作成

Azure Container Apps 環境では、コンテナー アプリのグループを囲むセキュリティ保護された境界が作成されます。 同じ環境にデプロイされた Container Apps は、同じ仮想ネットワークにデプロイされ、同じ Log Analytics ワークスペースにログを書き込みます。 az containerapp env create コマンドを使用して環境を作成します。 次の例では、youracaenvname という名前の環境を作成します。

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

拡張機能をインストールするように求められたら、Y と答えます。

しばらくすると、次の行を含む JSON 出力が表示されます。

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

Azure SQL Database の作成

このセクションでは、アプリで使用する Azure SQL Database の Single Database を作成します。

クイックスタート: 単一データベースを作成する - Azure SQL Database」の手順を Azure CLI で実行して、Azure SQL Database の Single Database を作成します。 データベースに対してクエリを実行する前までの手順を実行します。 その記事を読み進んでデータベース サーバーを作成して構成したら、このドキュメントに戻ってください。

クイック スタートの「パラメーターの値を設定する」セクションまで完了したら、Variable block というラベルの付いたコード例の変数 (resourceGroupserverdatabaseloginpassword) の値を出力して保存しておきます。 プレースホルダー <resourceGroup><server><database><login><password> をこれらの値に置き換えて、次の環境変数を定義します。

export DB_RESOURCE_GROUP=<resourceGroup>
export DB_SERVER_NAME=<server>.database.windows.net
export DB_NAME=<database>
export DB_USER=<login>
export DB_PASSWORD=<password>

後でローカルでアプリケーションをテストする場合は、以下の手順を使用して、クライアントの IPv4 アドレスが接続を許可されていることを確認します。

  1. ポータルで、SQL データベースを検索して選択し、リストからデータベースを選択します。

  2. [概要] を選択します。

  3. ページの中央で [概要] タブが選択されていることを確認します。

  4. [アクセスの構成] で [構成] を選択します。

  5. [クライアント IPv4 アドレスの追加] を選択します。

  6. [保存] を選択します。

  7. [ネットワーク] ウィンドウと [パブリック アクセス] タブでファイアウォール規則を構成できます。

    ファイアウォール規則のスクリーンショット - クライアント アクセスを許可します。

アプリケーション イメージの構成とビルド

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
git checkout 20231026

detached HEAD 状態であることを示すメッセージが表示された場合、このメッセージは無視しても問題ありません。 これは、タグをチェックアウトしたという意味です。

この記事ではJava-app を使用します。 アプリケーションのファイル構造を次に示します。

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

javaresources、および webapp ディレクトリには、サンプル アプリケーションのソース コードが含まれています。 このコードでは、jdbc/JavaEECafeDB という名前のデータ ソースを宣言して使用します。

java-app ルート ディレクトリには、Open Liberty または WebSphere Liberty を使用するアプリケーション イメージを作成するための 2 つのファイルがあります。

liberty/config ディレクトリでは、server.xml ファイルを使用して、Open Liberty および WebSphere Liberty クラスターの DB 接続を構成します。

プロジェクトをビルドする

次のコマンドを使用して、アプリケーションをビルドします。

cd <path-to-your-repo>/java-app
mvn clean install

ビルドが成功すると、ビルドの最後に次のような出力が表示されます。

[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 の詳細については、「Building a web application with Maven」(Maven での Web アプリケーションのビルド) を参照してください。 アプリケーションでは、ローカル IDE などの他のメカニズムを使用して、同様の操作を行うことができます。

Note

"サーバーレス" データベースのデプロイを選んだ場合、SQL データベースが一時停止モードになっていないことを確認します。 これを行う方法の 1 つは、「クイックスタート: Azure portal クエリ エディター (プレビュー) を使用して Azure SQL Database のクエリを実行する」で説明されているように、データベース クエリ エディターにログインすることです。

  1. liberty:run でアプリケーションを起動します。 liberty:run は、前の手順で定義したデータベース関連の環境変数を使用します。

    cd <path-to-your-repo>/java-app
    mvn liberty:run
    
  2. アプリケーションが想定どおりに動作することを確認します。 成功すると、コマンドの出力に [INFO] [AUDIT] CWWKZ0003I: The application javaee-cafe updated in 1.930 seconds. のようなメッセージが表示されます。 ブラウザーで http://localhost:9080/ にアクセスし、アプリケーションがアクセス可能で、すべての機能が動作していることを確認します。

  3. Ctrl+C キーを押して停止します。

イメージをビルドする

次の例に示すように、docker buildx build コマンドを実行して、イメージをビルドできるようになりました。

cd <path-to-your-repo>/java-app

# If you are running with Open Liberty
docker buildx build --platform linux/amd64 -t javaee-cafe:v1 --pull --file=Dockerfile .

# If you are running with WebSphere Liberty
docker buildx build --platform linux/amd64 -t javaee-cafe:v1 --pull --file=Dockerfile-wlp .

(省略可能) Docker イメージをローカルでテストする

以下の手順を使用して、Azure にデプロイする前に Docker イメージをローカルでテストできるようになりました。

  1. 次のコマンドを使用してイメージを実行します。 このコマンドは、前に定義したデータベース関連の環境変数を使用します。

    docker run -it --rm -p 9080:9080 \
        -e DB_SERVER_NAME=${DB_SERVER_NAME} \
        -e DB_NAME=${DB_NAME} \
        -e DB_USER=${DB_USER} \
        -e DB_PASSWORD=${DB_PASSWORD} \
        javaee-cafe:v1
    
  2. コンテナーが起動した後、ブラウザーで http://localhost:9080/ に移動してアプリケーションにアクセスします。

  3. Ctrl+C キーを押して停止します。

ACR にイメージをアップロードする

次に、ビルドしたイメージを前の手順で作成した ACR にアップロードします。

まだ行っていない場合は、次のコマンドを使用して ACR にサインインします。

docker login -u ${ACR_USER_NAME} -p ${ACR_PASSWORD} ${ACR_LOGIN_SERVER}

次のコマンドを使用して、コンテナー イメージにタグを付け、プッシュします。

docker tag javaee-cafe:v1 ${ACR_LOGIN_SERVER}/javaee-cafe:v1
docker push ${ACR_LOGIN_SERVER}/javaee-cafe:v1

アプリケーションを Azure Container Apps にデプロイする

次のコマンドを使用して、ACR からイメージをプルした後にアプリを実行する Azure Container Apps インスタンスを作成します。 この例では、youracainstancename という名前の Azure 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-username $ACR_USER_NAME \
    --registry-password $ACR_PASSWORD \
    --target-port 9080 \
    --env-vars \
        DB_SERVER_NAME=${DB_SERVER_NAME} \
        DB_NAME=${DB_NAME} \
        DB_USER=${DB_USER} \
        DB_PASSWORD=${DB_PASSWORD} \
    --ingress 'external'

成功すると、プロパティ "type": "Microsoft.App/containerApps" を含む JSON オブジェクトが出力されます。

アプリケーションをテストする

次のコマンドを使用して、アプリケーションにアクセスするための完全修飾 URL を取得します。

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

Web ブラウザーを開いてその URL を参照して、アプリケーションにアクセスしてテストします。 次に示すのは、実行中のアプリケーションのスクリーンショットです。

Azure Container Apps に正常にデプロイされた Java Liberty アプリケーションを示すスクリーンショット。

リソースをクリーンアップする

Azure の課金を回避するには、不要なリソースをクリーンアップする必要があります。 クラスターが不要になったら、az group delete コマンドを使用してリソース グループ、コンテナー レジストリ、コンテナー アプリ、データベース サーバー、および関連するすべてのリソースを削除してください。

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

その後、次のコマンドを使用して、ローカルの Docker サーバーからコンテナー イメージを削除します。

docker rmi -f ${ACR_LOGIN_SERVER}/javaee-cafe:v1

次のステップ

このガイドで使用された以下の参考資料から、より多くのことを学習できます。

Azure で WebSphere 製品を実行するオプションについては、「Azure で WebSphere ファミリの製品を実行するためのソリューションとは?」を参照してください。