자습서: Python SDK를 사용하여 Azure 퍼블릭 MEC에 가상 머신 배포
이 자습서에서는 Python SDK를 사용하여 Azure 퍼블릭 MEC(멀티 액세스 에지 컴퓨팅)에 리소스를 배포합니다. 이 자습서에서는 Azure 퍼블릭 MEC에서 VM(가상 머신) 및 해당 종속성을 배포하는 Python 코드를 제공합니다.
Python SDK에 대한 자세한 내용은 Python용 Azure 라이브러리 사용 패턴을 참조하세요.
이 자습서에서는 다음을 하는 방법을 알아볼 수 있습니다.
- 필요한 Azure 라이브러리 패키지 설치
- 가상 머신 프로비저닝
- 개발 환경에서 스크립트 실행
- 연결된 지역에 점프 서버 만들기
- VM에 액세스
필수 조건
Azure 구독이 없는 경우 시작하기 전에 체험 계정을 만듭니다.
Azure 계정에 허용된 구독을 추가하면 Azure 퍼블릭 MEC에서 리소스를 배포할 수 있습니다. 활성 허용 구독이 없는 경우 Azure 퍼블릭 MEC 제품 팀에 문의하세요.
Azure용 로컬 Python 개발 환경 구성의 지침에 따라 로컬 개발 환경에서 Python을 설정합니다. 로컬 개발을 위한 서비스 주체를 만들고 이 자습서 프로젝트의 가상 환경을 만들어 활성화해야 합니다.
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를 실행합니다.
필요한 Azure 라이브러리 패키지 설치
이 예제에서 사용된 관리 라이브러리를 나열하는 requirements.txt라는 파일을 만듭니다.
azure-mgmt-resource azure-mgmt-compute azure-mgmt-network azure-identity azure-mgmt-extendedlocation==1.0.0b2
가상 환경이 활성화된 명령 프롬프트를 열고 requirements.txt에 나열된 관리 라이브러리를 설치합니다.
pip install -r requirements.txt
가상 머신 프로비저닝
provision_vm_edge.py라는 Python 파일을 만들고 다음 Python 스크립트로 채웁니다. 스크립트는 Azure 퍼블릭 MEC에서 VM 및 관련 종속성을 배포합니다. 스크립트의 주석은 세부 정보를 설명합니다.
# Import the needed credential and management objects from the libraries. from azure.identity import AzureCliCredential from azure.mgmt.resource import ResourceManagementClient from azure.mgmt.network import NetworkManagementClient from azure.mgmt.compute import ComputeManagementClient import os print(f"Provisioning a virtual machine...some operations might take a minute or two.") # Acquire a credential object using CLI-based authentication. credential = AzureCliCredential() # Retrieve subscription ID from environment variable. subscription_id = os.environ["AZURE_SUBSCRIPTION_ID"] # Step 1: Provision a resource group # Obtain the management object for resources, using the credentials from the CLI login. resource_client = ResourceManagementClient(credential, subscription_id) # Constants we need in multiple places: the resource group name, the region and the public mec location # in which we provision resources. Populate the variables with appropriate values. RESOURCE_GROUP_NAME = "PythonAzureExample-VM-rg" LOCATION = "<region>" PUBLIC_MEC_LOCATION = "<edgezone id>" USERNAME = "azureuser" PASSWORD = "<password>" # Provision the resource group. rg_result = resource_client.resource_groups.create_or_update(RESOURCE_GROUP_NAME, { "location": LOCATION } ) print(f"Provisioned resource group {rg_result.name} in the {rg_result.location} region") # For details on the previous code, see Example: Use the Azure libraries to provision a resource group # at https://learn.microsoft.com/azure/developer/python/azure-sdk-example-resource-group # Step 2: Provision a virtual network # A virtual machine requires a network interface client (NIC). A NIC requires # a virtual network and subnet along with an IP address. Therefore, we must provision # these downstream components first, then provision the NIC, after which we # can provision the VM. # Network and IP address names VNET_NAME = "python-example-vnet-edge" SUBNET_NAME = "python-example-subnet-edge" IP_NAME = "python-example-ip-edge" IP_CONFIG_NAME = "python-example-ip-config-edge" NIC_NAME = "python-example-nic-edge" # Obtain the management object for networks network_client = NetworkManagementClient(credential, subscription_id) # Provision the virtual network and wait for completion poller = network_client.virtual_networks.begin_create_or_update(RESOURCE_GROUP_NAME, VNET_NAME, { "location": LOCATION, "extendedLocation": {"type": "EdgeZone", "name": PUBLIC_MEC_LOCATION}, "address_space": { "address_prefixes": ["10.1.0.0/16"] } } ) vnet_result = poller.result() print(f"Provisioned virtual network {vnet_result.name} with address prefixes {vnet_result.address_space.address_prefixes}") # Step 3: Provision the subnet and wait for completion poller = network_client.subnets.begin_create_or_update(RESOURCE_GROUP_NAME, VNET_NAME, SUBNET_NAME, { "address_prefix": "10.1.0.0/24" } ) subnet_result = poller.result() print(f"Provisioned virtual subnet {subnet_result.name} with address prefix {subnet_result.address_prefix}") # Step 4: Provision an IP address and wait for completion # Only the standard public IP SKU is supported at EdgeZones poller = network_client.public_ip_addresses.begin_create_or_update(RESOURCE_GROUP_NAME, IP_NAME, { "location": LOCATION, "extendedLocation": {"type": "EdgeZone", "name": PUBLIC_MEC_LOCATION}, "sku": { "name": "Standard" }, "public_ip_allocation_method": "Static", "public_ip_address_version" : "IPV4" } ) ip_address_result = poller.result() print(f"Provisioned public IP address {ip_address_result.name} with address {ip_address_result.ip_address}") # Step 5: Provision the network interface client poller = network_client.network_interfaces.begin_create_or_update(RESOURCE_GROUP_NAME, NIC_NAME, { "location": LOCATION, "extendedLocation": {"type": "EdgeZone", "name": PUBLIC_MEC_LOCATION}, "ip_configurations": [ { "name": IP_CONFIG_NAME, "subnet": { "id": subnet_result.id }, "public_ip_address": {"id": ip_address_result.id } }] } ) nic_result = poller.result() print(f"Provisioned network interface client {nic_result.name}") # Step 6: Provision the virtual machine # Obtain the management object for virtual machines compute_client = ComputeManagementClient(credential, subscription_id) VM_NAME = "ExampleVM-edge" print(f"Provisioning virtual machine {VM_NAME}; this operation might take a few minutes.") # Provision the VM specifying only minimal arguments, which defaults to an Ubuntu 18.04 VM # on a Standard DSv2-series with a public IP address and a default virtual network/subnet. poller = compute_client.virtual_machines.begin_create_or_update(RESOURCE_GROUP_NAME, VM_NAME, { "location": LOCATION, "extendedLocation": {"type": "EdgeZone", "name": PUBLIC_MEC_LOCATION}, "storage_profile": { "image_reference": { "publisher": 'Canonical', "offer": "UbuntuServer", "sku": "18.04-LTS", "version": "latest" } }, "hardware_profile": { "vm_size": "Standard_DS2_v2" }, "os_profile": { "computer_name": VM_NAME, "admin_username": USERNAME, "admin_password": PASSWORD }, "network_profile": { "network_interfaces": [{ "id": nic_result.id, }] } } ) vm_result = poller.result() print(f"Provisioned virtual machine {vm_result.name}")
스크립트를 실행하기 전에 스크립트의 1단계 섹션에서 사용되는 다음 변수를 채웁니다.
변수 이름 설명 위치 Azure 퍼블릭 MEC 위치와 연결된 Azure 지역 PUBLIC_MEC_LOCATION Azure 퍼블릭 MEC 위치 식별자/edgezone ID PASSWORD VM에 로그인하는 데 사용할 암호 참고 항목
각 Azure 퍼블릭 MEC 사이트는 Azure 지역과 연결됩니다. 리소스를 배포해야 하는 Azure 퍼블릭 MEC 위치에 따라 생성할 리소스 그룹에 대한 적절한 지역 값을 선택합니다. 자세한 내용은 Azure 퍼블릭 MEC의 주요 개념을 참조하세요.
개발 환경에서 스크립트 실행
이전 섹션에서 복사한 Python 스크립트를 실행합니다.
python provision_vm_edge.py
VM 및 지원 리소스가 생성될 때까지 몇 분 정도 기다립니다.
다음 예제 출력은 VM 만들기 작업이 완료되었음을 보여줍니다.
(.venv) C:\Users >python provision_vm_edge.py Provisioning a virtual machine...some operations might take a minute or two. Provisioned resource group PythonAzureExample-VM-rg in the <region> region Provisioned virtual network python-example-vnet-edge with address prefixes ['10.1.0.0/16'] Provisioned virtual subnet python-example-subnet-edge with address prefix 10.1.0.0/24 Provisioned public IP address python-example-ip-edge with address <public ip> Provisioned network interface client python-example-nic-edge Provisioning virtual machine ExampleVM-edge; this operation might take a few minutes. Provisioned virtual machine ExampleVM-edge
python-example-ip-edge 필드의 출력에서 고유한 publicIpAddress를 기록해 둡니다. 이 주소는 다음 섹션에서 VM에 액세스하는 데 사용됩니다.
연결된 지역에 점프 서버 만들기
SSH를 사용하여 Azure 퍼블릭 MEC의 VM에 연결하는 경우 가장 좋은 방법은 이전 섹션에서 리소스 그룹이 배포된 Azure 지역에 점프 상자를 배포하는 것입니다.
Azure 라이브러리를 사용하여 가상 머신 프로비저닝의 단계를 따릅니다.
점프 서버 VM의 python-example-ip 필드 출력에 고유한 publicIpAddress를 기록해 둡니다. 이 주소는 다음 섹션에서 VM에 액세스하는 데 사용됩니다.
VM에 액세스
SSH를 사용하여 이전에 적어 두었던 IP 주소로 지역에 배포한 점프 상자 VM에 연결합니다.
ssh azureuser@<python-example-ip>
점프 상자에서 SSH를 사용하여 이전에 적어 두었던 IP 주소로 Azure 퍼블릭 MEC에서 만든 VM에 연결합니다.
ssh azureuser@<python-example-ip-edge>
Azure 네트워크 보안 그룹에서 생성된 VM에 대한 포트 22 액세스를 허용하는지 확인합니다.
리소스 정리
이 자습서에서는 Python SDK를 사용하여 Azure 퍼블릭 MEC에서 VM을 만들었습니다. 향후 이러한 리소스가 필요하지 않을 것으로 예상되는 경우 az group delete 명령을 사용하여 리소스 그룹, 확장 집합 및 모든 관련 리소스를 제거합니다. --yes
매개 변수를 사용하면 확인 프롬프트 없이 리소스가 삭제됩니다.
az group delete --name PythonAzureExample-VM-rg --yes
다음 단계
Azure 퍼블릭 MEC에 대한 질문은 제품 팀에 문의하세요.