Azure Spring Apps に関する一般的な問題のトラブルシューティング

Note

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

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

この記事では、Azure Spring Apps の開発に関する問題のトラブルシューティングについて説明します。 詳細については、「Azure Spring Apps に関する FAQ」を参照してください。

可用性、パフォーマンス、アプリケーションの問題

アプリケーションを起動できない

アプリケーションを起動できない場合、そのエンドポイントに接続できないか、数回の再試行後に 502 が返されることがあります。

トラブルシューティングを行うには、ログを Azure Log Analytics にエクスポートします。 Spring アプリケーション ログのテーブルの名前は AppPlatformLogsforSpring です。 詳しくは、「診断設定でログとメトリックを分析する」をご覧ください。

ログに次のエラー メッセージが含まれることがあります。org.springframework.context.ApplicationContextException: Unable to start web server

このメッセージは、次の 2 つの問題のいずれかを示しています。

  • いずれかの Bean またはその依存関係のいずれかが見つかりません。
  • Bean のプロパティの 1 つが見つからないか、無効です。 この場合、"java.lang.IllegalArgumentException" が表示されます。

サービスのバインディングが原因で、アプリケーションの起動が失敗することもあります。 ログのクエリを実行するには、バインドされているサービスに関連するキーワードを使います。 たとえば、ローカルのシステム時刻に設定されている MySQL インスタンスを対象としたバインディングがアプリケーションにあるとします。 アプリケーションの起動が失敗する場合、次のエラー メッセージがログで見つかることがあります。

"java.sql.SQLException: The server time zone value 'Coordinated Universal Time' is unrecognized or represents more than one time zone." (サーバーのタイム ゾーンの値 '協定世界時' が認識されないか、複数のタイム ゾーンを表しています。)

このエラーを解決するには、MySQL インスタンスの server parameters に移動し、time_zone の値を SYSTEM から +0:00 に変更します。

アプリケーションがクラッシュするか、予期しないエラーをスローする

アプリケーションのクラッシュをデバッグするときは、まずアプリケーションの実行状態と検出状態を確認します。 そのためには、Azure portal の [アプリ] に移動し、すべてのアプリケーションの状態が [実行中] かつ [UP]\(稼働中\) であることを確認します。

  • 状態が [実行中] であるが、検出状態が [UP]\(稼働中\) でない場合は、「アプリケーションを登録できない」セクションをご覧ください。

  • 検出状態が [稼働中] になっている場合は、[メトリック] に移動して、アプリケーションの正常性を確認します。 確認するメトリックは次のとおりです。

    • tomcat.global.error:

      Spring アプリケーションのすべての例外がここにカウントされます。 この値が大きい場合は、Azure Log Analytics に移動して、アプリケーション ログを調べます。

    • jvm.memory.max:

      アプリケーションで利用可能なメモリの最大量です。 量が定義されていないか、定義されていても時間が経って変更されている可能性があります。 定義されている場合、使用済みおよびコミット済みのメモリ量は、常に最大量以下になります。 ただし、"使用済みメモリ量が <= max" であっても、"使用済み>コミット済み " となるように使用済みメモリ量を増やそうとすると、OutOfMemoryError メッセージが表示され、メモリ割り当てが失敗する可能性があります。 このような状況では、-Xmx パラメーターを使用して最大ヒープ サイズを増やしてみてください。

    • jvm.memory.used:

      アプリケーションで現在使用されているメモリの量 (バイト単位) です。 通常の負荷の Java アプリケーションでは、このメトリック シリーズは "鋸歯" パターンになります。この場合、メモリの使用量は、少しずつ増加して突然大きく減少するという、安定した増減パターンを繰り返します。 このメトリック シリーズは、Java 仮想マシン内のガベージ コレクションによって発生し、鋸歯パターンで大きく低下したところが、コレクション アクションを表しています。

      このメトリックは、次のようなメモリの問題を特定するのに役立ちます。

      • 最初のメモリの爆発的な増加。
      • 特定の論理パスに対するメモリ割り当ての急増。
      • 段階的なメモリ リーク。

    詳しくは、メトリックに関する記事をご覧ください。

    Note

    これらのメトリックは、Spring Boot アプリケーションでのみ使用できます。 これらのメトリックを有効にするには、spring-boot-starter-actuator 依存関係を追加します。 詳細については、「Spring Boot アクチュエータを使用してアプリを管理および監視する」の「アクチュエータの依存関係を追加する」セクションを参照してください。

  • アプリケーションの起動に失敗した場合は、アプリケーションに有効な jvm パラメーターがあることを確認します。 jvm メモリの設定が高すぎる場合、ログに次のエラー メッセージが含まれている可能性があります。

    "required memory 2728741K is greater than 2000M available for allocation" (必要なメモリ 2728741K は割り当てに使用できる 2000M を超えています)

