次の方法で共有


アプリケーションの正常性拡張機能と Azure 仮想マシンの使用

アプリケーションの正常性の監視は、VM を管理するための重要なシグナルです。 Azure 仮想マシンでは、個々のインスタンスの正常性の監視を活用して VM を安全に更新する VM ゲスト自動修正をサポートしています。

この記事では、2 種類のアプリケーションの正常性拡張機能 (Binary Health States または Rich Health States) を使用して、Azure 仮想マシンにデプロイされたアプリケーションの正常性を監視する方法について説明します。

アプリケーションの正常性の監視は、仮想マシン スケール セットでも使用でき、ローリング アップグレードOS イメージの自動アップグレードインスタンスの自動修復などの機能を有効にするのに役立ちます。 スケール セットでのスケール、可用性、柔軟性のベネフィットを追加してこれらの機能を体験するには、既存のスケール セット に VM をアタッチするか、新しいスケール セットを作成します。

前提条件

この記事は、Azure 仮想マシン拡張機能を熟知していることを前提としています。

注意

Application Health 拡張機能では、VM に "正常" というラベルを付けるために、構成されたポート tcp または要求パス http/https で一貫したプローブ応答を受信することが想定されています。 VM でアプリケーションが実行されていない場合、またはプローブ応答を構成できない場合、VM は "異常" (Binary Health States) または "不明" (Rich Health States). と示されます。 ローカル エンドポイントへの正常性プローブ応答の出力例については、アプリケーションの正常性のサンプルを参照してください。

アプリケーションの正常性拡張機能を使用するタイミング

アプリケーションの正常性拡張機能は、仮想マシン内からアプリケーションの正常性を報告します。 この拡張機能は、ローカル アプリケーション エンドポイントに対してプローブを実行し、アプリケーションから受信した TCP/HTTP(S) 応答に基づいて正常性状態を更新します。 この正常性状態は、VM ゲストの自動修正中の修正の失敗を監視および検出するために Azure によって使用されます。

この拡張機能は、VM 内から正常性を報告し、Azure Load Balancer 正常性プローブなどの外部プローブを使用できない状況で使用できます。

アプリケーションの正常性は、VM 内で実行されているアプリケーションの状態に関する顧客提供のシグナルです。 アプリケーションの正常性は、VM のパフォーマンスに影響を与えるサービス レベルのイベントを報告するために使用されるプラットフォーム提供のシグナルであるリソースの正常性とは異なります。

Binary Health States と Rich Health States

Application Health 拡張機能には、Binary Health StatesRich Health States という 2 つのオプションがあります。 次の表は、2 つのオプションの主要な相違点です。 一般的な推奨事項については、このセクションの最後をご覧ください。

特徴 Binary Health States Rich Health States
利用可能な正常性状態 2 つの状態を利用可能: "正常"、"異常" 4 つの状態を利用可能: "正常"、"異常"、"初期化中"、"不明"1
正常性シグナルの送信 正常性シグナルは、HTTP/HTTPS 応答コードまたは TCP 接続を介して送信されます。 HTTP/HTTPS プロトコルの正常性シグナルは、プローブ応答コードと応答本文で送信されます。 TCP プロトコルによる正常性シグナルは、Binary Health States によって変更されません。
"異常" なインスタンスの識別 アプリケーションから 正常 シグナルを受信しない場合、インスタンスは自動的に 異常 状態になります。 "異常" なインスタンスは、拡張機能の構成に関する問題 (到達できないエンドポイントなど) またはアプリケーションに関する問題 (200 以外の状態コードなど) を示している可能性があります。 アプリケーションが 異常 プローブ応答を送信した場合にのみ、インスタンスは 異常 状態になります。 ユーザーは、"異常" なアプリケーションのインスタンスを識別してフラグを設定するカスタム ロジックを実装する責任があります2 拡張機能の設定が不適切 (到達できないエンドポイントなど) なインスタンスまたは正常性プローブの応答が無効なインスタンスは、"不明" 状態に分類されます2
新しく作成されたインスタンスの "初期化中" 状態 "初期化中" 状態は使用できません。 新しく作成されたインスタンスは、安定した状態に落ち着くまで時間がかかる場合があります。 状態を初期化すると、新しく作成されたインスタンスの正常性状態を正常異常、または不明として表示する前に、安定した正常性状態にすることができます。
HTTP/HTTPS プロトコル サポートされています サポートされています
TCP プロトコル サポートされています 制限付きサポート – "不明" 状態は TCP プロトコルでは使用できません。 TCP での正常性状態の動作については、Rich Health States のプロトコル テーブルをご覧ください。

