Tutorial: Implementación de recursos en el MEC público de Azure mediante el SDK de Go
En este tutorial, obtendrá información sobre cómo utilizar Go SDK para implementar recursos en la versión preliminar del proceso perimetral multiacceso (MEC) público de Azure. El tutorial proporciona fragmentos de código escritos en Go para implementar una máquina virtual y recursos de dirección IP pública en una solución de MEC público de Azure. Puede usar el mismo modelo y plantilla para implementar otros recursos y servicios compatibles con MEC público de Azure. Este artículo no está pensado para ser un tutorial sobre Go; solo se centra en las llamadas API necesarias para implementar recursos en MEC público de Azure.
Para más información sobre Go, consulte Azure para desarrolladores de Go. Para obtener ejemplos de Go, consulte Ejemplos del SDK de Azure para Go.
En este tutorial, aprenderá a:
- Creación de una máquina virtual
- Crear una dirección IP pública
- Implementación de una red virtual y una dirección IP pública
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 de MEC público de Azure.
Instalación de Go
Puede descargar e instalar la versión más reciente de Go. Reemplazará la versión de Go existente en la máquina. Si desea instalar varias versiones de Go en la misma máquina, consulte Administración de instalaciones de Go.
Autenticación
Debe obtener la autenticación antes de usar cualquier servicio de Azure. Puede usar la CLI de Azure para iniciar sesión o establecer variables de entorno de autenticación.
Usar la CLI de Azure para iniciar sesión
Puede usar az login
en la línea de comandos para iniciar sesión en Azure a través del explorador predeterminado. Encontrará instrucciones detalladas en Inicio de sesión con la CLI de Azure.
Establecimiento de variables de entorno
Necesita los siguientes valores para autenticarse en Azure:
- Id. de suscripción
- Id de cliente
- Secreto de cliente
- Id. de inquilino
Para obtener estos valores en el portal, siga estas instrucciones:
Obtenga el id. de suscripción
- Inicie sesión en la cuenta de Azure.
- Seleccione Suscripciones en la barra lateral izquierda
- Seleccione la suscripción que necesite.
- Seleccione Información general.
- Copie el valor de Id. de suscripción
Obtener el identificador de cliente/secreto de cliente/identificador de inquilino
Para obtener información sobre cómo obtener el identificador de cliente, el secreto de cliente y el identificador de inquilino, consulte Creación de una aplicación de Microsoft Entra y una entidad de servicio que puedan acceder a los recursos.
Establecimiento de variables de entorno
Después de obtener los valores, debe establecer los valores siguientes como variables de entorno:
AZURE_CLIENT_ID
AZURE_CLIENT_SECRET
AZURE_TENANT_ID
AZURE_SUBSCRIPTION_ID
Para establecer las siguientes variables de entorno en el sistema de desarrollo:
Windows (se requiere acceso de administrador)
- Abrir el Panel de control
- Seleccione Seguridad del sistema>Sistema
- Seleccione Configuración avanzada del sistema a la izquierda
- En la ventana Propiedades del sistema, seleccione el botón
Environment Variables…
. - Seleccione la propiedad que desea cambiar y, a continuación, Editar.... Si el nombre de la propiedad no aparece en la lista, seleccione Nuevo....
Basado en el sistema operativo Linux:
export AZURE_CLIENT_SECRET="__CLIENT_SECRET__" export AZURE_TENANT_ID="__TENANT_ID__" export AZURE_SUBSCRIPTION_ID="__SUBSCRIPTION_ID__"````
Instalar el paquete
El nuevo SDK usa módulos de Go para el control de versiones y la administración de dependencias.
Ejecute el siguiente comando para instalar los paquetes de este tutorial en la carpeta del proyecto:
go get github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5
go get github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v3
go get github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources
go get github.com/Azure/azure-sdk-for-go/sdk/azcore
go get github.com/Azure/azure-sdk-for-go/sdk/azidentity
Aprovisionamiento de una máquina virtual
package main
import (
"context"
"github.com/Azure/azure-sdk-for-go/sdk/azcore/to"
"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
"github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5"
"github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v3"
"github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources"
"log"
"os"
)
func main() {
subscriptionId := os.Getenv("AZURE_SUBSCRIPTION_ID")
cred, err := azidentity.NewDefaultAzureCredential(nil)
if err != nil {
log.Fatalf("authentication failure: %+v", err)
}
// client factory
resourcesClientFactory, err := armresources.NewClientFactory(subscriptionId, cred, nil)
if err != nil {
log.Fatalf("cannot create client factory: %+v", err)
}
computeClientFactory, err := armcompute.NewClientFactory(subscriptionId, cred, nil)
if err != nil {
log.Fatalf("cannot create client factory: %+v", err)
}
networkClientFactory, err := armnetwork.NewClientFactory(subscriptionId, cred, nil)
if err != nil {
log.Fatalf("cannot create client factory: %+v", err)
}
// Step 1: Provision a resource group
_, err = resourcesClientFactory.NewResourceGroupsClient().CreateOrUpdate(
context.Background(),
"<resourceGroupName>",
armresources.ResourceGroup{
Location: to.Ptr("westus"),
},
nil,
)
if err != nil {
log.Fatal("cannot create resources group:", err)
}
// Step 2: Provision a virtual network
virtualNetworksClientCreateOrUpdateResponsePoller, err := networkClientFactory.NewVirtualNetworksClient().BeginCreateOrUpdate(
context.Background(),
"<resourceGroupName>",
"<virtualNetworkName>",
armnetwork.VirtualNetwork{
Location: to.Ptr("westus"),
ExtendedLocation: &armnetwork.ExtendedLocation{
Name: to.Ptr("<edgezoneid>"),
Type: to.Ptr(armnetwork.ExtendedLocationTypesEdgeZone),
},
Properties: &armnetwork.VirtualNetworkPropertiesFormat{
AddressSpace: &armnetwork.AddressSpace{
AddressPrefixes: []*string{
to.Ptr("10.0.0.0/16"),
},
},
Subnets: []*armnetwork.Subnet{
{
Name: to.Ptr("test-1"),
Properties: &armnetwork.SubnetPropertiesFormat{
AddressPrefix: to.Ptr("10.0.0.0/24"),
},
},
},
},
},
nil,
)
if err != nil {
log.Fatal("network creation failed", err)
}
virtualNetworksClientCreateOrUpdateResponse, err := virtualNetworksClientCreateOrUpdateResponsePoller.PollUntilDone(context.Background(), nil)
if err != nil {
log.Fatal("cannot create virtual network:", err)
}
subnetID := *virtualNetworksClientCreateOrUpdateResponse.Properties.Subnets[0].ID
// Step 3: Provision an IP address
publicIPAddressesClientCreateOrUpdateResponsePoller, err := networkClientFactory.NewPublicIPAddressesClient().BeginCreateOrUpdate(
context.Background(),
"<resourceGroupName>",
"<publicIPName>",
armnetwork.PublicIPAddress{
Name: to.Ptr("<publicIPName>"),
Location: to.Ptr("westus"),
ExtendedLocation: &armnetwork.ExtendedLocation{
Name: to.Ptr("<edgezoneid>"),
Type: to.Ptr(armnetwork.ExtendedLocationTypesEdgeZone),
},
SKU: &armnetwork.PublicIPAddressSKU{
Name: to.Ptr(armnetwork.PublicIPAddressSKUNameStandard),
},
Properties: &armnetwork.PublicIPAddressPropertiesFormat{
PublicIPAllocationMethod: to.Ptr(armnetwork.IPAllocationMethodStatic),
},
},
nil,
)
if err != nil {
log.Fatal("public ip creation failed", err)
}
publicIPAddressesClientCreateOrUpdateResponse, err := publicIPAddressesClientCreateOrUpdateResponsePoller.PollUntilDone(context.Background(), nil)
if err != nil {
log.Fatal("cannot create public ip: ", err)
}
// Step 4: Provision the network interface client
interfacesClientCreateOrUpdateResponsePoller, err := networkClientFactory.NewInterfacesClient().BeginCreateOrUpdate(
context.Background(),
"<resourceGroupName>",
"<networkInterfaceName>",
armnetwork.Interface{
Location: to.Ptr("westus"),
ExtendedLocation: &armnetwork.ExtendedLocation{
Name: to.Ptr("<edgezoneid>"),
Type: to.Ptr(armnetwork.ExtendedLocationTypesEdgeZone),
},
Properties: &armnetwork.InterfacePropertiesFormat{
EnableAcceleratedNetworking: to.Ptr(true),
IPConfigurations: []*armnetwork.InterfaceIPConfiguration{
{
Name: to.Ptr("<ipConfigurationName>"),
Properties: &armnetwork.InterfaceIPConfigurationPropertiesFormat{
Subnet: &armnetwork.Subnet{
ID: to.Ptr(subnetID),
},
PublicIPAddress: &armnetwork.PublicIPAddress{
ID: publicIPAddressesClientCreateOrUpdateResponse.ID,
},
},
},
},
},
},
nil,
)
if err != nil {
log.Fatal("interface creation failed", err)
}
interfacesClientCreateOrUpdateResponse, err := interfacesClientCreateOrUpdateResponsePoller.PollUntilDone(context.Background(), nil)
if err != nil {
log.Fatal("cannot create interface:", err)
}
// Step 5: Provision the virtual machine
virtualMachinesClientCreateOrUpdateResponsePoller, err := computeClientFactory.NewVirtualMachinesClient().BeginCreateOrUpdate(
context.Background(),
"<resourceGroupName>",
"<vmName>",
armcompute.VirtualMachine{
Location: to.Ptr("westus"),
ExtendedLocation: &armcompute.ExtendedLocation{
Name: to.Ptr("<edgezoneid>"),
Type: to.Ptr(armcompute.ExtendedLocationTypesEdgeZone),
},
Properties: &armcompute.VirtualMachineProperties{
StorageProfile: &armcompute.StorageProfile{
ImageReference: &armcompute.ImageReference{
Publisher: to.Ptr("<publisher>"),
Offer: to.Ptr("<offer>"),
SKU: to.Ptr("<sku>"),
Version: to.Ptr("<version>"),
},
},
HardwareProfile: &armcompute.HardwareProfile{
VMSize: to.Ptr(armcompute.VirtualMachineSizeTypesStandardD2SV3),
},
OSProfile: &armcompute.OSProfile{
ComputerName: to.Ptr("<computerName>"),
AdminUsername: to.Ptr("<adminUsername>"),
AdminPassword: to.Ptr("<adminPassword>"),
},
NetworkProfile: &armcompute.NetworkProfile{
NetworkInterfaces: []*armcompute.NetworkInterfaceReference{
{
ID: interfacesClientCreateOrUpdateResponse.ID,
Properties: &armcompute.NetworkInterfaceReferenceProperties{
Primary: to.Ptr(true),
},
},
},
},
},
},
nil,
)
if err != nil {
log.Fatal("virtual machine creation failed", err)
}
_, err = virtualMachinesClientCreateOrUpdateResponsePoller.PollUntilDone(context.Background(), nil)
if err != nil {
log.Fatal("cannot create virtual machine:", err)
}
}
Limpieza de recursos
En este tutorial, ha creado una máquina virtual en MEC público de Azure mediante el SDK para Go. Si no espera necesitar estos recursos en el futuro, use Azure Portal para eliminar el grupo de recursos que ha creado.
Pasos siguientes
Para implementar una máquina virtual en MEC público de Azure mediante el SDK para Python, consulte el siguiente artículo: