Share via


クイックスタート: 初めての Java ネイティブ イメージ アプリケーションを Azure Spring Apps にデプロイする

Note

毎月最初の 50 vCPU 時間と 100 GB 時間のメモリは無料です。 詳細については、Apps on Azure ブログの「価格の引き下げ - Azure Spring Apps はより多く、より低コスト」を参照 してください。

注意

Azure Spring Apps は、Azure Spring Cloud サービスの新しい名前です。 サービスの名前は新しくなりましたが、スクリーンショット、ビデオ、図などの資産の更新に取り組んでいる間、場所によってはしばらく古い名前が表示されます。

この記事の適用対象:❌ Basic または Standard ✔️ Enterprise

このクイックスタートでは、Spring Boot アプリケーションをネイティブ イメージとして Azure Spring Apps にデプロイする方法について説明します。

ネイティブ イメージ機能を使用すると、Java アプリケーションをネイティブ イメージと呼ばれるスタンドアロンの実行可能ファイルにコンパイルできます。 これらの実行可能ファイルには、従来の JVM (Java 仮想マシン) と比較して、起動時間の短縮やランタイム メモリのオーバーヘッドの削減など、大きな利点があります。

サンプル プロジェクトは Spring Petclinic アプリケーションです。 このアプリケーションを次のスクリーンショットに示します。

Screenshot of a Spring Petclinic application in Azure Spring Apps.

1.前提条件

2. Spring Petclinic プロジェクトを準備する

次の手順を使用して、アプリをローカルで複製して実行します。

  1. 次のコマンドを使用して、GitHub から Spring Petclinic プロジェクトをクローンします。

    git clone https://github.com/Azure-Samples/spring-petclinic.git
    
  2. 次のコマンドを使用して、Spring Petclinic プロジェクトをビルドします。

    cd spring-petclinic
    ./mvnw clean package -DskipTests -Pnative package
    
  3. 次のコマンドを使用して、Maven を使用して Spring Petclinic アプリケーションを実行します。

    java -jar target/spring-petclinic-3.1.0-SNAPSHOT.jar
    
  4. ブラウザーで http://localhost:8080 に移動し、Spring Petclinic アプリケーションにアクセスします。

3. クラウド環境を準備する

Spring Petclinic アプリケーションの実行に必要なメイン リソースは、Azure Spring Apps インスタンスです。 このセクションでは、このリソースを作成する手順を示します。

3.1. 各リソースの名前を指定する

次のコマンドを使用して、リソースを保持する変数を作成します。 プレースホルダーは必ず、独自の値で置き換えてください。

export RESOURCE_GROUP=<resource-group-name>
export LOCATION=<location>
export AZURE_SPRING_APPS_NAME=<Azure-Spring-Apps-service-instance-name>
export NATIVE_BUILDER=native-builder
export JAR_APP_NAME=jar-app
export NATIVE_APP_NAME=native-app
export JAR_PATH=target/spring-petclinic-3.1.0-SNAPSHOT.jar

3.2. 新しいリソース グループを作成する

次の手順を使用して、新しいリソース グループを作成します。

  1. 次のコマンドを使用して、Azure CLI にサインインします。

    az login
    
  2. 次のコマンドを使用して、既定の場所を設定します。

    az configure --defaults location=${LOCATION}
    
  3. 次のコマンドを使用して、使用可能なすべてのサブスクリプションを一覧表示し、使用するサブスクリプション ID を決定します。

    az account list --output table
    
  4. 次のコマンドを使用して、既定のサブスクリプションを設定します。

    az account set --subscription <subscription-ID>
    
  5. 次のコマンドを使用して、リソース グループを作成します。

    az group create --resource-group ${RESOURCE_GROUP}
    
  6. 次のコマンドを使用して、新しく作成したリソース グループを既定のリソース グループとして設定します。

    az configure --defaults group=${RESOURCE_GROUP}
    

3.3. Azure Spring Apps インスタンスを作成する

Azure Spring Apps は、Spring Petclinic アプリをホストするために使用されます。 次の手順を使用して、Azure Spring Apps インスタンスとその中に 2 つのアプリケーションを作成します。

  1. 次のコマンドを使用して、Azure Spring Apps サービス インスタンスを作成します。 ネイティブ イメージ ビルドでは、イメージのビルド中に 16 Gi のメモリが必要になるため、ビルド プールのサイズを S7 として構成します。

    az spring create \
        --name ${AZURE_SPRING_APPS_NAME} \
        --sku enterprise \
        --build-pool-size S7
    
  2. 現在のディレクトリに builder-native.json ファイルを作成し、次のコンテンツを追加します。

    {
       "stack": {
         "id": "io.buildpacks.stacks.jammy",
         "version": "tiny"
       },
       "buildpackGroups": [
         {
           "name": "default",
           "buildpacks": [
             {
               "id": "tanzu-buildpacks/java-native-image"
             }
           ]
         }
       ]
     }  
    
  3. 次のコマンドを使用して、ネイティブ イメージ アプリケーションをビルドするためのカスタム ビルダーを作成します。

    az spring build-service builder create \
        --service ${AZURE_SPRING_APPS_NAME} \
        --name ${NATIVE_BUILDER} \
        --builder-file builder-native.json
    
  4. 次のコマンドを使用して、Spring Petclinic アプリケーションを JAR ファイルとしてデプロイする Azure Spring Apps インスタンス内にアプリケーションを作成します。 メモリ制限を 1 Gi に構成します。

    az spring app create \
        --service ${AZURE_SPRING_APPS_NAME} \
        --name ${JAR_APP_NAME} \
        --cpu 1 \
        --memory 1Gi \
        --assign-endpoint true
    
  5. 次のコマンドを使用して、Spring Petclinic アプリケーションをネイティブ イメージとしてデプロイする Azure Spring Apps インスタンス内にアプリケーションを作成します。

    az spring app create \
        --service ${AZURE_SPRING_APPS_NAME} \
        --name ${NATIVE_APP_NAME} \
        --cpu 1 \
        --memory 1Gi \
        --assign-endpoint true
    

