Linux용 가상 머신 확장 및 기능

Azure VM(가상 머신) 확장은 Azure VM에서 배포 후 구성 및 자동화 태스크를 제공하는 작은 애플리케이션입니다. 예를 들어 가상 머신에 소프트웨어 설치, 바이러스 백신 보호 또는 스크립트 내부 실행이 필요한 경우 VM 확장을 사용할 수 있습니다.

Azure CLI, PowerShell, ARM 템플릿(Azure Resource Manager 템플릿) 및 Azure Portal을 사용하여 Azure VM 확장을 실행할 수 있습니다. 확장을 새 VM 배포와 함께 번들로 묶거나 기존 시스템에 대해 실행할 수 있습니다.

이 문서에서는 Azure VM 확장에 대한 개요, 사용을 위한 사전 요구 사항, 이러한 확장을 검색, 관리 및 제거하는 방법에 대한 지침을 제공합니다. 많은 VM 확장을 사용할 수 있으므로 이 문서에서는 일반화된 정보를 제공합니다. 각각에는 잠재적으로 고유한 구성 및 자체 설명서가 있습니다.

사용 사례 및 샘플

각 Azure VM 확장에는 특정 사용 사례가 있습니다. 예를 들면 다음과 같습니다.

프로세스 관련 확장 외에도 Windows 및 Linux 가상 머신에 대해 사용자 지정 스크립트 확장을 사용할 수 있습니다. Linux용 사용자 지정 스크립트 확장을 사용하면 Bash 스크립트를 VM에서 실행할 수 있습니다. 사용자 지정 스크립트는 네이티브 Azure 도구로 제공할 수 있는 것 이상의 구성이 필요한 Azure 배포를 디자인할 때 유용합니다.

필수 조건

Azure Linux 에이전트

VM에서 확장을 처리하려면 Azure Linux 에이전트가 설치되어 있어야 합니다. 일부 개별 확장에는 리소스에 대한 액세스 권한 또는 종속성 같은 필수 구성 요소가 있습니다.

Azure VM 에이전트는 Azure VM과 Azure 패브릭 컨트롤러 간의 상호 작용을 관리합니다. 에이전트는 VM 확장 실행을 포함하여 Azure VM 배포 및 관리의 다양한 기능적 측면을 담당합니다.

Azure Linux 에이전트는 Azure Marketplace 이미지에 사전 설치됩니다. 지원되는 운영 체제에 수동으로 설치할 수도 있습니다.

에이전트는 여러 운영 체제에서 실행됩니다. 그러나 확장 프레임워크에는 확장에서 사용하는 운영 체제에 대한 제한이 있습니다. 일부 확장은 모든 운영 체제에서 지원되지 않으며, 51 오류 코드("지원되지 않는 OS")를 내보낼 수 있습니다. 지원 가능성에 대한 개별 확장 설명서를 확인합니다.

네트워크 액세스

확장 패키지는 Azure Storage 확장 리포지토리에서 다운로드합니다. 확장 상태 업로드는 Azure Storage에 게시됩니다.

지원되는 버전의 Azure Linux 에이전트를 사용하는 경우 VM 지역의 Azure Storage 대한 액세스를 허용할 필요가 없습니다. 에이전트 통신을 위해 에이전트를 사용하여 통신을 Azure 패브릭 컨트롤러로 리디렉션할 수 있습니다. 지원되지 않는 버전의 에이전트을 사용하는 경우 VM의 해당 지역에서 Azure Storage에 대한 아웃바운드 액세스 권한을 허용해야 합니다.

Important

게스트 방화벽을 사용하여 168.63.129.16 개인 IP 주소에 대한 액세스를 차단한 경우 지원되는 버전의 에이전트를 사용하거나 아웃바운드 액세스를 구성한 경우에도 확장이 실패합니다.

