Tutorial: Implementación de una máquina virtual en la versión preliminar de MEC público de Azure mediante el SDK para Python

En este tutorial, usará el SDK de Python para implementar recursos en el proceso perimetral multiacceso (MEC) público de Azure. En el tutorial se proporciona código de Python para implementar una máquina virtual (VM) y sus dependencias en el MEC público de Azure.

Para información sobre los SDK de Python, consulte Bibliotecas de Azure para patrones de uso de Python.

En este tutorial, aprenderá a:

  • Instalar los paquetes de biblioteca de Azure necesarios
  • Aprovisionamiento de una máquina virtual
  • Ejecutar el script en el entorno de desarrollo
  • Crear un servidor de salto en la región asociada
  • Acceder a las máquinas virtuales

Requisitos previos

  • Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.

  • Agregue una suscripción de la lista de permitidos a su cuenta de Azure, lo que le permite implementar recursos en MEC público de Azure. Si no tiene ninguna suscripción permitida activa, póngase en contacto con el equipo de producto del MEC público de Azure.

  • Configure Python en el entorno de desarrollo local siguiendo las instrucciones que se indican en Configuración del entorno de desarrollo local de Python para Azure. Asegúrese de crear una entidad de servicio para desarrollo local, así como de crear y activar un entorno virtual para el proyecto de este tutorial.

Instalar los paquetes de biblioteca de Azure necesarios

  1. Cree un archivo llamado requirements.txt en el que se enumeren las bibliotecas de administración que se usan en este ejemplo.

    azure-mgmt-resource
    azure-mgmt-compute
    azure-mgmt-network
    azure-identity
    azure-mgmt-extendedlocation==1.0.0b2
    
  2. Abra un símbolo del sistema con el entorno virtual activado e instale las bibliotecas de administración enumeradas en requirements.txt.

    pip install -r requirements.txt
    

Aprovisionamiento de una máquina virtual

  1. Cree un archivo de Python llamado provision_vm_edge.py e incluya el siguiente script de Python. El script implementa la máquina virtual y su dependencia asociada en el MEC público de Azure. En los comentarios del script se explican los detalles.

    # 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 ejecutar el script, rellene estas variables usadas en la sección del paso 1 del script:

    Nombre de la variable Descripción
    LOCATION Región de Azure asociada a la ubicación del MEC público de Azure.
    PUBLIC_MEC_LOCATION Identificador de ubicación/identificador de zona perimetral del MEC público de Azure.
    PASSWORD Contraseña que se usará para iniciar sesión en la máquina virtual.

    Nota:

    Cada sitio del MEC público de Azure está asociado a una región de Azure. En función de la ubicación del MEC público de Azure donde se deba implementar el recurso, seleccione el valor de región adecuado para el grupo de recursos que se va a crear. Para más información, consulte Conceptos clave sobre el MEC público de Azure.

Ejecutar el script en el entorno de desarrollo

  1. Ejecute el script de Python que copió de la sección anterior.

    python provision_vm_edge.py
    
  2. Espere unos minutos a que se creen la máquina virtual y los recursos auxiliares.

    En la salida de ejemplo siguiente se muestra que la operación de creación de la máquina virtual se realizó correctamente.

    (.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. En la salida del campo python-example-ip-edge, anote su propio valor de publicIpAddress. Use esta dirección para acceder a la máquina virtual en la sección siguiente.

Crear un servidor de salto en la región asociada

Para usar SSH para conectarse a la máquina virtual en el MEC público de Azure, el mejor método es implementar un JumpBox en una región de Azure donde se implementó el grupo de recursos en la sección anterior.

  1. Siga los pasos que se indican en Uso de las bibliotecas de Azure para aprovisionar una máquina virtual.

  2. Anote su propio valor de publicIpAddress en la salida del campo python-example-ip de la máquina virtual del servidor de salto. Use esta dirección para acceder a la máquina virtual en la sección siguiente.

Acceder a las máquinas virtuales

  1. Use SSH para conectarse a la máquina virtual de JumpBox que implementó en la región con su dirección IP que anotó anteriormente.

    ssh  azureuser@<python-example-ip>
    
  2. Desde el JumpBox, use SSH para conectarse a la máquina virtual que creó en el MEC público de Azure con su dirección IP que anotó anteriormente.

    ssh azureuser@<python-example-ip-edge>
    
  3. Asegúrese de que los grupos de seguridad de red de Azure permiten el acceso en el puerto 22 a las máquinas virtuales que cree.

Limpieza de recursos

En este tutorial, ha creado una máquina virtual en el MEC público de Azure mediante el SDK de Python. Si no cree que vaya a necesitar estos recursos en el futuro, use el comando az group delete para quitar el grupo de recursos, el conjunto de escalado y todos los recursos relacionados. Al usar el parámetro --yes, se eliminan los recursos sin una solicitud de confirmación.

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

Pasos siguientes

Si tiene preguntas sobre el MEC público de Azure, póngase en contacto con el equipo del producto: