Ejercicio: Conversión y migración de recursos

Completado

Importante

Para realizar este ejercicio, se necesita una suscripción de Azure propia y puede que se apliquen cargos. Si aún no tiene una suscripción de Azure, cree una cuenta gratuita antes de comenzar.

Su empresa de juguetes ha adquirido un competidor que ha creado un popular camión de juguete. Los juguetes se conectan a una máquina virtual hospedada en Azure para recibir actualizaciones de firmware. Todos los recursos de la máquina virtual se crearon manualmente mediante Azure Portal. En esta unidad, comenzará el proceso de migración de los recursos a un archivo de Bicep.

Durante el proceso, hará estas tareas:

  • Implementar una máquina virtual nueva con Azure Portal.
  • Exportar los recursos de la máquina virtual a una plantilla JSON.
  • Descompilar la plantilla JSON en Bicep.
  • Cree un nuevo archivo de Bicep y mueva los recursos de la plantilla descompilada.

En este ejercicio se usa la extensión de Bicep para Visual Studio Code. Asegúrese de instalar esta extensión en Visual Studio Code.

Creación de una máquina virtual con Azure Portal

Para simular la situación del escenario de ejemplo, primero implementará una máquina virtual con Azure Portal.

  1. Inicie sesión en Azure Portal.

  2. En la página principal de Azure, en Servicios de Azure, seleccione Crear un recurso:

    Captura de pantalla en la que se muestra Azure Portal. La opción Crear un recurso está resaltada.

    Azure Marketplace aparece en el panel Crear un recurso.

  3. En Ubuntu Server 20.04 LTS, seleccione Crear:

    Captura de pantalla en la que se muestra Azure Marketplace. El vínculo Crear en Ubuntu Server 20.04 LTS está resaltado.

    Importante

    Si no ve Ubuntu Server 20.04 LTS, vaya directamente a Ubuntu Server 20.04 LTS en Azure Marketplace.

  4. En la pestaña Aspectos básicos, escriba los valores siguientes para cada opción. Use los valores predeterminados para el resto de configuraciones.

    Configuración Value
    Detalles del proyecto
    Resource group Seleccione Crear nuevo y escriba ToyTruck.
    Detalles de instancia
    Nombre de la máquina virtual ToyTruckServer
    Region (EE. UU.) Oeste de EE. UU. 3
    Opciones de disponibilidad No se requiere redundancia de la infraestructura
    Imagen Ubuntu Server 20.04 LTS: x64 Gen2
    Size Standard_D2s_v3
    Cuenta de administrador
    Tipo de autenticación Contraseña
    Nombre de usuario toytruckadmin
    Contraseña Escriba una contraseña.
    Reglas de puerto de entrada
    Puertos de entrada públicos Ninguno
  5. En la pestaña Administración, asegúrese de que no esté seleccionada la opción Habilitar apagado automático.

  6. Seleccione Revisar + crear. Azure valida la configuración. Es posible que tenga que escribir o seleccionar más información en función de los requisitos de la imagen.

  7. Seleccione Crear para implementar y crear la máquina virtual.

    Azure Portal muestra la implementación mientras está en curso.

  8. Una vez finalizada la implementación, seleccione el nombre del grupo de recursos para abrirlo:

    Captura de pantalla de Azure Portal que muestra la implementación. El nombre del grupo de recursos está resaltado.

    El grupo de recursos ahora contiene la máquina virtual y sus dependencias:

    Captura de pantalla de Azure Portal en la que se muestra el grupo de recursos.

Exportación del contenido del grupo de recursos a una plantilla JSON

  1. En el menú de la izquierda, en Automatización, seleccione Exportar plantilla:

    Captura de pantalla de Azure Portal en la que se muestra el elemento del menú Exportar plantilla en el panel del grupo de recursos.

    Se genera una plantilla JSON. El proceso podría tardar uno o dos minutos en finalizar.

  2. Seleccione el botón Descargar:

    Captura de pantalla de Azure Portal en la que se muestra la plantilla JSON del grupo de recursos exportada, con el botón Descargar resaltado.

    La plantilla JSON y el archivo de parámetros se descargan en su equipo como un archivo .zip.

  3. Descomprima el archivo en una carpeta a la que pueda acceder fácilmente, como el escritorio.

  4. Abra Visual Studio Code.

Preparación de su entorno local

  1. En el menú Terminal, seleccione Nuevo terminal. Normalmente, la ventana de terminal se abre en la mitad inferior de la pantalla.

  2. Si el shell que se muestra en el lado derecho de la ventana de terminal es Bash, el shell correcto está abierto y puede ir a la sección siguiente.

    Captura de pantalla de la ventana de terminal de Visual Studio Code, en la que se muestra la opción bash.

  3. Si apareciera un shell distinto de Bash, seleccione la flecha de la lista desplegable del shell y, a continuación, seleccione Azure Cloud Shell (Bash).

    Captura de pantalla de la ventana de terminal de Visual Studio Code, en la que se muestra la lista desplegable de shell de terminal y la selección de Git Bash (valor predeterminado).

  4. En la lista de shells de terminal, seleccione Bash.

    Captura de pantalla de la ventana del terminal de Visual Studio Code, con el terminal de Bash seleccionado.

  5. En el terminal, vaya al directorio donde ha guardado la plantilla. Por ejemplo, si ha guardado la plantilla en la carpeta templates, puede usar este comando:

    cd templates
    

Instalación de Bicep

Ejecute el comando siguiente para asegurarse de que tiene la versión más reciente de Bicep:

az bicep install && az bicep upgrade
  1. En el menú Terminal, seleccione Nuevo terminal. Normalmente, la ventana de terminal se abre en la mitad inferior de la pantalla.

  2. Si el shell que se muestra en el lado derecho de la ventana de terminal es powershell o pwsh, el shell correcto está abierto y puede ir a la sección siguiente.

    Captura de pantalla de la ventana de terminal de Visual Studio Code, en la que se muestra la opción pwsh en la lista desplegable de shell.

  3. Si apareciera un shell distinto de powershell o pwsh, seleccione la flecha de la lista desplegable del shell y, a continuación, seleccione PowerShell.

    Captura de pantalla de la ventana del terminal de Visual Studio Code, en la que se muestra la lista desplegable del shell del terminal y PowerShell seleccionado.

  4. En la lista de shells de terminal, seleccione powershell o pwsh.

    Captura de pantalla de la ventana del terminal de Visual Studio Code con el terminal de PowerShell seleccionado.

  5. En el terminal, vaya al directorio donde ha guardado la plantilla. Por ejemplo, si ha guardado la plantilla en la carpeta templates, puede usar este comando:

    Set-Location -Path templates
    

Instalación de la CLI de Bicep

Para usar Bicep desde Azure PowerShell, instale la CLI de Bicep.

Descompilación de la plantilla JSON en Bicep

Use el comando decompile para crear un archivo de Bicep a partir de la plantilla:

az bicep decompile --file template.json

La operación de descompilación genera una advertencia similar a esta:

WARNING: Decompilation is a best-effort process, as there is no guaranteed mapping from ARM JSON
 to Bicep.

You might need to fix warnings and errors in the generated bicep file(s), or decompilation might fail
 entirely if an accurate conversion is not possible.

If you would like to report any issues or inaccurate conversions,
please see https://github.com/Azure/bicep/issues.

Use el comando decompile para crear un archivo de Bicep a partir de la plantilla:

bicep decompile template.json

La operación de descompilación genera una advertencia similar a esta:

WARNING: Decompilation is a best-effort process, as there is no guaranteed mapping from ARM JSON
 to Bicep.

You might need to fix warnings and errors in the generated bicep file(s), or decompilation might fail
 entirely if an accurate conversion is not possible.

If you would like to report any issues or inaccurate conversions,
please see https://github.com/Azure/bicep/issues.

Inspección del archivo de Bicep descompilado

Abra el archivo template.bicep en Visual Studio Code y léalo. Tenga en cuenta que se trata de un archivo de Bicep válido, pero tiene algunos problemas, entre los que se incluyen los siguientes:

  • Los nombres simbólicos asignados a los parámetros y los recursos incluyen caracteres de subrayado y no son fáciles de entender.
  • La propiedad location está codificada de forma rígida en todas las definiciones de recursos.
  • La plantilla incluye valores codificados de forma rígida que deberían ser parámetros o que Azure debería establecer automáticamente.

Solucionará estos problemas en sucesivos apartados de este módulo.

Creación de un archivo de Bicep nuevo

  1. En Visual Studio Code, cree un archivo denominado main.bicep.

  2. Guarde el archivo vacío para que Visual Studio Code cargue las herramientas de Bicep.

    Puede seleccionar Archivo>Guardar como o Ctrl+S en Windows (⌘+S en macOS).

  3. Divida el editor para que pueda ver ambos archivos al mismo tiempo (el archivo template.bicep en el panel izquierdo y el archivo main.bicep en el panel derecho).

    1. Seleccione la pestaña main.bicep.
    2. Seleccione Ver>Diseño del editor>Dividir a la derecha para abrir la pestaña main.bicep en el panel de la derecha.
    3. Cierre la pestaña main.bicep en el panel izquierdo.

    Captura de pantalla del editor de Visual Studio Code dividido, en la que se muestra el archivo template.bicep en el panel izquierdo y el archivo main.bicep en el panel derecho.

Copia de cada elemento en el nuevo archivo de Bicep

  1. Copie el recurso denominado networkSecurityGroups_ToyTruckServer_nsg_name_resource del archivo template.bicep en el archivo main.bicep.

    Mientras lo copia, tenga en cuenta que la propiedad securityRules está vacía. Más adelante en este módulo, refactorizará el archivo para quitar las propiedades redundantes.

  2. Visual Studio Code indica un error porque falta el parámetro networkSecurityGroups_ToyTruckServer_nsg_name:

    Captura de pantalla del editor de Visual Studio Code en la que se muestra el recurso migrado, con una información sobre herramientas que indica un error causado por la falta del parámetro.

    Copie el parámetro en el archivo main.bicep.

  3. Repita el proceso con los siguientes recursos y sus parámetros asociados:

    • publicIPAddresses_ToyTruckServer_ip_name_resource
    • virtualMachines_ToyTruckServer_name_resource
    • virtualNetworks_ToyTruck_vnet_name_resource
    • virtualNetworks_ToyTruck_vnet_name_default
    • networkInterfaces_toytruckserver890_name_resource

    Nota:

    Los nombres de los recursos de su implementación pueden ser diferentes de los que se indican aquí. Busque los recursos que tengan nombres parecidos a estos.

    Mientras copia cada recurso, inspeccione sus propiedades. Más adelante en este módulo, actualizará las propiedades y la configuración de cada recurso para que se ajusten a los procedimientos recomendados de Bicep.

    Sugerencia

    Al convertir o exportar sus propias plantillas, puede actualizar los recursos para que sigan los procedimientos recomendados a medida que los copia. En este módulo, actualizamos los recursos por separado para que sea más fácil entender cada fase del proceso de migración.

Comprobación de los recursos que faltan

  1. En Azure Portal, abra el grupo de recursos ToyTruck.

  2. Revise la lista de recursos y compárela con la del archivo de Bicep. Observe que el grupo de recursos contiene un recurso de Disk que no está definido como resource en el archivo de Bicep:

    Captura de pantalla de Azure Portal en la que se muestra el grupo de recursos, con el recurso de disco resaltado.

    Cuando se trabaja con máquinas virtuales en Bicep, no es necesario definir explícitamente el recurso de disco administrado. En vez de esto, usted define las propiedades de la máquina virtual y Azure crea automáticamente el disco administrado. En este ejemplo, no es necesario que se preocupe de que el recurso de disco no esté definido en el archivo de Bicep.

Comprobación de la plantilla

Al final de la fase de migración, su archivo main.bicep debería tener un aspecto similar al de este ejemplo:

param virtualNetworks_ToyTruck_vnet_name string = 'ToyTruck-vnet'
param virtualMachines_ToyTruckServer_name string = 'ToyTruckServer'
param networkInterfaces_toytruckserver154_name string = 'toytruckserver154'
param publicIPAddresses_ToyTruckServer_ip_name string = 'ToyTruckServer-ip'
param networkSecurityGroups_ToyTruckServer_nsg_name string = 'ToyTruckServer-nsg'

resource networkSecurityGroups_ToyTruckServer_nsg_name_resource 'Microsoft.Network/networkSecurityGroups@2022-05-01' = {
  name: networkSecurityGroups_ToyTruckServer_nsg_name
  location: 'westus3'
  properties: {
    securityRules: []
  }
}

resource publicIPAddresses_ToyTruckServer_ip_name_resource 'Microsoft.Network/publicIPAddresses@2022-05-01' = {
  name: publicIPAddresses_ToyTruckServer_ip_name
  location: 'westus3'
  sku: {
    name: 'Standard'
    tier: 'Regional'
  }
  properties: {
    ipAddress: '1.2.3.4'
    publicIPAddressVersion: 'IPv4'
    publicIPAllocationMethod: 'Static'
    idleTimeoutInMinutes: 4
    ipTags: []
  }
}

resource virtualMachines_ToyTruckServer_name_resource 'Microsoft.Compute/virtualMachines@2022-08-01' = {
  name: virtualMachines_ToyTruckServer_name
  location: 'westus3'
  properties: {
    hardwareProfile: {
      vmSize: 'Standard_D2s_v3'
    }
    storageProfile: {
      imageReference: {
        publisher: 'canonical'
        offer: '0001-com-ubuntu-server-focal'
        sku: '20_04-lts-gen2'
        version: 'latest'
      }
      osDisk: {
        osType: 'Linux'
        name: '${virtualMachines_ToyTruckServer_name}_disk1_23e6a144c4ea4049b3e2be24b78a9e81'
        createOption: 'FromImage'
        caching: 'ReadWrite'
        managedDisk: {
          storageAccountType: 'Premium_LRS'
          id: resourceId('Microsoft.Compute/disks', '${virtualMachines_ToyTruckServer_name}_disk1_23e6a144c4ea4049b3e2be24b78a9e81')
        }
        deleteOption: 'Delete'
        diskSizeGB: 30
      }
      dataDisks: []
    }
    osProfile: {
      computerName: virtualMachines_ToyTruckServer_name
      adminUsername: 'toytruckadmin'
      linuxConfiguration: {
        disablePasswordAuthentication: false
        provisionVMAgent: true
        patchSettings: {
          patchMode: 'ImageDefault'
          assessmentMode: 'ImageDefault'
        }
        enableVMAgentPlatformUpdates: false
      }
      secrets: []
      allowExtensionOperations: true
      requireGuestProvisionSignal: true
    }
    networkProfile: {
      networkInterfaces: [
        {
          id: networkInterfaces_toytruckserver154_name_resource.id
          properties: {
            deleteOption: 'Detach'
          }
        }
      ]
    }
    diagnosticsProfile: {
      bootDiagnostics: {
        enabled: true
      }
    }
  }
}

