Virtual Machine Scale Sets でアプリケーションの正常性拡張機能を使用する

お使いのアプリケーションの正常性の監視は、ご自身のデプロイを管理およびアップグレードするための重要なシグナルです。 Azure 仮想マシン スケール セットでは、OS イメージの自動アップグレードVM ゲストの自動パッチ適用などのローリング アップグレードがサポートされ、個々のインスタンスの正常性を監視することで、ご自身のデプロイをアップグレードします。 また、アプリケーション正常性拡張機能を使用して、スケールセット内にある各インスタンスのアプリケーションの正常性を監視し、自動インスタンス修復を使用して、インスタンスの修復を実行することもできます。

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

前提条件

この記事では、次の内容を熟知していることを前提としています。

注意事項

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

Note

仮想マシン スケール セットに使用できる正常性監視のソースは、アプリケーション正常性拡張機能または正常性プローブのいずれかのみです。 両方のオプションを有効にしている場合は、インスタンス修復や OS の自動アップグレードなどのオーケストレーション サービスを使用する前に、いずれかのオプションを削除する必要があります。

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

Application Health 拡張機能は、Virtual Machine Scale Set のインスタンス内にデプロイされ、スケール セット インスタンス内からアプリケーションの正常性について報告します。 この拡張機能は、ローカル アプリケーション エンドポイントに対してプローブを実行し、アプリケーションから受信した TCP/HTTP(S) 応答に基づいて正常性状態を更新します。 Azure は、この正常性状態を使って、異常なインスタンスの修復を開始し、インスタンスがアップグレード操作の対象であるかどうかを判断します。

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

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 に対して値が指定されていないか、指定された値が無効であるとき
  • 猶予期間が切れたとき

"不明" 状態のインスタンスは、"異常" インスタンスと同様に扱われます。 有効にした場合、"不明" インスタンスではインスタンスの修復は実行されますが、ローリング アップグレードはインスタンスが "正常" 状態に戻るまで一時停止されます。

次の表は、ローリング アップグレードインスタンス修復での正常性状態の解釈を示したものです。

正常性の状態 ローリング アップグレードの解釈 インスタンス修復トリガー
初期化中 状態が "正常"、"異常"、または "不明" になるのを待ちます いいえ
Healthy Healthy いいえ
異常 異常 はい
Unknown 異常 はい

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 date
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 date
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

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

次の例で詳しく説明するように、Application Health 拡張機能をスケール セットにデプロイする方法は複数あります。

Binary Health States

次の例は、Windows ベースのスケール セットのスケール セット モデルで extensionProfile に (myHealthExtension という名前の) アプリケーションの正常性拡張機能を追加しています。

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

PUT on `/subscriptions/subscription_id/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myScaleSet/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 を使用して、既にデプロイされている拡張機能を編集します。

VM をアップグレードして拡張機能をインストールします。

POST on `/subscriptions/<subscriptionId>/resourceGroups/<myResourceGroup>/providers/Microsoft.Compute/virtualMachineScaleSets/< myScaleSet >/manualupgrade?api-version=2022-08-01`
{
  "instanceIds": ["*"]
}

Rich Health States

次の例では、Windows ベースのスケール セットのスケール セット モデルの extensionProfile に、Application Health - Rich States 拡張機能を (myHealthExtension という名前で) 追加しています。

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

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

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

VM をアップグレードして拡張機能をインストールします。

POST on `/subscriptions/<subscriptionId>/resourceGroups/<myResourceGroup>/providers/Microsoft.Compute/virtualMachineScaleSets/< myScaleSet >/manualupgrade?api-version=2022-08-01`
{
  "instanceIds": ["*"]
}

トラブルシューティング

VMHealth の表示 - 単一インスタンス

Get-AzVmssVM 
  -InstanceView `
  -ResourceGroupName <rgName> `
  -VMScaleSetName <vmssName> `
  -InstanceId <instanceId> 

VMHealth の表示 – バッチ呼び出し

これは、均一オーケストレーションを使う Virtual Machine Scale Sets に対してのみ使用できます。

GET on `/subscriptions/<subscriptionID>/resourceGroups/<resourceGroupName>/providers/Microsoft.Compute/virtualMachineScaleSets/<vmssName>/virtualMachines/?api-version=2022-03-01&$expand=instanceview`

正常性状態が表示されない

正常性状態が Azure portal または GET 呼び出しで表示されない場合は、VM が最新のモデルにアップグレードされていることを確認します。 VM が最新のモデルでない場合は、VM をアップグレードすると、正常性状態が表示されます。

拡張機能の実行出力ログ

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

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

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

次のステップ

Virtual Machine Scale Sets に自分のアプリケーションをデプロイする方法を学習します。