Azure Log Analytics について詳しくは、「Azure Monitor で Log Analytics の使用を開始する」をご覧ください。

アプリケーションで高い CPU 使用率またはメモリ使用率が発生する

アプリケーションで CPU またはメモリの使用率が高くなった場合には、次の 2 つの状況のいずれかが発生しています。

  • すべてのアプリ インスタンスで CPU またはメモリの使用率が高い。
  • 一部のアプリ インスタンスで CPU またはメモリの使用率が高い。

どちらの状況が当てはまるかを確認するには、次の手順を使用します。

  1. [メトリック] に移動し、[サービス CPU 使用率] または [Service Memory Used]\(サービス メモリ使用量\) を選択します。
  2. 監視するアプリケーションを指定するには、App= フィルターを追加します。
  3. インスタンスごとにメトリックを分割します。

"すべてのインスタンス" で CPU またはメモリの使用率が高くなっている場合は、アプリケーションをスケールアウトするか、CPU またはメモリの使用量をスケールアップする必要があります。 詳細については、Azure Spring Apps でアプリケーションをスケーリングするためのチュートリアルを参照してください。

"一部のインスタンス" で CPU またはメモリの使用率が高くなっている場合は、インスタンスの状態とその検出状態を確認します。

詳細については、「Azure Spring Apps のメトリック」を参照してください。

すべてのインスタンスが稼働している場合は、Azure Log Analytics に移動して、アプリケーション ログのクエリを実行し、コードのロジックを調べます。 この調査は、いずれかがスケールのパーティション分割に影響している可能性があるかどうかを確認するのに役立ちます。 詳しくは、「診断設定でログとメトリックを分析する」をご覧ください。

Azure Log Analytics について詳しくは、「Azure Monitor で Log Analytics の使用を開始する」をご覧ください。 Kusto クエリ言語を使用して、ログのクエリを実行します。

Spring アプリケーションを Azure Spring Apps にデプロイするためのチェックリスト

アプリケーションをオンボードする前に、次の条件を満たしていることを確認します。

  • 指定した Java ランタイム バージョンのローカル環境で、アプリケーションを実行できる。
  • 環境の構成 (CPU、RAM、およびインスタンス) が、アプリケーション プロバイダーが定めた最小要件を満たしている。
  • 構成項目に適切な値が設定されている。 詳しくは、「自分のサービス向けに Spring Cloud Config Server インスタンスを設定する」を参照してください。 Enterprise プランについては、「Application Configuration Service を使用する」を参照してください。
  • 環境変数に適切な値が設定されている。
  • JVM パラメーターに適切な値が設定されている。
  • 埋め込まれている "構成サーバー" および "Spring サービス レジストリ" サービスを無効にするか、アプリケーション パッケージから削除することをお勧めします。
  • いずれかの Azure リソースを "サービス バインド" によってバインドする場合は、ターゲット リソースが稼働していることを確認します。

構成と管理

Azure Spring Apps サービス インスタンスの作成で問題が発生した

