Azure Windows VM 拡張機能のエラーのトラブルシューティング

Azure リソース マネージャー テンプレートの概要

Azure リソース マネージャー テンプレートでは、リソース間の依存関係を定義することで、JSON 言語で Azure IaaS インフラストラクチャを宣言によって指定できます。

拡張機能を使用するためのテンプレートの作成の詳細については、「 拡張機能テンプレートの作成 」を参照してください。

この記事では、VM 拡張機能で発生するいくつかの一般的なエラーのトラブルシューティングについて説明します。

拡張機能の状態表示

Azure リソース マネージャー テンプレートは、Azure Powershell から実行できます。 このテンプレートを実行すると、Azure Resource Explorer またはコマンド ライン ツールから拡張機能の状態を表示できます。

次に例を示します。

Azure PowerShell:

Get-AzVM -ResourceGroupName $RGName -Name $vmName -Status

出力例を次に示します。

Extensions:  {
  "ExtensionType": "Microsoft.Compute.CustomScriptExtension",
  "Name": "myCustomScriptExtension",
  "SubStatuses": [
    {
      "Code": "ComponentStatus/StdOut/succeeded",
      "DisplayStatus": "Provisioning succeeded",
      "Level": "Info",
      "Message": "    Directory: C:\\temp\\n\\n\\nMode                LastWriteTime     Length Name
          \\n----                -------------     ------ ----                              \\n-a---          9/1/2015   2:03 AM         11
          test.txt                          \\n\\n",
                  "Time": null
      },
    {
      "Code": "ComponentStatus/StdErr/succeeded",
      "DisplayStatus": "Provisioning succeeded",
      "Level": "Info",
      "Message": "",
      "Time": null
    }
  ]
}

拡張機能のエラーのトラブルシューティング

VM エージェントが実行されていて、準備完了であることを確認する

拡張機能を管理、インストール、および実行するには、VM エージェントが必要です。 VM エージェントが実行されていないか、準備完了状態を Azure プラットフォームに報告できない場合、拡張機能は正しく機能しません。

VM エージェントのトラブルシューティングについては、次のページを参照してください。

特定の拡張機能のトラブルシューティング ガイドを確認する

一部の拡張機能には、トラブルシューティングの方法を説明する特定のページがあります。 これらの拡張機能とページの一覧は、「拡張機能のトラブルシューティングを行う」で確認できます。

拡張機能の状態を表示する

上で説明したように、拡張機能の状態は、PowerShell コマンドレットを実行することで確認できます。

Get-AzVM -ResourceGroupName $RGName -Name $vmName -Status

または CLI コマンドを使用します。

az vm extension show -g <RG Name> --vm-name <VM Name>  --name <Extension Name>

または、Azure portal で、VM ブレード / 設定 / 拡張機能にアクセスします。 拡張機能をクリックして、その状態とメッセージを確認できます。

VM での拡張機能の再実行

VM でカスタム スクリプト拡張機能を使用してスクリプトを実行している場合、VM は正常に作成されたがスクリプトは失敗するというエラーが発生することがあります。 このような状況でこのエラーから回復するためにお勧めする方法は、拡張機能を削除してもう一度テンプレートを実行することです。 注:将来は、この機能が強化され、拡張機能をアンインストールする必要はなくなります。

Azure Powershell から拡張機能を削除する

Remove-AzVMExtension -ResourceGroupName $RGName -VMName $vmName -Name "myCustomScriptExtension"

拡張機能を削除した後、テンプレートを再実行して、VM 上でスクリプトを実行できます。

新しい GoalState を VM にトリガーする

拡張機能が実行されていないか、"Windows Azure CRP Certificate Generator" がないために実行できないことに気づくことがあります (この証明書は、拡張機能の保護された設定の転送をセキュリティで保護するために使用されます)。 その証明書は、仮想マシン内から Windows ゲスト エージェントを再起動することで自動的に再生成されます。

  • タスク マネージャーを開く
  • [詳細] タブに移動する
  • WindowsAzureGuestAgent.exe プロセスを見つける
  • 右クリックして [タスクの終了] を選択する。 プロセスは自動的に再起動されます

