次の方法で共有


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

javaresources、および 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にクエリを実行する」で説明されているように、データベース クエリ エディターにサインインすることです。

  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 インスタンスを作成します。 この例では、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 サーバーをコンテナー アプリに接続します。

  1. このサンプルでは、Service Connector を使用してデータベースへの接続を容易にしています。 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)

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

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

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

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

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

次のステップ

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

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