Azure portal を使用して Azure Spring Apps サービス インスタンスを設定すると、Azure Spring Apps によって自動的に検証が行われます。

一方、Azure CLI または Azure Resource Manager テンプレートを使用して Azure Spring Apps サービス インスタンスを設定する場合には、次の条件を満たしていることを確認してください。

  • サブスクリプションがアクティブである。
  • Azure Spring Apps がお使いのリージョンで使用できる。 詳細については、「Azure Spring Apps に関する FAQ」を参照してください。
  • インスタンスのリソース グループが既に作成されている。
  • リソース名が、名前付け規則に準拠している 名前に使用できる文字は、小文字、数字、ハイフンのみです。 先頭の文字は英字にする必要があります。 末尾の文字は、文字または数字にする必要があります。 値は 2 文字以上 32 文字以下にする必要があります。

Resource Manager テンプレートを使用して Azure Spring Apps サービス インスタンスを設定する場合は、最初に「Azure Resource Manager テンプレートの構造と構文の詳細」を参照してください。

Azure Spring Apps サービス インスタンスの名前が azuremicroservices.io の下のサブドメイン名を要求するために使用されるため、名前が既存のものと競合する場合、設定は失敗します。 アクティビティ ログで詳細を確認できる場合があります。

.NET Core アプリをデプロイできない

Azure portal または Resource Manager テンプレートを使用して .NET Core Steeltoe アプリの .zip ファイルをアップロードすることはできません。

Azure CLI を使用してアプリケーション パッケージをデプロイすると、Azure CLI によってデプロイの進行状況が定期的にポーリングされ、最後にデプロイの結果が表示されます。

アプリケーションが正しい .zip ファイル形式でパッケージ化されていることを確認してください。 正しくパッケージ化されていないと、プロセスの応答が停止するか、エラー メッセージが表示されます。

JAR パッケージをデプロイできない

Azure portal または Resource Manager テンプレートを使用して、Java アーカイブ ファイル (JAR) やソース パッケージをアップロードすることはできません。

Azure CLI を使用してアプリケーション パッケージをデプロイすると、Azure CLI によってデプロイの進行状況が定期的にポーリングされ、最後にデプロイの結果が表示されます。

ポーリングが中断された場合でも、次のコマンドを使用してデプロイ ログを取得できます。

az spring app show-deploy-log --name <app-name>

アプリケーションが適切な実行可能 JAR 形式でパッケージ化されていることを確認します。 正しくパッケージ化されていない場合は、次の例のようなエラーメッセージが表示されます: Error: Invalid or corrupt jarfile /jar/38bc8ea1-a6bb-4736-8e93-e8f3b52c8714

ソース パッケージをデプロイできない

Azure portal または Resource Manager テンプレートを使用して、JAR やソース パッケージをアップロードすることはできません。

Azure CLI を使用してアプリケーション パッケージをデプロイすると、Azure CLI によってデプロイの進行状況が定期的にポーリングされ、最後にデプロイの結果が表示されます。

ポーリングが中断された場合でも、次のコマンドを使用してビルドとデプロイのログを取得できます。

az spring app show-deploy-log --name <app-name>

ただし、1 つの Azure Spring Apps サービス インスタンスで一度にソース パッケージ 1 つに対してトリガーできるビルド ジョブは 1 件のみです。 詳しくは、「アプリケーションをデプロイする」および「Azure Spring Apps でステージング環境を設定する」をご覧ください。

アプリケーションを登録できない

ほとんどの場合、このような状況が発生するのは、"必要な依存関係" および "サービス検出" が、プロジェクト オブジェクト モデル (POM) ファイルで正しく構成されていない場合です。 構成が終わると、組み込みのサービス レジストリ サーバー エンドポイントが、アプリケーションに環境変数として挿入されます。 その後、アプリケーションはサービス レジストリ サーバーに登録され、他の依存アプリケーションを検出します。