에이전트는 확장 패키지 및 보고 상태를 다운로드하는 데 사용할 수 있습니다. 예를 들어 확장을 설치할 때 GitHub에서 스크립트(사용자 지정 스크립트 확장)를 다운로드해야 하거나 Azure Storage(Azure Backup)에 대한 액세스 권한이 필요한 경우 추가 방화벽 또는 NSG(네트워크 보안 그룹) 포트를 열어야 합니다. 확장마다 고유한 애플리케이션이므로 요구 사항이 다릅니다. Azure Storage에 대한 액세스 권한이 필요한 확장의 경우 Azure NSG 서비스 태그를 사용하여 액세스를 허용할 수 있습니다.

에이전트 트래픽 요청을 리디렉션하기 위해 Azure Linux 에이전트에서 프록시 서버를 지원합니다. 단, 이 프록시 서버 지원은 확장을 적용하지 않습니다. 프록시로 작동하려면 각 개별 확장을 구성해야 합니다.

VM 확장 검색

Azure VM에서 다양한 VM 확장을 사용할 수 있습니다. 전체 목록을 보려면 az vm extension image list를 사용합니다. 다음 예제에서는 westus 위치의 모든 사용 가능한 확장을 나열합니다.

az vm extension image list --location westus --output table

VM 확장 실행

Azure VM 확장은 기존 VM에서 실행됩니다. 이는 이미 배포된 VM에서 구성을 변경하거나 연결을 복구해야 하는 경우에 유용합니다. 또한 VM 확장은 ARM 템플릿 배포와 함께 번들로 제공할 수 있습니다. ARM 템플릿에서 확장을 사용하면 배포 후 개입 없이 Azure VM을 배포하고 구성할 수 있습니다.

다음 방법을 사용하여 기존 VM에 대해 확장을 실행할 수 있습니다.

Azure CLI