1 "不明" 状態は TCP プロトコルでは使用できません。 2 HTTP/HTTPS プロトコルにのみ適用されます。 TCP プロトコルは、Binary Health States と同じプロセスで 異常 インスタンスを識別します。

次の場合は、Binary Health States を使用します。

  • 異常なインスタンスを識別してフラグを設定するためにカスタム ロジックを構成することに関心がない
  • 新しく作成されたインスタンスの "初期化中" 猶予期間は必要ない

次の場合は、Rich Health States を使用します。

  • HTTP/HTTPS プロトコルを使って正常性シグナルを送信し、プローブ応答本文を使って正常性情報を送信できる
  • カスタム ロジックを使って、異常なインスタンスを識別してマークしたい
  • 新しく作成されたインスタンスが安定した正常性状態になることができるように初期化猶予期間を設定したい

Binary Health States

Binary Health States の報告には、"正常" と "異常" の 2 つの正常性状態が含まれます。 次の表では、正常性状態がどのように構成されるのかを簡単に説明します。

HTTP/HTTPS プロトコル

Protocol 正常性の状態 説明
http/https Healthy "正常" のシグナルを送信するには、アプリケーションが 200 応答コードを返す必要があります。
http/https 異常 アプリケーションから 200 応答コードを受信しない場合、インスタンスは 異常 としてマークされます。

TCP プロトコル

Protocol 正常性の状態 説明
TCP Healthy "正常" のシグナルを送信するには、指定されたアプリケーション エンドポイントと正常なハンドシェイクを行う必要があります。
TCP 異常 指定されたアプリケーション エンドポイントとのハンドシェイクが失敗した、または不完全な場合、インスタンスは 異常 としてマークされます。

次のような一部の一般的シナリオで、結果が 異常 状態になります。

  • アプリケーション エンドポイントが 200 以外の状態コードを返す場合
  • 仮想マシン内に、アプリケーションの正常性状態を提供するアプリケーション エンドポイントが構成されていない場合
  • アプリケーション エンドポイントが正しく構成されていない場合
  • アプリケーション エンドポイントに到達できない場合

Rich Health States

Rich Health States の報告には、4 つの正常性状態 ("初期化中"、"正常"、"異常"、"不明") が含まれます。 次の表では、各正常性状態がどのように構成されるのかを簡単に説明します。

HTTP/HTTPS プロトコル

Protocol 正常性の状態 説明
http/https Healthy "正常" のシグナルを送信するため、アプリケーションは、次のプローブ応答を返す必要があります。プローブ応答コード: 状態 2xx、プローブ応答本文: {"ApplicationHealthState": "Healthy"}
http/https 異常 "異常" のシグナルを送信するため、アプリケーションは、次のプローブ応答を返す必要があります。プローブ応答コード: 状態 2xx、プローブ応答本文: {"ApplicationHealthState": "Unhealthy"}
http/https 初期化中 拡張機能の開始時に、インスタンスは "初期化中" 状態に自動的に入ります。 詳しくは、「初期化中状態」をご覧ください。
http/https Unknown "不明" 状態は、次のシナリオで発生する可能性があります。アプリケーションから 2xx 以外の状態コードが返されたとき、プローブ要求がタイムアウトしたとき、アプリケーション エンドポイントが到達不可能なときや正しく構成されていないとき、応答本文で ApplicationHealthState に対する値がないときや無効なとき、猶予期間が経過したとき。 詳しくは、「不明状態」をご覧ください。

TCP プロトコル

Protocol 正常性の状態 説明
TCP Healthy "正常" のシグナルを送信するには、指定されたアプリケーション エンドポイントと正常なハンドシェイクを行う必要があります。
TCP 異常 指定されたアプリケーション エンドポイントとのハンドシェイクが失敗した、または不完全な場合、インスタンスは 異常 としてマークされます。
TCP 初期化中 拡張機能の開始時に、インスタンスは "初期化中" 状態に自動的に入ります。 詳しくは、「初期化中状態」をご覧ください。

初期化中状態

この状態は、Rich Health States にのみ適用されます。 "初期化中" 状態は、拡張機能の開始時に 1 回だけ発生し、拡張機能の設定 gracePeriodnumberOfProbes によって構成できます。

拡張機能の起動時に、アプリケーションの正常性は、次の 2 つのシナリオのいずれかが発生するまで 初期化中 状態のままになります。

  • numberOfProbes で構成されている回数だけ、同じ正常性状態 ("正常" または "異常") が連続して報告される
  • gracePeriod の有効期限が切れる