"VM の再適用" を実行して、VM に新しい GoalState をトリガーすることもできます。 VM の再適用は、2020 年に導入された API であり、VM の状態を再適用します。 VM の短時間のダウンタイムを許容できるタイミングでこれを行うことをお勧めします。 再適用自体では VM は再起動されず、また再適用を呼び出しても大抵の場合は VM が再起動されることはありませんが、再適用によって新しい目標状態がトリガーされたときに VM モデルに対する他の一部の保留中の更新が適用され、他の変更で再起動が必要になるという非常に小さなリスクがあります。

Azure portal:

ポータルで VM を選択し、左ペインの [サポート + トラブルシューティング] で、 [Redeploy + reapply](再デプロイ + 再適用) を選択し、続いて [再適用] を選択します。

Azure PowerShell (RG 名と VM 名を実際の値に置き換えてください) :

Set-AzVM -ResourceGroupName <RG Name> -Name <VM Name> -Reapply

Azure CLI (RG 名と VM 名を実際の値に置き換えてください) :

az vm reapply -g <RG Name> -n <VM Name>

"VM の再適用" が機能しなかった場合は、Azure の管理ポータルから VM に新しい空のデータ ディスクを追加し、証明書が再び追加された後でそれを削除できます。

VM 内の拡張機能ログを確認する

前の手順が機能しなかった場合、拡張機能がまだ失敗の状態である場合は、次の手順として、仮想マシン内のログを確認します。

Windows VM では、拡張機能ログは通常、次に存在します

C:\WindowsAzure\Logs\Plugins

拡張機能の設定と状態ファイルは、次に存在します

C:\Packages\Plugins

Linux VM では、拡張機能ログは通常、次に存在します

/var/log/azure/

拡張機能の設定と状態ファイルは、次に存在します

/var/lib/waagent/

拡張機能により異なりますが、通常は同様の原則に従います。

拡張機能パッケージとバイナリは VM にダウンロードされます (例: Linux の場合は "/var/lib/waagent/custom-script/download/1"、Linux の場合は "C:\Packages\Plugins\Microsoft.Compute.CustomScriptExtension\1.10.12\Downloads\0"、Windows の場合は )。

構成と設定は、VM エージェントを介して Azure Platform から拡張機能ハンドラーに渡されます (例: Linux の場合は "/var/lib/waagent/Microsoft.Azure.Extensions.CustomScript-2.1.3/config"、Windows の場合は "C:\Packages\Plugins\Microsoft.Compute.CustomScriptExtension\1.10.12\RuntimeSettings")

VM 内の拡張機能ハンドラーはステータス ファイル (例: Linux の場合は "/var/lib/waagent/Microsoft.Azure.Extensions.CustomScript-2.1.3/status/1.status"、Windows の場合は "C:\Packages\Plugins\Microsoft.Compute.CustomScriptExtension\1.10.12\Status") に書き込み、それが Azure Platform に報告されます。 この状態は、PowerShell、CLI、または Azure portal の VM の拡張機能ブレードで報告されたものです。

また、その実行の詳細なログを書きみ (例: Linux の場合は "/var/log/azure/custom-script/handler.log"、Windows の場合は "C:\WindowsAzure\Logs\Plugins\Microsoft.Compute.CustomScriptExtension\1.10.12\CustomScriptHandler.log") ます。

VM が既存の VM から再作成された場合

別の Azure VM から特殊化されたディスクに基づいて Azure VM を作成している可能性があります。 その場合、古い VM には拡張機能が含まれていた可能性があるので、バイナリ、ログ、状態ファイルが残ってしまうことになります。 新しい VM モデルでは、以前の VM の拡張機能の状態は認識されません。また、これらの拡張機能の状態が正しくないと報告される可能性があります。 新しい VM を作成する前に、古い VM から拡張機能を削除し、新しい VM の作成後にこれらの拡張機能を再インストールすることを強くお勧めします。 同じことが、既存の Azure VM から汎用化イメージを作成するときに発生する可能性があります。 拡張機能から整合性のない状態を回避するために、拡張機能を削除することをお勧めします。