az vm extension set 명령을 사용하여 기존 VM에 대해 Azure VM 확장을 실행할 수 있습니다. 다음 예에서는 myResourceGroup이라는 리소스 그룹의 myVM이라는 VM에 대해 사용자 지정 스크립트 확장을 실행합니다. 예제 리소스 그룹 이름, VM 이름 및 실행할 스크립트(https:https://raw.githubusercontent.com/me/project/hello.sh)를 사용자 고유의 정보로 바꿉니다.

az vm extension set \
  --resource-group myResourceGroup \
  --vm-name myVM \
  --name customScript \
  --publisher Microsoft.Azure.Extensions \
  --settings '{"fileUris": ["https://raw.githubusercontent.com/me/project/hello.sh"],"commandToExecute": "./hello.sh"}'

확장이 올바르게 실행되면 다음 예제와 비슷하게 출력됩니다.

info:    Executing command vm extension set
+ Looking up the VM "myVM"
+ Installing extension "CustomScript", VM: "mvVM"
info:    vm extension set command OK

Azure PowerShell

Set-AzVMExtension 명령을 사용하여 기존 VM에 대해 Azure VM 확장을 실행할 수 있습니다. 다음 예에서는 myResourceGroup이라는 리소스 그룹의 myVM이라는 VM에 대해 사용자 지정 스크립트 확장을 실행합니다. 예제 리소스 그룹 이름, VM 이름 및 실행할 스크립트(https:https://raw.githubusercontent.com/me/project/hello.sh)를 사용자 고유의 정보로 바꿉니다.

$Params = @{
    ResourceGroupName  = 'myResourceGroup'
    VMName             = 'myVM'
    Name               = 'CustomScript'
    Publisher          = 'Microsoft.Azure.Extensions'
    ExtensionType      = 'CustomScript'
    TypeHandlerVersion = '2.1'
    Settings          = @{fileUris = @('https://raw.githubusercontent.com/me/project/hello.sh'); commandToExecute = './hello.sh'}
}
Set-AzVMExtension @Params

확장이 올바르게 실행되면 다음 예제와 비슷하게 출력됩니다.

RequestId IsSuccessStatusCode StatusCode ReasonPhrase
--------- ------------------- ---------- ------------
                         True         OK OK

Azure Portal

Azure Portal을 통해 VM 확장을 기존 VM에 적용할 수 있습니다. 포털에서 VM을 선택하고 확장을 선택한 다음, 추가를 선택합니다. 사용 가능한 확장 목록에서 원하는 확장을 선택하고, 마법사의 지시를 따릅니다.

다음 이미지에서는 Azure Portal에서 Linux 사용자 지정 스크립트 확장의 설치를 보여 줍니다.

Screenshot of the dialog for installing the Custom Script extension for Linux.

Azure 리소스 관리자 템플릿

VM 확장을 ARM 템플릿에 추가하고 템플릿 배포를 사용하여 실행할 수 있습니다. 템플릿을 사용하여 확장을 배포할 때 완전히 구성된 Azure 배포를 만들 수 있습니다.

예를 들어 다음 JSON은 부하 분산된 VM 세트 및 Azure SQL 데이터베이스를 배포한 다음, 각 VM에 .NET Core 애플리케이션을 설치하는 전체 ARM 템플릿에서 가져옵니다. VM 확장은 소프트웨어 설치를 관리합니다.

{
    "apiVersion": "2015-06-15",
    "type": "extensions",
    "name": "config-app",
    "location": "[resourceGroup().location]",
    "dependsOn": [
    "[concat('Microsoft.Compute/virtualMachines/', concat(variables('vmName'),copyindex()))]"
    ],
    "tags": {
    "displayName": "config-app"
    },
    "properties": {
    "publisher": "Microsoft.Azure.Extensions",
    "type": "CustomScript",
    "typeHandlerVersion": "2.1",
    "autoUpgradeMinorVersion": true,
    "settings": {
        "fileUris": [
        "https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-linux/scripts/config-music.sh"
        ]
    },
    "protectedSettings": {
        "commandToExecute": "[concat('sudo sh config-music.sh ',variables('musicStoreSqlName'), ' ', parameters('adminUsername'), ' ', parameters('sqlAdminPassword'))]"
    }
    }
}

ARM 템플릿을 만드는 방법에 대한 자세한 내용은 Azure Resource Manager 템플릿의 가상 머신을 참조하세요.

VM 확장 데이터 보호 지원

VM 확장을 실행하는 경우 자격 증명, 스토리지 계정 이름 및 액세스 키와 같은 중요한 정보를 포함해야 할 수도 있습니다. 많은 VM 확장에는 데이터를 암호화하고 대상 VM 내에서만 해독하는 보호된 구성이 포함되어 있습니다. 각 확장에는 보호되는 특정 구성 스키마가 있으며 각각은 확장 관련 설명서에 자세히 나와 있습니다.

다음 예제에서는 Linux용 사용자 지정 스크립트 확장의 인스턴스를 보여 줍니다. 실행할 명령에는 자격 증명 세트가 포함됩니다. 다음 예제에서는 실행할 명령이 암호화되지 않습니다.

{
  "apiVersion": "2015-06-15",
  "type": "extensions",
  "name": "config-app",
  "location": "[resourceGroup().location]",
  "dependsOn": [
    "[concat('Microsoft.Compute/virtualMachines/', concat(variables('vmName'),copyindex()))]"
  ],
  "tags": {
    "displayName": "config-app"
  },
  "properties": {
    "publisher": "Microsoft.Azure.Extensions",
    "type": "CustomScript",
    "typeHandlerVersion": "2.1",
    "autoUpgradeMinorVersion": true,
    "settings": {
      "fileUris": [
        "https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-linux/scripts/config-music.sh"
      ],
      "commandToExecute": "[concat('sudo sh config-music.sh ',variables('musicStoreSqlName'), ' ', parameters('adminUsername'), ' ', parameters('sqlAdminPassword'))]"
    }
  }
}

commandToExecute 속성을 protected 구성으로 이동하면 다음 예제와 같이 실행 문자열을 보호하는 데 도움이 됩니다.

{
  "apiVersion": "2015-06-15",
  "type": "extensions",
  "name": "config-app",
  "location": "[resourceGroup().location]",
  "dependsOn": [
    "[concat('Microsoft.Compute/virtualMachines/', concat(variables('vmName'),copyindex()))]"
  ],
  "tags": {
    "displayName": "config-app"
  },
  "properties": {
    "publisher": "Microsoft.Azure.Extensions",
    "type": "CustomScript",
    "typeHandlerVersion": "2.1",
    "autoUpgradeMinorVersion": true,
    "settings": {
      "fileUris": [
        "https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-linux/scripts/config-music.sh"
      ]
    },
    "protectedSettings": {
      "commandToExecute": "[concat('sudo sh config-music.sh ',variables('musicStoreSqlName'), ' ', parameters('adminUsername'), ' ', parameters('sqlAdminPassword'))]"
    }
  }
}

에이전트 및 확장을 업데이트하는 방법

에이전트와 확장은 동일한 자동 업데이트 메커니즘을 공유합니다.

업데이트를 사용할 수 있고 자동 업데이트를 사용하도록 설정하면 확장이 변경되거나 다음과 같은 다른 VM 모델이 변경된 경우에만 업데이트가 VM에 설치됩니다.

  • 데이터 디스크
  • 확장
  • 확장 태그
  • 부팅 진단 컨테이너
  • 게스트 OS 암호
  • VM 크기
  • 네트워크 프로필

게시자는 업데이트를 다양한 시간에 지역에 제공하므로 다른 버전의 VM이 다른 지역에 있을 수 있습니다.

참고 항목

일부 업데이트에는 추가 방화벽 규칙이 필요할 수 있습니다. 네트워크 액세스를 참조하세요.

에이전트 업데이트

Linux VM 에이전트에는 프로비전 에이전트 코드확장 처리 코드가 하나의 패키지에 포함되어 있습니다. 이러한 코드는 분리할 수 없습니다.

cloud-init를 사용하여 Azure에서 프로비전하려는 경우 프로비전 에이전트를 사용하지 않도록 설정할 수 있습니다.

지원되는 에이전트 버전은 자동 업데이트를 사용할 수 있습니다. 업데이트할 수 있는 유일한 코드는 프로비전 에이전트 코드가 아니라 확장 처리 코드입니다. 프로비저닝 에이전트 코드는 한 번 실행 코드입니다.

확장 처리 코드에서 담당하는 작업은 다음과 같습니다.

  • Azure 패브릭과 통신
  • VM 확장 작업 처리(예: 설치, 상태 보고, 개별 확장 업데이트 및 확장 제거) 업데이트에는 보안 수정, 버그 수정 및 향상된 확장 처리 코드 기능이 포함됩니다.

에이전트가 설치되면 부모 디먼이 생성됩니다. 그런 다음, 이 부모는 확장을 처리하는 데 사용되는 자식 프로세스를 생성합니다. 업데이트를 에이전트에 사용할 수 있는 경우 해당 업데이트가 다운로드됩니다. 부모는 자식 프로세스를 중지하고, 업그레이드한 다음, 다시 시작합니다. 업데이트에 문제가 있으면 부모 프로세스가 이전 자식 버전으로 롤백합니다.

부모 프로세스는 자동으로 업데이트할 수 없습니다. 부모는 배포 패키지 업데이트에서만 업데이트할 수 있습니다.

실행되는 버전을 확인하려면 다음과 같이 waagent를 확인합니다.

waagent --version

다음 예제와 유사하게 출력됩니다.

WALinuxAgent-2.2.45 running on <Linux Distro>
Python: 3.6.9
Goal state agent: 2.7.1.0

위의 예제 출력에서 부모(또는 패키지 배포 버전)는 WALinuxAgent-2.2.45입니다. Goal state agent 값은 자동 업데이트 버전입니다.

항상 에이전트에 대한 자동 업데이트를 사용하도록 설정하는 것이 좋습니다(AutoUpdate.Enabled=y). 자동 업데이트를 사용하도록 설정하지 않으면 에이전트를 계속 수동으로 업데이트해야 하며 버그 및 보안 수정을 받을 수 없습니다.

확장 업데이트

확장 업데이트를 사용할 수 있고 자동 업데이트를 사용하도록 설정한 경우 VM 모델이 변경되면 Azure Linux 에이전트에서 확장을 다운로드하고 업그레이드합니다.

자동 확장 업데이트는 부 버전 또는 핫픽스 중 하나입니다. 확장을 프로비전할 때 부 버전 업데이트를 옵트인하거나 옵트아웃할 수 있습니다. 다음 예제에서는 "autoUpgradeMinorVersion": true,를 사용하여 ARM 템플릿에서 부 버전을 자동으로 업그레이드하는 방법을 보여 줍니다.

    "publisher": "Microsoft.Azure.Extensions",
    "type": "CustomScript",
    "typeHandlerVersion": "2.1",
    "autoUpgradeMinorVersion": true,
    "settings": {
        "fileUris": [
        "https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-linux/scripts/config-music.sh"
        ]
    },

최신 부 릴리스 버그 수정을 받으려면 항상 확장 배포에서 자동 업데이트를 선택하는 것이 좋습니다. 보안 또는 주요 버그 수정이 포함된 핫픽스 업데이트는 옵트아웃할 수 없습니다.

자동 업데이트를 사용하지 않도록 설정하거나 주 버전을 업그레이드해야 하는 경우 az vm extension set 또는 Set-AzVMExtension을 사용하고 대상 버전을 지정합니다.

확장 업데이트를 식별하는 방법

확장이 VM에서 autoUpgradeMinorVersion을 사용하여 설정되었는지 확인

VM 모델에서 확장이 autoUpgradeMinorVersion을 사용하여 프로비전되었는지 확인할 수 있습니다. 확인하려면 az vm show를 사용하고 다음과 같이 리소스 그룹 및 VM 이름을 제공합니다.

az vm show --resource-group myResourceGroup --name myVM

다음 예제 출력에서는 autoUpgradeMinorVersiontrue로 설정되어 있음을 보여 줍니다.

  "resources": [
    {
      "autoUpgradeMinorVersion": true,
      "forceUpdateTag": null,
      "id": "/subscriptions/guid/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM/extensions/customScript",

autoUpgradeMinorVersion 이벤트가 발생한 경우 확인

확장에 대한 업데이트가 발생한 경우를 확인하려면 /var/log/waagent.log에서 VM의 에이전트 로그를 검토합니다.

다음 예제에서 VM에는 Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9025가 설치되었습니다. 핫픽스는 Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027에 사용할 수 있었습니다.

INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Expected handler state: enabled
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Decide which version to use
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Use version: 2.3.9027
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Current handler state is: NotInstalled
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Download extension package
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Unpack extension package
INFO Event: name=Microsoft.OSTCExtensions.LinuxDiagnostic, op=Download, message=Download succeeded
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Initialize extension directory
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Update settings file: 0.settings
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9025] Disable extension.
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9025] Launch command:diagnostic.py -disable
...
INFO Event: name=Microsoft.OSTCExtensions.LinuxDiagnostic, op=Disable, message=Launch command succeeded: diagnostic.py -disable
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Update extension.
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Launch command:diagnostic.py -update
2017/08/14 20:21:57 LinuxAzureDiagnostic started to handle.

에이전트 사용 권한

해당 작업을 수행하려면 에이전트는 루트로 실행해야 합니다.

VM 확장 문제 해결

각 VM 확장에는 특정 문제 해결 단계가 있을 수 있습니다. 예를 들어 사용자 지정 스크립트 확장을 사용하는 경우 확장이 실행된 VM에서 로컬로 스크립트 실행 세부 정보를 확인할 수 있습니다.

모든 VM 확장에 적용되는 문제 해결 단계는 다음과 같습니다.

  • Azure Linux 에이전트 로그를 확인하려면 /var/log/waagent.log에서 확장이 프로비전되었을 때의 작업을 확인합니다.

  • /var/log/azure/<extensionName>에서 확장 로그의 자세한 내용을 확인합니다.

  • 오류 코드, 알려진 문제 및 기타 확장 관련 정보는 확장 관련 설명서의 문제 해결 섹션을 확인합니다.

  • 시스템 로그를 확인합니다. 패키지 관리자에 대한 단독 액세스가 필요한 다른 애플리케이션의 장기 실행 설치와 같이 확장을 방해했을 수 있는 다른 작업을 확인합니다.

확장 오류에 대한 일반적인 이유

  • 확장의 실행 시간은 20분입니다. (단, 사용자 지정 스크립트, Chef 및 DSC는 90분입니다.) 배포가 이 시간을 초과하는 경우 시간 제한으로 표시됩니다. 이는 리소스가 부족한 VM이거나 확장에서 프로비전을 시도하는 동안 다른 VM 구성 또는 시작 작업에서 많은 양의 리소스를 사용하기 때문일 수 있습니다.

  • 최소 필수 조건이 충족되지 않습니다. 일부 확장은 HPC 이미지와 같은 VM SKU에 대해 종속됩니다. 확장에는 Azure Storage 또는 공용 서비스와의 통신과 같은 특정 네트워킹 액세스 요구 사항이 있을 수 있습니다. 다른 예로 패키지 리포지토리에 대한 액세스, 디스크 공간 부족 또는 보안 제한이 있을 수 있습니다.

  • 패키지 관리자 액세스는 배타적입니다. 경우에 따라 장기 실행 VM 구성 및 확장 설치는 모두 패키지 관리자에 대한 단독 액세스가 필요하므로 충돌할 수 있습니다.

확장 상태 보기

VM 확장이 VM에 대해 실행된 후에 다음과 같이 az vm get-instance-view를 사용하여 확장 상태를 반환합니다.

az vm get-instance-view \
    --resource-group myResourceGroup \
    --name myVM \
    --query "instanceView.extensions"

다음 예제와 유사하게 출력됩니다.

  {
    "name": "customScript",
    "statuses": [
      {
        "code": "ProvisioningState/failed/0",
        "displayStatus": "Provisioning failed",
        "level": "Error",
        "message": "Enable failed: failed to execute command: command terminated with exit status=127\n[stdout]\n\n[stderr]\n/bin/sh: 1: ech: not found\n",
        "time": null
      }
    ],
    "substatuses": null,
    "type": "Microsoft.Azure.Extensions.CustomScript",
    "typeHandlerVersion": "2.1.6"
  }

또한 확장 실행 상태는 Azure Portal에서도 확인할 수 있습니다. VM을 선택하고, 확장을 선택한 다음, 원하는 확장을 선택합니다.

VM 확장 다시 실행

VM 확장을 다시 실행해야 하는 경우가 있을 수 있습니다. 확장을 다시 실행하려면 확장을 제거한 다음 원하는 실행 방법으로 확장을 다시 실행하면 됩니다.

확장을 제거하려면 다음과 같이 az vm extension delete를 사용합니다.

az vm extension delete \
    --resource-group myResourceGroup \
    --vm-name myVM \
    --name customScript

또한 확장은 다음과 같이 Azure Portal에서도 제거할 수 있습니다.

  1. VM을 선택합니다.
  2. 확장을 섡택합니다.
  3. 해당 확장을 선택합니다.
  4. 제거를 선택합니다.

일반적인 VM 확장 참조

확장 이름 설명
Linux용 사용자 지정 스크립트 확장 Azure 가상 머신에 대해 스크립트를 실행합니다.
VMAccess 확장 Azure 가상 머신에 대한 액세스 권한을 다시 얻습니다. 또한 이를 사용하여 사용자 및 자격 증명을 관리할 수 있습니다.
Azure Diagnostics 확장 Azure Diagnostics를 관리합니다.

다음 단계

VM 확장에 대한 자세한 내용은 Azure Virtual Machine 확장 및 기능을 참조하세요.