Azure Windows VM 확장 오류 문제 해결

Azure 리소스 관리자 템플릿 개요

Azure Resource Manager 템플릿을 사용하면 JSON 언어에서 리소스 간의 종속성을 정의하여 Azure IaaS 인프라를 선언적으로 지정할 수 있습니다.

확장 템플릿 작성 을 참조하여 확장을 사용하기 위한 템플릿을 작성하는 방법을 자세히 알아봅니다.

이 문서에서는 일반적인 VM 확장 오류 중 일부를 해결하는 방법에 대 알아봅니다.

확장 상태 보기

Azure Powershell에서 Azure Resource Manager 템플릿을 실행할 수 있습니다. 템플릿을 실행하면 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 cmdlet을 실행하거나,

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에서 스크립트를 실행할 수 있습니다.

VM에 새 GoalState 트리거

"Windows Azure CRP 인증서 생성기"가 누락되어 확장이 실행되지 않았거나 실행에 실패하는 것을 알 수 있습니다(해당 인증서는 확장의 보호된 설정 전송을 보호하는 데 사용됨). 해당 인증서는 Virtual Machine 내에서 Windows 게스트 에이전트를 다시 시작하여 자동으로 다시 생성됩니다.

  • 태스크 관리자 열기
  • 세부 정보 탭으로 이동
  • WindowsAzureGuestAgent.exe 프로세스 찾기
  • 마우스 오른쪽 단추로 클릭하고 "작업 종료"를 선택합니다. 프로세스는 자동으로 다시 시작됩니다.

"VM 다시 적용"을 실행하여 새 GoalState를 VM에 트리거할 수도 있습니다. VM 다시 적용은 VM 상태를 다시 적용하기 위해 2020년에 도입된 API입니다. 짧은 VM 가동 중지 시간을 허용하려면 이 작업을 한 번에 수행하는 것이 좋습니다. 다시 적용 자체는 VM 다시 부팅을 발생시키지 않으며, 다시 적용을 호출하는 대부분의 경우 VM을 다시 부팅하지 않지만, 다시 적용에서 새 목표 상태를 트리거할 때 보류 중인 다른 업데이트가 VM 모델에 적용되고 다른 변경에서 다시 시작해야 할 수 있는 위험이 매우 적습니다.

Azure 포털:

포털에서 VM을 선택하고 왼쪽 창의 지원 + 문제 해결 아래에서 다시 배포 + 다시 적용을 선택한 다음, 다시 적용을 선택합니다.

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" 또는 Windows의 경우 "C:\Packages\Plugins\Microsoft. Compute.CustomScriptExtension\1.10.12\Downloads\0").

해당 구성 및 설정은 Azure Platform에서 VM 에이전트를 통해 확장 처리기로 전달됩니다(예: 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 플랫폼에 보고됩니다. 이 상태는 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,"

분석

확장은 로컬 시스템 계정에서 실행되므로 RDP를 VM에 사용하면 powershell.exe가 제대로 작동하지만 RunCommand를 사용하여 실행하면 실패할 가능성이 매우 높습니다.

솔루션

  • PowerShell이 ​​PATH 환경 변수에 제대로 나열되어 있는지 확인합니다.
    • 제어판 열기
    • 시스템 및 보안
    • 시스템
    • 고급 탭 -> 환경 변수
  • '시스템 변수' 아래에서 편집을 클릭하고, PowerShell이 ​​PATH 환경 변수(일반적으로: "C:\Windows\System32\WindowsPowerShell\v1.0")에 있는지 확인합니다.
  • VM을 다시 부팅하거나 WindowsAzureGuestAgent 서비스를 다시 시작한 다음, RunCommand를 다시 시도합니다.

명령이 내부 또는 외부 명령으로 인식되지 않음

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.

분석

확장은 로컬 시스템 계정에서 실행되므로 RDP를 VM에 사용하면 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.

분석

VM에 "신뢰할 수 있는 루트 인증 기관"의 Baltimore CyberTrust Root 인증서가 없을 수 있습니다.

솔루션

certmgr.msc를 사용하여 인증서 콘솔을 열고 인증서가 있는지 확인합니다.

또 다른 가능한 문제는 인증서 체인이 ZScaler와 같은 타사 SSL 검사 도구로 손상되었다는 것입니다. 이러한 종류의 도구는 SSL 검사를 무시하도록 구성해야 합니다.