新しく登録されたインスタンスでトラフィックの受信が開始されるまで、少なくとも 2 分待ってください。

既存の Spring Cloud ベースのソリューションを Azure に移行する場合は、Azure Spring Apps によって提供されるマネージド インスタンスとの競合を避けるため、必ず、アドホックの "サービス レジストリ" と Config Server の各インスタンスを削除するか、無効にしてください。

また、Azure Log Analytics で "サービス レジストリ" のクライアント ログを確認することもできます。 詳しくは、「診断設定でログとメトリックを分析する」をご覧ください

Azure Log Analytics について詳しくは、「Azure Monitor で Log Analytics の使用を開始する」をご覧ください。 Kusto クエリ言語を使用して、ログのクエリを実行します。

アプリケーションの環境変数を調べたい

環境変数によって Azure Spring Apps フレームワークに伝えられる情報により、アプリケーションを構成するサービスの場所と構成方法が Azure で認識されます。 潜在的な問題をトラブルシューティングするためにまず必要な手順は、環境変数が正しいことの確認です。 環境変数は、Spring Boot Actuator エンドポイントを使用して確認できます。

警告

この手順では、テスト エンドポイントを使用して環境変数が公開されます。 テスト エンドポイントがパブリックにアクセスできる場合や、アプリケーションにドメイン名が割り当てられている場合は、この先の手順を行わないようにしてください。

  1. https://<your-application-test-endpoint>/actuator/health 」を参照してください。

    {"status":"UP"} のような応答は、エンドポイントが有効になっていることを示します。 応答が否定的である場合は、POM.xml ファイルに次の依存関係を追加します。

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    
  2. Spring Boot Actuator エンドポイントが有効になったら、Azure portal に移動してアプリケーションの構成ページを見つけます。 名前は MANAGEMENT_ENDPOINTS_WEB_EXPOSURE_INCLUDE、値は * として、環境変数を追加します。

  3. アプリケーションを再起動します。

  4. https://<your-application-test-endpoint>/actuator/env に移動して、応答を調べます。 次のようになります。

    {
        "activeProfiles": [],
        "propertySources": {,
            "name": "server.ports",
            "properties": {
                "local.server.port": {
                    "value": 1025
                }
            }
        }
    }
    

systemEnvironment という名前の子ノードを検索します。 このノードにアプリケーションの環境変数が格納されています。

重要

アプリケーションをパブリックにアクセスできるようにする前に、公開した環境変数は必ず元に戻してください。 Azure portal に移動してアプリケーションの構成ページを探し、環境変数 MANAGEMENT_ENDPOINTS_WEB_EXPOSURE_INCLUDE を削除します。

アプリケーションのメトリックまたはログが見つからない

[アプリ] に移動し、アプリケーションの状態が [実行中] かつ [UP]\(稼働中\) であることを確認します。

アプリケーション パッケージで JMX が有効になっているか確認します。 この機能は構成プロパティ spring.jmx.enabled=true で有効にできます。

アプリケーション パッケージで spring-boot-actuator 依存関係が有効になっており、正常に起動しているかどうかを確認します。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

アプリケーション ログをストレージ アカウントにアーカイブすることはできても、Azure Log Analytics に送信できない場合は、ワークスペースが正しく設定されているかどうかを確認します。 詳細については、「Log Analytics ワークスペースを作成する」を参照してください。 また、Basic プランではサービス レベル アグリーメント (SLA) が提供されない点に注意してください。 詳細については、「Online Services のサービス レベル アグリーメント (SLA)」を参照してください。

Enterprise プラン

エラー 112039: Azure Marketplace で購入できませんでした