同じ正常性状態 (正常 または 異常) が連続して報告される場合、アプリケーションの正常性は 初期化中 状態から、報告された正常性状態 (正常 または 異常) に遷移します。

numberOfProbes が 3 の場合、それは次のことを意味します。

  • "初期化中" から "正常" 状態に遷移するには: アプリケーション正常性拡張機能が、HTTP/HTTPS または TCP プロトコルにより 3 回連続して "正常" シグナルを受信する必要があります
  • "初期化中" から "異常" 状態に遷移するには: アプリケーション正常性拡張機能が、HTTP/HTTPS または TCP プロトコルにより 3 回連続して "異常" シグナルを受信する必要があります

アプリケーションによって連続する正常性状態が報告される前に gracePeriod が期限切れになった場合、インスタンスの正常性は次のように決定されます。

  • HTTP/HTTPS プロトコル: アプリケーションの正常性は 初期化中 から 不明 に遷移します
  • TCP プロトコル: アプリケーションの正常性は 初期化中 から 異常 に遷移します

状態が不明

不明 状態は、Rich Health States にのみ適用されます。 この状態は、http または https プローブに対してのみ報告され、次のシナリオで発生します。

  • 2xx 以外の状態コードがアプリケーションから返されたとき
  • プローブ要求がタイムアウトしたとき
  • アプリケーション エンドポイントが到達不可能か、正しく構成されていないとき
  • 応答本文で ApplicationHealthState に対して値が指定されていないか、指定された値が無効であるとき
  • 猶予期間が切れたとき

Binary Health States の拡張機能スキーマ

次の JSON は、アプリケーションの正常性拡張機能のスキーマを示しています。 拡張機能には、少なくとも "tcp"、"http"、または "https" 要求が必要で、それぞれにポートまたは要求パスが関連付けられている必要があります。

{
  "extensionProfile" : {
     "extensions" : [
      {
        "name": "HealthExtension",
        "properties": {
          "publisher": "Microsoft.ManagedServices",
          "type": "<ApplicationHealthLinux or ApplicationHealthWindows>",
          "autoUpgradeMinorVersion": true,
          "typeHandlerVersion": "1.0",
          "settings": {
            "protocol": "<protocol>",
            "port": <port>,
            "requestPath": "</requestPath>",
            "intervalInSeconds": 5,
            "numberOfProbes": 1
          }
        }
      }
    ]
  }
} 

プロパティ値

名前 値/例 データ型
apiVersion 2018-10-01 以降 日付
publisher Microsoft.ManagedServices string
type ApplicationHealthLinux (Linux)、ApplicationHealthWindows (Windows) string
typeHandlerVersion 1.0 string

設定

名前 値/例 データ型
protocol http または https または tcp string
port プロトコルが http または httpsの場合は省略可能、またはプロトコルが tcp の場合は必須 INT
requestPath プロトコルが http または https の場合は必須、プロトコルが tcp の場合は不可 string
intervalInSeconds 省略可能。既定値は 5 秒です。 この設定は、各正常性プローブ間の間隔です。 たとえば、intervalInSeconds == 5 の場合、プローブは 5 秒ごとにローカル アプリケーション エンドポイントに送信されます。 int
numberOfProbes 省略可能。既定値は 1 です。 この設定は、正常性状態を変更するために必要な連続プローブの数です。 たとえば、numberOfProbles == 3 の場合、正常性状態を "異常" から "正常" 状態に変更するには、3 つの連続した "正常" シグナルが必要です。 正常性状態を "異常" 状態に変更する場合も同じ要件が適用されます。 int

Rich Health States の拡張機能スキーマ

次の JSON は、Rich Health States 拡張機能のスキーマを示しています。 拡張機能には、少なくとも、それぞれにポートまたは要求パスが関連付けられている "http" または "https" 要求が必要です。 TCP プローブもサポートされていますが、プローブ応答本文で ApplicationHealthState を設定することはできず、不明 状態にはアクセスできません。

{
  "extensionProfile" : {
     "extensions" : [
      {
        "name": "HealthExtension",
        "properties": {
          "publisher": "Microsoft.ManagedServices",
          "type": "<ApplicationHealthLinux or ApplicationHealthWindows>",
          "autoUpgradeMinorVersion": true,
          "typeHandlerVersion": "2.0",
          "settings": {
            "protocol": "<protocol>",
            "port": <port>,
            "requestPath": "</requestPath>",
            "intervalInSeconds": 5,
            "numberOfProbes": 1,
            "gracePeriod": 600
          }
        }
      }
    ]
  }
} 