resource virtualNetworks_ToyTruck_vnet_name_resource 'Microsoft.Network/virtualNetworks@2022-05-01' = {
  name: virtualNetworks_ToyTruck_vnet_name
  location: 'westus3'
  properties: {
    addressSpace: {
      addressPrefixes: [
        '10.0.0.0/16'
      ]
    }
    subnets: [
      {
        name: 'default'
        id: virtualNetworks_ToyTruck_vnet_name_default.id
        properties: {
          addressPrefix: '10.0.0.0/24'
          delegations: []
          privateEndpointNetworkPolicies: 'Disabled'
          privateLinkServiceNetworkPolicies: 'Enabled'
        }
        type: 'Microsoft.Network/virtualNetworks/subnets'
      }
    ]
    virtualNetworkPeerings: []
    enableDdosProtection: false
  }
}

resource virtualNetworks_ToyTruck_vnet_name_default 'Microsoft.Network/virtualNetworks/subnets@2022-05-01' = {
  name: '${virtualNetworks_ToyTruck_vnet_name}/default'
  properties: {
    addressPrefix: '10.0.0.0/24'
    delegations: []
    privateEndpointNetworkPolicies: 'Disabled'
    privateLinkServiceNetworkPolicies: 'Enabled'
  }
  dependsOn: [
    virtualNetworks_ToyTruck_vnet_name_resource
  ]
}

resource networkInterfaces_toytruckserver154_name_resource 'Microsoft.Network/networkInterfaces@2022-05-01' = {
  name: networkInterfaces_toytruckserver154_name
  location: 'westus3'
  kind: 'Regular'
  properties: {
    ipConfigurations: [
      {
        name: 'ipconfig1'
        id: '${networkInterfaces_toytruckserver154_name_resource.id}/ipConfigurations/ipconfig1'
        etag: 'W/"6a38849d-bd59-4eae-856e-4909f7ac1fac"'
        type: 'Microsoft.Network/networkInterfaces/ipConfigurations'
        properties: {
          provisioningState: 'Succeeded'
          privateIPAddress: '10.0.0.4'
          privateIPAllocationMethod: 'Dynamic'
          publicIPAddress: {
            name: 'ToyTruckServer-ip'
            id: publicIPAddresses_ToyTruckServer_ip_name_resource.id
            properties: {
              provisioningState: 'Succeeded'
              resourceGuid: '07079685-0980-4ddf-acc3-3c8797c94b9a'
              publicIPAddressVersion: 'IPv4'
              publicIPAllocationMethod: 'Dynamic'
              idleTimeoutInMinutes: 4
              ipTags: []
              ipConfiguration: {
                id: '${networkInterfaces_toytruckserver154_name_resource.id}/ipConfigurations/ipconfig1'
              }
              deleteOption: 'Detach'
            }
            type: 'Microsoft.Network/publicIPAddresses'
            sku: {
              name: 'Basic'
              tier: 'Regional'
            }
          }
          subnet: {
            id: virtualNetworks_ToyTruck_vnet_name_default.id
          }
          primary: true
          privateIPAddressVersion: 'IPv4'
        }
      }
    ]
    dnsSettings: {
      dnsServers: []
    }
    enableAcceleratedNetworking: true
    enableIPForwarding: false
    disableTcpStateTracking: false
    networkSecurityGroup: {
      id: networkSecurityGroups_ToyTruckServer_nsg_name_resource.id
    }
    nicType: 'Standard'
  }
}

Nota:

Algunas cosas pueden ser diferentes en su plantilla, incluidos algunos de los nombres simbólicos, las versiones de API y las direcciones IP. Eso está bien. Resolverá algunas de estas discrepancias más adelante en el módulo.

Acaba de crear un archivo de Bicep inicial para representar sus recursos. El archivo de Bicep no está bien estructurado y no sigue los procedimientos recomendados. En la siguiente unidad, obtendrá información sobre cómo mejorar la calidad de la plantilla migrada.

Sugerencia

Si usa un sistema de control de versiones como Git, este sería un buen momento para confirmar su trabajo.

Después de comprobar que el archivo main.bicep cierra el archivo template.bicep.