Azure Spring Apps Enterprise プラン インスタンスの作成がエラー コード "112039" で失敗します。 詳細については、次の一覧の詳細なエラー メッセージを確認してください。

  • "Failed to purchase on Azure Marketplace because the Microsoft.SaaS RP is not registered on the Azure subscription." (Azure Marketplace で購入できませんでした。これは、Azure サブスクリプションに Microsoft.SaaS RP が登録されていないためです。): Azure Spring Apps Enterprise プランでは、VMWare から SaaS オファーを購入します。

    Azure Spring Apps Enterprise インスタンスを作成する前に、Microsoft.SaaS リソース プロバイダーを登録する必要があります。 リソース プロバイダーを登録する方法を参照してください。

  • "Failed to load catalog product vmware-inc.azure-spring-cloud-vmware-tanzu-2 in the Azure subscription market." (Azure サブスクリプション マーケットでカタログ製品 vmware-inc.azure-spring-cloud-vmware-tanzu-2 を読み込めませんでした): Azure サブスクリプションの課金アカウントの住所が、サポートされている場所にありません。

    詳細については、「マーケット '<Location>' で利用できるプランはありません」セクションを参照してください。

  • "Failed to purchase on Azure Marketplace due to signature verification on Marketplace legal agreement. (Marketplace の法的契約に対する署名の検証により、Azure Marketplace で購入できませんでした) Check the Azure subcription has agree terms vmware-inc.azure-spring-cloud-vmware-tanzu-2.asa-ent-hr-mtr (Azure サブスクリプションで vmware-inc.azure-spring-cloud-vmware-tanzu-2.asa-ent-hr-mtr のご契約条件への同意が行われていることを確認してください)": ご使用の Azure サブスクリプションでは、購入しようとしているオファーとプランのご契約条件への署名が行われていません。

    お使いの Azure サブスクリプションに移動し、次の Azure CLI コマンドを実行して、使用条件に同意してください。

    az term accept \
        --publisher vmware-inc \
        --product azure-spring-cloud-vmware-tanzu-2 \
        --plan asa-ent-hr-mtr
    

    それでも問題が解決しない場合は、次の情報を用意してサポート チームに問い合わせてください。

    • AZURE_TENANT_ID: Azure サブスクリプションがホストされている Azure テナントの ID
    • AZURE_SUBSCRIPTION_ID: Azure Spring Apps インスタンスを作成するために使用された Azure サブスクリプション ID
    • SPRING_CLOUD_NAME: 失敗したインスタンス名
    • ERROR_MESSAGE: 観察されたエラー メッセージ

マーケット '<Location>' で使用できるプランはありません

Azure Marketplace で SaaS オファー Azure Spring Apps Enterprise にアクセスすると、次の画像のように、"マーケット '<場所>' で使用できるプランはありません" と表示される場合があります。

Azure Spring Apps Enterprise プランでは、顧客は Azure Marketplace オファーを通じて Tanzu コンポーネントに対するライセンスの料金を支払う必要があります。 Azure Marketplace で購入するには、お使いの Azure サブスクリプションの課金アカウントの国またはリージョンが、SaaS オファーでサポートされている地理的な場所にある必要があります。

Azure Spring Apps Enterprise では、Azure Marketplace でサポートされているすべての地理的な場所がサポートされるようになりました。 Marketplace でサポートされている地理的な場所に関する記事を参照してください。

管理者アクセス権がある場合は、サブスクリプションの課金アカウントを表示できます。 課金アカウントの表示に関する記事を参照してください。

VMware Spring Runtime のサポートが必要です (Enterprise プランのみ)

Enterprise プランには、VMware Spring Runtime のサポートが組み込まれています。そのため、問題が VMware Spring Runtime のサポートの範囲内であると思われる場合は、VMware に対してサポート チケットを開くことができます。 VMware Spring Runtime のサポート自体について理解を深めるには、「VMware Spring Runtime」を参照してください。 このサポート サービスの登録と使用に関する詳細については、VMware の Enterprise に関する FAQ の「Support」セクションを参照してください。 その他の問題については、Microsoft でサポート チケットを開いてください。

次のステップ