プロパティ値

名前 値/例 データ型
apiVersion 2018-10-01 以降 日付
publisher Microsoft.ManagedServices string
type ApplicationHealthLinux (Linux)、ApplicationHealthWindows (Windows) string
typeHandlerVersion 2.0 string

設定

名前 値/例 データ型
protocol http または https または tcp string
port プロトコルが http または httpsの場合は省略可能、またはプロトコルが tcp の場合は必須 INT
requestPath プロトコルが http または https の場合は必須、プロトコルが tcp の場合は不可 string
intervalInSeconds 省略可能。既定値は 5 秒です。 この設定は、各正常性プローブ間の間隔です。 たとえば、intervalInSeconds == 5 の場合、プローブは 5 秒ごとにローカル アプリケーション エンドポイントに送信されます。 int
numberOfProbes 省略可能。既定値は 1 です。 この設定は、正常性状態を変更するために必要な連続プローブの数です。 たとえば、numberOfProbles == 3 の場合、正常性状態を "異常" または "不明" から "正常" 状態に変更するには、3 つの連続した "正常" シグナルが必要です。 正常性状態を "異常" または "不明" 状態に変更する場合も同じ要件が適用されます。 int
gracePeriod 省略可能、既定値 = intervalInSeconds * numberOfProbes、最大猶予期間は 7200 秒です INT

アプリケーションの正常性拡張機能をデプロイする

次の例で詳しく説明するように、アプリケーションの正常性拡張機能を VM にデプロイする方法は複数あります。

Binary Health States

次の例は、Windows ベースの仮想マシンに myHealthExtension という名前のアプリケーションの正常性拡張機能を追加しています。

この例を使用して、PUT の代わりに PATCH を呼び出すことで、既存の拡張機能を Rich Health State から Binary Health に変更することもできます。

PUT on `/subscriptions/subscription_id/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM/extensions/myHealthExtension?api-version=2018-10-01`
{
  "name": "myHealthExtension",
  "location": "<location>", 
  "properties": {
    "publisher": "Microsoft.ManagedServices",
    "type": "ApplicationHealthWindows",
    "autoUpgradeMinorVersion": true,
    "typeHandlerVersion": "1.0",
    "settings": {
      "protocol": "<protocol>",
      "port": <port>,
      "requestPath": "</requestPath>"
    }
  }
}

PATCH を使用して、既にデプロイされている拡張機能を編集します。

Rich Health States

次の例は、Windows ベースの仮想マシンに アプリケーションの正常性 - Rich States 拡張機能 (名前: myHealthExtension) を追加しています。

この例を使って、PUT の代わりに PATCH を呼び出すことで、既存の拡張機能を Binary から Rich Health States にアップグレードすることもできます。

PUT on `/subscriptions/subscription_id/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM/extensions/myHealthExtension?api-version=2018-10-01`
{
  "name": "myHealthExtension",
  "location": "<location>", 
  "properties": {
    "publisher": "Microsoft.ManagedServices",
    "type": "ApplicationHealthWindows",
    "autoUpgradeMinorVersion": true,
    "typeHandlerVersion": "2.0",
    "settings": {
      "requestPath": "</requestPath>",
      "intervalInSeconds": <intervalInSeconds>,
      "numberOfProbes": <numberOfProbes>,
      "gracePeriod": <gracePeriod>
    }
  }
}

PATCH を使用して、既にデプロイされている拡張機能を編集します。

トラブルシューティング

プローブ応答の構成に関するヘルプが必要な場合

ローカル エンドポイントへの正常性プローブ応答の出力例については、アプリケーションの正常性のサンプルを参照してください。

VMHealth の表示

GET https://management.azure.com/subscriptions/{subscription-id}/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM/instanceView?api-version=2023-07-01

応答のサンプル (最新の VM 正常性状態については、"vmHealth" オブジェクトを参照)

"vmHealth": {
    "status": {
      "code": "HealthState/unknown",
      "level": "Warning",
      "displayStatus": "The VM health is unknown",
      "time": "2023-12-04T22:25:39+00:00"
    }
}

拡張機能の実行出力ログ

拡張機能の実行の出力は、次のディレクトリ内のファイルにログ記録されます。

C:\WindowsAzure\Logs\Plugins\Microsoft.ManagedServices.ApplicationHealthWindows\<version>\
/var/lib/waagent/Microsoft.ManagedServices.ApplicationHealthLinux-<extension_version>/status
/var/log/azure/applicationhealth-extension

ログには、アプリケーションの正常性状態も定期的にキャプチャされます。