4. アプリを Azure Spring Apps にデプロイする

クラウド環境が準備されたので、アプリケーションをデプロイする準備ができています。

次のコマンドを使用して、Spring Petclinic アプリケーションを JAR ファイルとしてデプロイします。

az spring app deploy \
    --service ${AZURE_SPRING_APPS_NAME} \
    --name ${JAR_APP_NAME} \
    --artifact-path ${JAR_PATH} \
    --build-env BP_JVM_VERSION=17

次のコマンドを使用して、Spring Petclinic アプリケーションをネイティブ イメージとしてデプロイします。

az spring app deploy \
    --service ${AZURE_SPRING_APPS_NAME} \
    --name ${NATIVE_APP_NAME} \
    --builder ${NATIVE_BUILDER} \
    --build-cpu 8 \
    --build-memory 16Gi \
    --artifact-path ${JAR_PATH} \
    --build-env BP_JVM_VERSION=17 BP_NATIVE_IMAGE=true

5. ネイティブ イメージ アプリを検証する

これで、デプロイしたネイティブ イメージ アプリにアクセスして、動作するかどうかを確認できます。 次の手順に従って、検証します。

  1. デプロイが完了したら、次のコマンドを実行してアプリの URL を取得できます。

    az spring app show \
        --service ${AZURE_SPRING_APPS_NAME} \
        --name ${NATIVE_APP_NAME} \
        --output table
    

    出力に Public Url として表示される URL を使用してアプリにアクセスできます。 ページは localhost で確認したとおりに表示されます。

  2. 次のコマンドを使用して、アプリのログをチェックし、デプロイの問題を調査します。

    az spring app logs \
        --service ${AZURE_SPRING_APPS_NAME} \
        --name ${NATIVE_APP_NAME}
    

6. JAR とネイティブ イメージのパフォーマンスを比較する

次のセクションでは、JAR とネイティブ イメージのデプロイのパフォーマンスを比較する方法について説明します。

サーバー起動時刻

次のコマンドを使用してアプリのログ Started PetClinicApplication in XXX seconds をチェックし、JAR アプリのサーバーの起動時間を取得します。

az spring app logs \
    --service ${AZURE_SPRING_APPS_NAME} \
    --name ${JAR_APP_NAME}

JAR アプリの場合、サーバーの起動時間は約 25 秒です。

次のコマンドを使用してアプリのログをチェックし、ネイティブ イメージ アプリのサーバーの起動時間を取得します。

az spring app logs \
    --service ${AZURE_SPRING_APPS_NAME} \
    --name ${NATIVE_APP_NAME}

ネイティブ イメージ アプリの場合、サーバーの起動時間は 0.5 秒未満です。

メモリ使用量

次のコマンドを使用して、ネイティブ イメージ アプリのメモリ サイズを 512 Mi にスケールダウンします。

az spring app scale \
    --service ${AZURE_SPRING_APPS_NAME} \
    --name ${NATIVE_APP_NAME} \
    --memory 512Mi

コマンド出力には、ネイティブ イメージ アプリが正常に起動したことが表示されます。

次のコマンドを使用して、JAR アプリのメモリ サイズを 512 Mi にスケールダウンします。

az spring app scale \
    --service ${AZURE_SPRING_APPS_NAME} \
    --name ${JAR_APP_NAME} \
    --memory 512Mi

コマンド出力には、メモリ不足のため JAR アプリの起動に失敗したことを示されます。 出力メッセージは次の例のようになります: Terminating due to java.lang.OutOfMemoryError: Java heap space

次の図は、Petclinic アプリケーションへの 1 秒あたり 400 要求の一定のワークロード用として最適化されたネイティブ イメージ デプロイのメモリ使用量を示しています。 メモリ使用量は、同等の JAR デプロイによって消費されるメモリの約 5 分の 1 です。

Screenshot of the optimized memory usage of a Native Image deployment in Azure Spring Apps.

ネイティブ イメージの方が、従来の Java 仮想マシン (JVM) と比較して、起動時間が短縮され、ランタイム メモリのオーバーヘッドが削減されます。

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

後続のクイック スタートおよびチュートリアルを引き続き実行する場合は、これらのリソースをそのまま残しておくことができます。 リソースが不要になったら、リソース グループを削除してリソースを削除します。 次のコマンドを使用して、リソース グループを削除します。

az group delete --name ${RESOURCE_GROUP}

8.次のステップ

詳細については、次の記事を参照してください。