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.62.0 以降をインストールして、Azure CLI コマンドを実行します。
az login
コマンドを使用して Azure CLI でサインインします。 認証プロセスを完了するには、ターミナルに表示される手順に従います。 その他のサインイン オプションについては、「Azure CLI を使用して Azure にサインインする」を参照してください。- 初回使用時にインストールを求められたら、Azure CLI 拡張機能をインストールします。 拡張機能の詳細については、「Azure CLI で拡張機能を使用および管理する」を参照してください。
az version
を実行して、インストールされているバージョンと依存ライブラリを見つけます。 最新バージョンにアップグレードするには、az upgrade
を実行します。
- Java SE 実装バージョン 17 をインストールします。たとえば、Microsoft ビルド の OpenJDKなど。
- Maven 3.9.8 以降 をインストールする。
- Git がインストールされていることを確認します。
Azure へのサインイン
az login
コマンドを使用して Azure サブスクリプションにサインインし、画面の指示に従います。
az login
メモ
PowerShell では、Bash と同様に、ほとんどの Azure CLI コマンドを実行できます。 違いがあるのは、変数を使用する場合だけです。 以降のセクションでは、必要に応じてさまざまなタブでその違いについて説明します。
複数の Azure テナントがお使いの Azure 資格情報に関連付けられている場合は、サインインするテナントを指定する必要があります。 テナントを指定するには、--tenant
オプション (az login --tenant contoso.onmicrosoft.com
など) を使用します。
1 つのテナント内に複数のサブスクリプションがある場合は、az account set --subscription <subscription-id>
を使用して使用するサブスクリプションでサインインしていることを確認します。
リソース グループの作成
Azure リソース グループは、Azure リソースが展開され管理される論理グループです。
eastus2
の場所で az group create
コマンドを使用して、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 eastus2
ACR インスタンスを作成する
az acr create
コマンドを使用して、ACR インスタンスを作成します。 次の例では、youruniqueacrname
という名前の ACR インスタンスを作成します。 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 環境では、コンテナー アプリのグループを囲むセキュリティ保護された境界が作成されます。 同じ環境にデプロイされた 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 に 1 つのデータベースを作成します。
まず、次のコマンドを使用して、データベース関連の環境変数を設定します。 <your-unique-sql-server-name>
を Azure SQL Database サーバーの一意の名前に置き換えます。
export SQL_SERVER_NAME=<your-unique-sql-server-name>
export DB_NAME=demodb
次に、次のコマンドを使用して、Azure SQL Database に 1 つのデータベースを作成し、現在サインインしているユーザーを 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
次に、次のコマンドを使用して、ローカル IP アドレスを Azure SQL Database サーバーのファイアウォール規則に追加して、ローカル コンピューターが後でローカル テストのためにデータベースに接続できるようにします。
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、resources、および webapp ディレクトリには、サンプル アプリケーションのソース コードが含まれています。 このコードでは、jdbc/JavaEECafeDB
という名前のデータ ソースを宣言して使用します。
java-app ルート ディレクトリには、Open Liberty または WebSphere Liberty を使用するアプリケーション イメージを作成するための 2 つのファイルがあります。
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
の詳細については、「Building a web application with Maven」(Maven での Web アプリケーションのビルド) を参照してください。 アプリケーションでは、ローカル IDE などの他のメカニズムを使用して、同様の操作を行うことができます。
メモ
"サーバーレス" データベースのデプロイを選択した場合は、SQL データベースが一時停止モードに入らなかったことを確認します。 検証を実行する方法の 1 つは、「クイック スタート: Azure portal クエリ エディター (プレビュー) を使用して Azure SQL Databaseにクエリを実行する」で説明されているように、データベース クエリ エディターにサインインすることです。
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
アプリケーションが想定どおりに動作することを確認します。 成功すると、コマンドの出力に
[INFO] [AUDIT ] CWWKZ0001I: Application javaee-cafe started in 11.086 seconds.
のようなメッセージが表示されます。 ブラウザーでhttp://localhost:9080/
にアクセスし、アプリケーションがアクセス可能で、すべての機能が動作していることを確認します。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 インスタンスを作成します。 この例では、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-identity system \
--target-port 9080 \
--ingress 'external' \
--min-replicas 1
成功すると、プロパティ "type": "Microsoft.App/containerApps"
を含む JSON オブジェクトが出力されます。
次に、次の手順に従い、Service Connector を使用して Azure SQL Database サーバーをコンテナー アプリに接続します。
このサンプルでは、Service Connector を使用してデータベースへの接続を容易にしています。 Service Connector の詳細については、「Service Connector とは」を参照してください。次のコマンドを使用して、Azure CLI のパスワードレス拡張機能をインストールします。
az extension add --name serviceconnector-passwordless --upgrade --allow-preview true
次のコマンドを使い、システム割り当てマネージド 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)
アプリケーションにアクセスしてテストするには、WEB ブラウザーで URL を開きます。 次に示すのは、実行中のアプリケーションのスクリーンショットです。
リソースをクリーンアップする
Azure の課金を回避するには、不要なリソースをクリーンアップする必要があります。 クラスターが不要になったら、az group delete
コマンドを使用して、リソース グループ、コンテナー レジストリ、コンテナー アプリ、データベース サーバー、およびすべての関連リソースを削除します。
az group delete --name $RESOURCE_GROUP_NAME --yes --no-wait
次のステップ
このガイドで使用された以下の参考資料から、より多くのことを学習できます。
- Azure Container Apps
- Service Connector を使用して Azure SQL Database を統合する
- Microsoft Entra 認証を使用して接続する
- Open Liberty
- Open Liberty サーバー構成
- Liberty Maven プラグイン
- Open Liberty コンテナー イメージ
- WebSphere Liberty コンテナー イメージ
Azure で WebSphere 製品を実行するオプションについては、「Azure で WebSphere ファミリの製品を実行するためのソリューションとは?」を参照してください。