既知の問題

PowerShell が内部または外部のコマンドとして認識されない

RunCommand 拡張機能の出力には、次のエラー エントリが表示されます。

RunCommandExtension failed with "'powershell' isn't recognized as an internal or external command,"

分析

拡張機能はローカル システム アカウントで実行されるため、VM に RDP 接続すると powershell.exe が正常に動作するが、RunCommand で実行すると失敗する可能性が非常に高くなります。

ソリューション

  • PowerShell が PATH 環境変数に適切に表示されていることを確認します。
    • コントロール パネルを開く
    • システムとセキュリティ
    • システム
    • [詳細設定] タブ -> [環境変数]
  • [システム変数] の [編集] をクリックし、PowerShell が PATH 環境変数にあることを確認します (通常は "C:\Windows\System32\WindowsPowerShell\v1.0")
  • VM を再起動するか、WindowsAzureGuestAgent サービスを再起動してから、Run Command をもう一度試します。

コマンドが内部または外部のコマンドとして認識されない

C:\WindowsAzure\Logs\Plugins<ExtensionName><Version>\CommandExecution.log ファイルに次の内容が表示されます。

Execution Error: '<command>' isn't recognized as an internal or external command, operable program or batch file.

分析

拡張機能はローカル システム アカウントで実行されるため、VM に RDP 接続すると powershell.exe が正常に動作するが、RunCommand で実行すると失敗する可能性が非常に高くなります。

ソリューション

  • VM でコマンド プロンプトを開き、コマンドを実行してエラーを再現します。 VM エージェントで管理者の cmd.exe が使用されていて、cmd が起動されるたびに構成済みのコマンドが実行されている可能性があります。
  • PATH 変数が正しく構成されていない可能性もありますが、これは問題が発生しているコマンドによって異なります。

VMAccessAgent で、"管理者アカウントのリモート デスクトップ接続設定を更新できません。 エラー: System.Runtime.InteropServices.COMException (0x800706D9): エンドポイント マッパーから取得可能なエンドポイントはこれ以上ありません" というエラーが発生する

拡張機能の状態に次の内容が表示されます。

Type Microsoft.Compute.VMAccessAgent
Version 2.4.8
Status Provisioning failed
Status level Error
Status message Cannot update Remote Desktop Connection settings for Administrator account. Error: System.Runtime.InteropServices.COMException (0x800706D9): There are no more endpoints available from the endpoint mapper. (Exception from HRESULT: 0x800706D9) at NetFwTypeLib.INetFwRules.GetEnumerator() at 
Microsoft.WindowsAzure.GuestAgent.Plugins.JsonExtensions.VMAccess.RemoteDesktopManager.EnableRemoteDesktopFirewallRules() 
at Microsoft.WindowsAzure.GuestAgent.Plugins.JsonExtensions.VMAccess.RemoteDesktopManager.EnableRemoteDesktop() at

分析

このエラーは、Windows ファイアウォール サービスが実行されていない場合に発生する可能性があります。

ソリューション

Windows ファイアウォール サービスが有効にされていて実行中であるかどうかを確認します。 そうでない場合は、有効にして起動してから、VMAccessAgent の実行を再度試みてください。

検証プロシージャによると、リモート証明書が無効である

WaAppAgent.log に次の内容が表示されます

System.Net.WebException: The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel. ---> System.Security.
Authentication.AuthenticationException: The remote certificate is invalid according to the validation procedure.

分析

"信頼されたルート証明機関" の Baltimore CyberTrust Root 証明書が VM に存在しない可能性があります。

ソリューション

certmgr.msc を使用して証明書コンソールを開き、証明書が存在するかどうかを確認します。

もう 1 つの考えられる問題は、ZScaler などのサード パーティの SSL 検査ツールによって証明書チェーンが破損していることです。 この種のツールは、SSL 検査をバイパスするように構成する必要があります。