Azure CLI 및 Python을 사용하여 Azure Stack Edge Pro GPU 디바이스에 VM 배포
적용 대상: Azure Stack Edge Pro - GPUAzure Stack Edge Pro 2Azure Stack Edge Pro RAzure Stack Edge Mini R
API를 사용하여 Azure Stack Edge 디바이스에서 VM(가상 머신)을 만들고 관리할 수 있습니다. 이러한 API는 로컬 Azure Stack Edge 엔드포인트를 사용하여 호출되는 표준 Azure Resource Manager API입니다. Azure Resource Manager API는 일관된 관리 계층을 제공하며, 이 경우 디바이스에 있는 로컬 구독에서 VM을 생성, 업데이트 및 삭제할 수 있습니다. Azure PowerShell cmdlet을 통해 Azure Stack Edge에서 실행되는 Azure Resource Manager에 연결할 수 있습니다.
이 자습서에서는 Python 및 Azure API를 사용하여 Azure Stack Edge Pro 디바이스에서 VM을 만들고 관리하는 방법을 설명합니다.
VM 배포 워크플로
다음 다이어그램에 배포 워크플로가 나와 있습니다.
배포 워크플로에 대한 개략적인 요약은 다음과 같습니다.
- Azure Resource Manager에 연결
- 리소스 그룹 만들기
- 저장소 계정 만들기
- 호스트 파일에 Blob URI 추가
- 인증서 설치
- VHD 업로드
- VHD에서 관리 디스크 만들기
- 이미지 관리 디스크에서 VM 이미지 만들기
- 이전에 만든 리소스로 VM 만들기
- VNet 만들기
- VNet 서브넷 ID를 사용하여 VNIC 만들기
워크플로 다이어그램에 대한 자세한 설명은 Azure PowerShell을 사용하여 Azure Stack Edge Pro 디바이스에 VM 배포를 참조하세요. Azure Resource Manager에 연결하는 방법에 대한 자세한 내용은 Azure PowerShell을 사용하여 Azure Resource Manager에 연결을 참조하세요.
필수 조건
Azure CLI와 Python을 사용하여 Azure Stack Edge Pro 디바이스에서 VM 만들기 및 관리를 시작하기 전에, 다음 단계에 나열된 사전 요구 사항을 완료했는지 확인해야 합니다.
1단계: Azure Stack Edge Pro 디바이스 구성의 설명대로 Azure Stack Edge Pro 디바이스에서 네트워크 설정을 완료했습니다.
컴퓨팅용 네트워크 인터페이스를 사용하도록 설정했습니다. 이 네트워크 인터페이스 IP는 VM 배포를 위한 가상 스위치를 만드는 데 사용됩니다. 이 프로세스를 안내하는 단계는 다음과 같습니다.
Compute로 이동합니다. 가상 스위치를 만드는 데 사용할 네트워크 인터페이스를 선택합니다.
Important
컴퓨팅용 포트는 하나만 구성할 수 있습니다.
네트워크 인터페이스에서 컴퓨팅을 사용하도록 설정합니다. 이 네트워크 인터페이스에 해당하는 가상 스위치를 Azure Stack Edge Pro가 만들고 관리합니다.
Azure Stack Edge Pro 디바이스와 클라이언트의 신뢰할 수 있는 저장소에 모든 인증서를 만들고 설치했습니다. 2단계: 인증서 만들기 및 설치에 설명된 절차를 따릅니다.
Azure Stack Edge Pro 디바이스에 대해 Base-64로 인코딩된 .cer 인증서(PEM 형식)를 만들었습니다. 해당 인증서가 디바이스에 서명 체인으로 이미 업로드되었으며 클라이언트의 신뢰할 수 있는 루트 저장소에 설치되어 있습니다. 이 인증서가 클라이언트에서 작동하려면 Python용 pem 형식도 필요합니다.
certutil 명령을 사용하여 이 인증서를
pem
형식으로 변환합니다. 인증서가 포함된 디렉터리에서 이 명령을 실행해야 합니다.certutil.exe <SourceCertificateName.cer> <DestinationCertificateName.pem>
다음 샘플은 명령 사용법을 보여줍니다.
PS C:\Certificates> certutil.exe -encode aze-root.cer aze-root.pem Input Length = 2150 Output Length = 3014 CertUtil: -encode command completed successfully. PS C:\Certificates>
이
pem
을 나중에 Python 저장소에도 추가합니다.디바이스의 로컬 웹 UI에 있는 네트워크 페이지에서 디바이스 IP를 할당했습니다. 이 IP를 다음에 추가합니다.
- 클라이언트의 호스트 파일 또는
- DNS 서버 구성
Important
엔드포인트 이름 확인을 위해 DNS 서버 구성을 수정하는 것이 좋습니다.
메모장을 관리자(파일을 저장하려면 관리자 권한이 필요함) 권한으로 시작한 다음,
C:\Windows\System32\Drivers\etc
에 있는 hosts 파일을 엽니다.다음 항목을 디바이스에 적합한 값으로 대체하고 hosts 파일에 추가합니다.
<Device IP> login.<appliance name>.<DNS domain> <Device IP> management.<appliance name>.<DNS domain> <Device IP> <storage name>.blob.<appliance name>.<DNS domain>
다음 이미지를 참조하세요. 호스트 파일을 저장합니다.
이 절차에 사용된 Python 스크립트를 다운로드합니다.
Azure CLI에 대한 환경을 준비합니다.
Azure Cloud Shell에서 Bash 환경을 사용합니다. 자세한 내용은 Azure Cloud Shell의 Bash에 대한 빠른 시작을 참조하세요.
CLI 참조 명령을 로컬에서 실행하려면 Azure CLI를 설치합니다. Windows 또는 macOS에서 실행 중인 경우 Docker 컨테이너에서 Azure CLI를 실행하는 것이 좋습니다. 자세한 내용은 Docker 컨테이너에서 Azure CLI를 실행하는 방법을 참조하세요.
로컬 설치를 사용하는 경우 az login 명령을 사용하여 Azure CLI에 로그인합니다. 인증 프로세스를 완료하려면 터미널에 표시되는 단계를 수행합니다. 다른 로그인 옵션은 Azure CLI를 사용하여 로그인을 참조하세요.
메시지가 표시되면 처음 사용할 때 Azure CLI 확장을 설치합니다. 확장에 대한 자세한 내용은 Azure CLI에서 확장 사용을 참조하세요.
az version을 실행하여 설치된 버전과 종속 라이브러리를 찾습니다. 최신 버전으로 업그레이드하려면 az upgrade를 실행합니다.
1단계: 클라이언트에서 Azure CLI/Python 설정
프로필 확인 및 Azure CLI 설치
클라이언트에 Azure CLI를 설치합니다. 이 예제에서는 Azure CLI 2.0.80이 설치되었습니다. Azure CLI의 버전을 확인하려면 az --version 명령을 실행합니다.
다음은 위 명령의 샘플 출력입니다.
PS C:\windows\system32> az --version azure-cli 2.0.80 command-modules-nspkg 2.0.3 core 2.0.80 nspkg 3.0.4 telemetry 1.0.4 Extensions: azure-cli-iot-ext 0.7.1 Python location 'C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\python.exe' Extensions directory 'C:\.azure\cliextensions' Python (Windows) 3.6.6 (v3.6.6:4cf1f54eb7, Jun 27 2018, 02:47:15) [MSC v.1900 32 bit (Intel)] Legal docs and information: aka.ms/AzureCliLegal Your CLI is up-to-date. Please let us know how we are doing: https://aka.ms/clihats PS C:\windows\system32>
Azure CLI가 없으면 Windows에서 Azure CLI를 다운로드하여 설치합니다. Windows 명령 프롬프트 또는 Windows PowerShell을 통해 Azure CLI를 실행할 수 있습니다.
CLI의 Python 위치를 기록해 둡니다. Azure CLI에 대해 신뢰할 수 있는 루트 인증서 저장소의 위치를 확인하려면 Python 위치가 필요합니다.
이 문서에 사용된 샘플 스크립트를 실행하려면 다음 Python 라이브러리 버전이 필요합니다.
azure-common==1.1.23 azure-mgmt-resource==2.1.0 azure-mgmt-network==2.7.0 azure-mgmt-compute==5.0.0 azure-mgmt-storage==1.5.0 azure-storage-blob==1.2.0rc1 haikunator msrestazure==0.6.2
해당 버전을 설치하려면 다음 명령을 실행합니다.
.\python.exe -m pip install haikunator
다음 샘플 출력은 Haikunator 설치를 보여줍니다.
PS C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2> .\python.exe -m pip install haikunator Collecting haikunator Downloading https://files.pythonhosted.org/packages/43/fa/130968f1a1bb1461c287b9ff35c630460801783243acda2cbf3a4c5964a5/haikunator-2.1.0-py2.py3-none-any.whl Installing collected packages: haikunator Successfully installed haikunator-2.1.0 You are using pip version 10.0.1, however version 20.0.1 is available. You should consider upgrading using the 'python -m pip install --upgrade pip' command. PS C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2>
다음 샘플 출력은
msrestazure
의 pip 설치를 보여줍니다.PS C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2> .\python.exe -m pip install msrestazure==0.6.2 Requirement already satisfied: msrestazure==0.6.2 in c:\program files (x86)\microsoft sdks\azure\cli2\lib\site-packages (0.6.2) Requirement already satisfied: msrest<2.0.0,>=0.6.0 in c:\program files (x86)\microsoft sdks\azure\cli2\lib\site-packages (from msrestazure==0.6.2) (0.6.10) === CUT =========================== CUT ================================== Requirement already satisfied: cffi!=1.11.3,>=1.8 in c:\program files (x86)\microsoft sdks\azure\cli2\lib\site-packages (from cryptography>=1.1.0->adal<2.0.0,>=0.6.0->msrestazure==0.6.2) (1.13.2) Requirement already satisfied: pycparser in c:\program files (x86)\microsoft sdks\azure\cli2\lib\site-packages (from cffi!=1.11.3,>=1.8->cryptography>=1.1.0->adal<2.0.0,>=0.6.0->msrestazure==0.6.2) (2.18) You are using pip version 10.0.1, however version 20.0.1 is available. You should consider upgrading using the 'python -m pip install --upgrade pip' command. PS C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2>
Azure Stack Edge Pro CA 루트 인증서 신뢰
컴퓨터에서 인증서 위치를 찾습니다. 위치는
az cli
를 설치한 위치에 따라 다를 수 있습니다. 관리자 권한으로 Windows PowerShell을 실행합니다.az cli
가 Python을 설치한 경로(C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\python.exe
)로 전환합니다.인증서 위치를 가져오려면 다음 명령을 입력합니다.
.\python -c "import certifi; print(certifi.where())"
cmdlet은 인증서 위치를 아래와 같이 반환합니다.
PS C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2> .\python -c "import certifi; print(certifi.where())" C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\lib\site-packages\certifi\cacert.pem PS C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2>
나중에 사용할 수 있도록 이 위치를 기록해 둡니다. -
C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\lib\site-packages\certifi\cacert.pem
Azure Stack Edge Pro CA 루트 인증서를 기존 Python 인증서에 추가하여 신뢰합니다. 이전에 PEM 인증서를 저장한 경로를 제공합니다.
$pemFile = "<Path to the pem format certificate>"
경로의 예는 "C:\VM-scripts\rootteam3device.pem"입니다.
그런 다음, Windows PowerShell에 다음과 같은 일련의 명령을 입력합니다.
$root = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 $root.Import($pemFile) Write-Host "Extracting required information from the cert file" $md5Hash = (Get-FileHash -Path $pemFile -Algorithm MD5).Hash.ToLower() $sha1Hash = (Get-FileHash -Path $pemFile -Algorithm SHA1).Hash.ToLower() $sha256Hash = (Get-FileHash -Path $pemFile -Algorithm SHA256).Hash.ToLower() $issuerEntry = [string]::Format("# Issuer: {0}", $root.Issuer) $subjectEntry = [string]::Format("# Subject: {0}", $root.Subject) $labelEntry = [string]::Format("# Label: {0}", $root.Subject.Split('=')[-1]) $serialEntry = [string]::Format("# Serial: {0}", $root.GetSerialNumberString().ToLower()) $md5Entry = [string]::Format("# MD5 Fingerprint: {0}", $md5Hash) $sha1Entry= [string]::Format("# SHA1 Fingerprint: {0}", $sha1Hash) $sha256Entry = [string]::Format("# SHA256 Fingerprint: {0}", $sha256Hash) $certText = (Get-Content -Path $pemFile -Raw).ToString().Replace("`r`n","`n") $rootCertEntry = "`n" + $issuerEntry + "`n" + $subjectEntry + "`n" + $labelEntry + "`n" + ` $serialEntry + "`n" + $md5Entry + "`n" + $sha1Entry + "`n" + $sha256Entry + "`n" + $certText Write-Host "Adding the certificate content to Python Cert store" Add-Content "${env:ProgramFiles(x86)}\Microsoft SDKs\Azure\CLI2\Lib\site-packages\certifi\cacert.pem" $rootCertEntry Write-Host "Python Cert store was updated to allow the Azure Stack Edge Pro CA root certificate"
Azure Stack Edge Pro에 연결
Azure Stack Edge Pro 환경을 az cloud register 명령을 사용해 등록합니다.
일부 시나리오에서는 직접 아웃바운드 인터넷 연결이 SSL 인터셉션을 적용하는 프록시 또는 방화벽을 통해 라우팅됩니다. 이 경우
az cloud register
명령이 "클라우드에서 엔드포인트를 가져올 수 없습니다."와 같은 오류를 출력하며 실패할 수 있습니다. 이 오류를 해결하려면 Windows PowerShell에서 다음 환경 변수를 설정합니다.$ENV:AZURE_CLI_DISABLE_CONNECTION_VERIFICATION = 1 $ENV:ADAL_PYTHON_SSL_NO_VERIFY = 1
Azure Resource Manager 엔드포인트, 리소스가 생성된 위치 및 원본 VHD가 있는 경로에 대한 스크립트의 환경 변수를 설정합니다. 리소스의 위치는 모든 Azure Stack Edge Pro 디바이스에서 고정되며
dbelocal
로 설정됩니다. 주소 접두사 및 개인 IP 주소도 지정해야 합니다. 다음 환경 변수는 모두"dbelocal"
로 하드코딩되어야 하는AZURE_RESOURCE_LOCATION
을 제외하고 사용자 값에 기반한 값입니다.$ENV:ARM_ENDPOINT = "https://management.team3device.teatraining1.com" $ENV:AZURE_RESOURCE_LOCATION = "dbelocal" $ENV:VHD_FILE_PATH = "C:\Downloads\Ubuntu1604\Ubuntu13.vhd" $ENV:ADDRESS_PREFIXES = "5.5.0.0/16" $ENV:PRIVATE_IP_ADDRESS = "5.5.174.126"
환경을 등록합니다. 다음 매개 변수를 az cloud register가 작동할 때 사용합니다.
값 설명 예시 환경 이름 연결하려는 환경의 이름 이름 제공(예: aze-environ
)Resource Manager 엔드포인트 URL은 https://Management.<appliancename><dnsdomain>
입니다.
이 URL을 얻으려면 디바이스의 로컬 웹 UI에서 디바이스 페이지로 이동합니다.예: https://management.team3device.teatraining1.com
.az cloud register -n <environmentname> --endpoint-resource-manager "https://management.<appliance name>.<DNS domain>"
다음 샘플은 위 명령의 사용법을 보여줍니다.
PS C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2> az cloud register -n az-new-env --endpoint-resource-manager "https://management.team3device.teatraining1.com"
다음 명령을 사용하여 활성 환경을 설정합니다.
az cloud set -n <EnvironmentName>
다음 샘플은 위 명령의 사용법을 보여줍니다.
PS C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2> az cloud set -n az-new-env Switched active cloud to 'az-new-env'. Use 'az login' to log in to this cloud. Use 'az account set' to set the active subscription. PS C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2>
Azure Stack Edge Pro 환경에 az login 명령을 사용해 로그인합니다. 사용자나 서비스 주체로 Azure Stack Edge Pro 환경에 로그인할 수 있습니다.
사용자로 로그인하려면 다음 단계를 수행합니다.
az login
명령 내에 직접 사용자 이름과 암호를 지정하거나 브라우저를 사용하여 인증할 수 있습니다. 계정에 다단계 인증을 사용하도록 설정된 경우 후자를 수행해야 합니다.다음 샘플은
az login
사용법을 보여줍니다.PS C:\Certificates> az login -u EdgeARMuser
로그인 명령을 사용하면 암호를 입력하라는 메시지가 표시됩니다. Azure Resource Manager 암호를 제공합니다.
다음 샘플은 암호를 제공한 후 성공한 로그인의 출력을 보여줍니다.
PS C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2> az login -u EdgeARMuser Password: [ { "cloudName": "az-new-env", "id": "A4257FDE-B946-4E01-ADE7-674760B8D1A3", "isDefault": true, "name": "Default Provider Subscription", "state": "Enabled", "tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee", "user": { "name": "EdgeArmUser@localhost", "type": "user" } } ] PS C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2>
id
및tenantId
값은 각각 Azure Resource Manager 구독 ID와 Azure Resource Manager 테넌트 ID에 해당하며 이후 단계에서 사용되므로 기록해 둡니다.서비스 주체로 작업하려면 다음 환경 변수를 설정해야 합니다.
$ENV:ARM_TENANT_ID = "aaaabbbb-0000-cccc-1111-dddd2222eeee" $ENV:ARM_CLIENT_ID = "cbd868c5-7207-431f-8d16-1cb144b50971" $ENV:ARM_CLIENT_SECRET - "<Your Azure Resource Manager password>" $ENV:ARM_SUBSCRIPTION_ID = "<Your subscription ID>"
Azure Resource Manager 클라이언트 ID는 하드 코딩됩니다. Azure Resource Manager 테넌트 ID와 Azure Resource Manager 구독 ID는 모두 이전에 실행한
az login
명령의 출력에 표시됩니다. Azure Resource Manager 클라이언트 암호는 내가 설정한 Azure Resource Manager 암호입니다.자세한 내용은 Azure Resource Manager 암호를 참조하세요.
프로필을 2019-03-01-hybrid 버전으로 변경합니다. 프로필 버전을 변경하려면 다음 명령을 실행합니다.
az cloud update --profile 2019-03-01-hybrid
다음 샘플은
az cloud update
사용법을 보여줍니다.PS C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2> az cloud update --profile 2019-03-01-hybrid PS C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2>
2단계: VM 만들기
VM을 생성하도록 Python 스크립트가 제공됩니다. 사용자로 로그인했는지 또는 서비스 주체로 설정되었는지에 따라 스크립트는 그에 따른 입력을 수행하여 VM을 만듭니다.
- Python이 설치된 디렉터리에서 Python 스크립트를 실행합니다.
.\python.exe example_dbe_arguments_name_https.py cli
스크립트를 실행하면 VHD를 업로드하는 데 20~30분이 걸립니다. 업로드 작업의 진행률을 보려면 Azure Storage Explorer 또는 AzCopy를 사용하면 됩니다.
다음은 스크립트 실행에 성공한 출력의 샘플입니다. 스크립트는 리소스 그룹 내의 모든 리소스를 만들고, 해당 리소스를 사용하여 VM을 만든 다음, 마지막으로 생성된 모든 리소스를 포함한 리소스 그룹을 삭제합니다.
PS C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2> .\python.exe example_dbe_arguments_name_https.py cli Create Resource Group Create a storage account Uploading to Azure Stack Storage as blob: ubuntu13.vhd Listing blobs... ubuntu13.vhd VM image resource id: /subscriptions/.../resourceGroups/azure-sample-group-virtual-machines118/providers/Microsoft.Compute/images/UbuntuImage Create Vnet Create Subnet Create NIC Creating Linux Virtual Machine Tag Virtual Machine Create (empty) managed Data Disk Get Virtual Machine by Name Attach Data Disk Detach Data Disk Deallocating the VM (to prepare for a disk resize) Update OS disk size Start VM Restart VM Stop VM List VMs in subscription VM: VmName118 List VMs in resource group VM: VmName118 Delete VM All example operations completed successfully! Delete Resource Group Deleted: azure-sample-group-virtual-machines118 PS C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2>