Tutorial: Implementar uma máquina virtual no MEC público do Azure com o SDK python

Neste tutorial, vai utilizar o SDK python para implementar recursos na computação de periferia de múltiplos acessos públicos (MEC) do Azure. O tutorial fornece código Python para implementar uma máquina virtual (VM) e as respetivas dependências no MEC público do Azure.

Para obter informações sobre os SDKs python, veja Bibliotecas do Azure para padrões de utilização do Python.

Neste tutorial, ficará a saber como:

  • Instalar os pacotes de bibliotecas do Azure necessários
  • Aprovisionar uma máquina virtual
  • Executar o script no seu ambiente de desenvolvimento
  • Criar um servidor jump na região associada
  • Aceder às VMs

Pré-requisitos

  • Se não tiver uma subscrição do Azure, crie uma conta gratuita antes de começar.

  • Adicione uma subscrição na lista de permissões à sua conta do Azure, que lhe permite implementar recursos no MEC público do Azure. Se não tiver uma subscrição ativa permitida, contacte a equipa de produtos mec públicos do Azure.

  • Configure o Python no seu ambiente de desenvolvimento local ao seguir as instruções em Configurar o seu ambiente de desenvolvimento python local para o Azure. Certifique-se de que cria um principal de serviço para o desenvolvimento local e cria e ativa um ambiente virtual para este projeto de tutorial.

Instalar os pacotes de bibliotecas do Azure necessários

  1. Crie um ficheiro com o nome requirements.txt que lista as bibliotecas de gestão utilizadas neste exemplo.

    azure-mgmt-resource
    azure-mgmt-compute
    azure-mgmt-network
    azure-identity
    azure-mgmt-extendedlocation==1.0.0b2
    
  2. Abra uma linha de comandos com o ambiente virtual ativado e instale as bibliotecas de gestão listadas no requirements.txt.

    pip install -r requirements.txt
    

Aprovisionar uma máquina virtual

  1. Crie um ficheiro Python com o nome provision_vm_edge.py e preencha-o com o seguinte script Python. O script implementa a VM e a respetiva dependência associada no MEC público do Azure. Os comentários no script explicam os detalhes.

    # 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}")
    
  2. Antes de executar o script, preencha estas variáveis utilizadas na secção passo 1 do script:

    Nome da variável Descrição
    LOCALIZAÇÃO Região do Azure associada à localização do MEC público do Azure
    PUBLIC_MEC_LOCATION Identificador de localização do MEC público do Azure/ID do edgezone
    PALAVRA-PASSE Palavra-passe a utilizar para iniciar sessão na VM

    Nota

    Cada site MEC público do Azure está associado a uma região do Azure. Com base na localização mec pública do Azure onde o recurso precisa de ser implementado, selecione o valor de região adequado para que o grupo de recursos seja criado. Para obter mais informações, veja Principais conceitos para o MEC público do Azure.

Executar o script no seu ambiente de desenvolvimento

  1. Execute o script python que copiou da secção anterior.

    python provision_vm_edge.py
    
  2. Aguarde alguns minutos para que a VM e os recursos de suporte sejam criados.

    O seguinte resultado de exemplo mostra que a operação de criação da VM foi concluída com êxito.

    (.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
    
  3. No resultado do campo python-example-ip-edge, tenha em atenção o seu próprio publicIpAddress. Utilize este endereço para aceder à VM na secção seguinte.

Criar um servidor jump na região associada

Para utilizar o SSH para ligar à VM no MEC público do Azure, o melhor método é implementar uma caixa de salto numa região do Azure onde o grupo de recursos foi implementado na secção anterior.

  1. Siga os passos em Utilizar as bibliotecas do Azure para aprovisionar uma máquina virtual.

  2. Anote o seu próprio publicIpAddress na saída do campo python-example-ip da VM do servidor jump. Utilize este endereço para aceder à VM na secção seguinte.

Aceder às VMs

  1. Utilize o SSH para ligar à VM jump box que implementou na região com o respetivo endereço IP que anotou anteriormente.

    ssh  azureuser@<python-example-ip>
    
  2. A partir da caixa de salto, utilize o SSH para ligar à VM que criou no MEC público do Azure com o respetivo endereço IP que anotou anteriormente.

    ssh azureuser@<python-example-ip-edge>
    
  3. Certifique-se de que os grupos de segurança de rede do Azure permitem o acesso à porta 22 às VMs que criar.

Limpar os recursos

Neste tutorial, criou uma VM no MEC público do Azure com o SDK python. Se não esperar precisar destes recursos no futuro, utilize o comando az group delete para remover o grupo de recursos, o conjunto de dimensionamento e todos os recursos relacionados. A utilização do --yes parâmetro elimina os recursos sem um pedido de confirmação.

az group delete --name PythonAzureExample-VM-rg --yes

Passos seguintes

Para perguntas sobre o MEC público do Azure, contacte a equipa de produtos: