Selección y asignación de nombres de recursos personalizados mediante Azure Export for Terraform

Azure Export for Terraform incluye varias opciones para personalizar los recursos que exporta.

En este artículo, conocerá las ventajas y desventajas de cada opción.

  • Uso de la interfaz de usuario
  • Uso del modo de consulta
  • Uso de un archivo de asignación

Uso de la interfaz de usuario

Al ejecutar Azure Export for Terraform en modo interactivo, aparecen los recursos especificados (a través de los parámetros que indique al ejecutarlos). De forma predeterminada, se exportan todos los recursos.

La opción Delete actúa como un botón de activación para omitir o incluir recursos. Para quitar recursos de la exportación, use las teclas de dirección para seleccionar el recurso deseado y pulse Delete. El recurso se actualiza para que se vea la opción Omitir ("Skip").

Para deshacer la acción de omitir, compruebe que el recurso omitido está seleccionado y pulse Delete de nuevo.

Ventajas:

  • Solo se necesita usar una sola tecla de activación.
  • No es necesario conocer los recursos que desea antes de ejecutar el comando.

Inconvenientes:

  • La acción puede llevar mucho tiempo si tiene muchos recursos entre los que desplazarse y que omitir.

Uso del modo de consulta

La técnica de aplicar un filtro mediante la sintaxis de consultas de Azure Resource Graph es eficaz cuando sabe exactamente qué filtros necesita.

aztfexport query [option] <ARG_where_predicate>

Por ejemplo, supongamos que hay un grupo de recursos denominado myResourceGroup que tiene muchos recursos, incluido un recurso de red. Si desea exportar solo el recurso de red, puede usar la sintaxis siguiente:

aztfexport query -n "resourceGroup =~ 'myResourceGroup' and type contains 'Microsoft.Network'"

Ventajas:

  • Comando único sin que haga falta editarlo manualmente.
  • Acepta un número ilimitado de filtros.
  • Controla una gran cantidad de recursos de forma eficaz.

Inconvenientes:

  • Fácil de excluir recursos que necesita exportar.
  • Se necesitan conocimientos sobre sintaxis de Azure Resource Graph.

Uso de un archivo de asignación

En la sintaxis siguiente se muestran los conceptos básicos para exportar una serie de recursos que se define en un archivo de asignación de recursos:

aztfexport mapping-file [option] <resource_mapping_file>

Puede usar un archivo de asignación en los modos interactivo o no interactivo:

  • Modo interactivo: pulse s al ejecutarse de forma interactiva en la vista de lista de recursos.
  • Modo no interactivo: puede generar el archivo de asignación en todos los comandos de exportación (resource, resource-group, query, mapping file) agregando la flag --generate-mapping-file.

Si en su caso se necesitan modificaciones previas a la exportación, puede construir o editar manualmente el archivo de asignación. Estos son algunos ejemplos de cuándo es aconsejable editar manualmente su propio archivo de asignación:

Caso de uso Pasos
Hay muchos recursos en un grupo de recursos, pero solo necesita exportar algunos específicos. Elimine los objetos JSON del editor que prefiera y guarde el archivo antes de exportarlo.
Quiere cambiar el nombre de todos los recursos de la misma forma. Cambie la propiedad resource-name en cualquier nombre que comparta los mismos reglas de cumplimiento de la empresa.
Tiene que refactorizar un conjunto de recursos según su tipo de recurso; por ejemplo, de red o de proceso. Use el editor para buscar todos los recursos Microsoft.Network o Microsoft.Compute.

Por ejemplo, supongamos que ejecuta el siguiente comando en un grupo de recursos que contiene una máquina virtual:

aztfexport rg --generate-mapping-file --non-interactive myResourceGroup

Los resultados son similares al del siguiente archivo JSON:

{
	"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/virtualMachines/vm-MyResourceGroup/extensions/OmsAgentForLinux": {
		"resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/virtualMachines/vm-MyResourceGroup/extensions/OmsAgentForLinux",
		"resource_type": "azurerm_virtual_machine_extension",
		"resource_name": "res-0"
	},
	"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup": {
		"resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup",
		"resource_type": "azurerm_resource_group",
		"resource_name": "res-1"
	},
	"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/sshPublicKeys/vm-MyResourceGroup_key": {
		"resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/sshPublicKeys/vm-MyResourceGroup_key",
		"resource_type": "azurerm_ssh_public_key",
		"resource_name": "res-2"
	},
	"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/virtualMachines/vm-MyResourceGroup": {
		"resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/virtualMachines/vm-MyResourceGroup",
		"resource_type": "azurerm_linux_virtual_machine",
		"resource_name": "res-3"
	},
	"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/networkInterfaces/vm-myResourceGroup-vm-d146": {
		"resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/networkInterfaces/vm-myResourceGroup-vm-d146",
		"resource_type": "azurerm_network_interface",
		"resource_name": "res-4"
	},
	"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/networkInterfaces/vm-myResourceGroup-vm-d146/networkSecurityGroups/L3N1YnNjcmlwdGlvbnMvZGJmM2I2Y2ItYzFkMC00ZDA0LTk0YjktNTE1MDliOGQzM2ZkL3Jlc291cmNlR3JvdXBzL2hhc2hpY29uZi12bS1kZW1vL3Byb3ZpZGVycy9NaWNyb3NvZnQuTmV0d29yay9uZXR3b3JrU2VjdXJpdHlHcm91cHMvdm0taGFzaGljb25mLXZtLWRlbW8tbnNn": {
		"resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/networkInterfaces/vm-myResourceGroup-vm-d146|/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/networkSecurityGroups/vm-MyResourceGroup-nsg",
		"resource_type": "azurerm_network_interface_security_group_association",
		"resource_name": "res-5"
	},
	"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/networkSecurityGroups/vm-MyResourceGroup-nsg": {
		"resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/networkSecurityGroups/vm-MyResourceGroup-nsg",
		"resource_type": "azurerm_network_security_group",
		"resource_name": "res-6"
	},
	"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/publicIPAddresses/vm-MyResourceGroup-ip": {
		"resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/publicIPAddresses/vm-MyResourceGroup-ip",
		"resource_type": "azurerm_public_ip",
		"resource_name": "res-7"
	},
	"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/virtualNetworks/MyResourceGroup-vnet": {
		"resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/virtualNetworks/MyResourceGroup-vnet",
		"resource_type": "azurerm_virtual_network",
		"resource_name": "res-8"
	},
	"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/virtualNetworks/MyResourceGroup-vnet/subnets/default": {
		"resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/virtualNetworks/MyResourceGroup-vnet/subnets/default",
		"resource_type": "azurerm_subnet",
		"resource_name": "res-9"
	}
}

Solo el valor de objeto del archivo de asignación es importante. La clave (el valor predeterminado es el resource_id de Azure) es solo un identificador en este modo.

Ahora, supongamos que queremos mantener el grupo de recursos y los recursos relacionados con el proceso y modificar el valor resource_name.

Podríamos modificar el archivo de asignación de la siguiente manera:

{
	"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup": {
		"resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup",
		"resource_type": "azurerm_resource_group",
		"resource_name": "myResourceGroup"
	},
	"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM": {
		"resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM",
		"resource_type": "azurerm_linux_virtual_machine",
		"resource_name": "myVM"
	},
	"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup/providers/Microsoft.Compute/sshPublicKeys/myKey": {
		"resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup/providers/Microsoft.Compute/sshPublicKeys/myKey",
		"resource_type": "azurerm_ssh_public_key",
		"resource_name": "myKey"
	},
	"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/vm-myResourceGroup/extensions/OmsAgentForLinux": {
		"resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/vm-myResourceGroup/extensions/OmsAgentForLinux",
		"resource_type": "azurerm_virtual_machine_extension",
		"resource_name": "myVMExtension"
	}
}

Una vez que edite el archivo de asignación, expórtelo mediante el siguiente comando:

aztfexport map -n "aztfexportResourceMapping.json"

Ventajas:

  • Como está editando un archivo, puede usar un editor para buscar y reemplazar lo que debe eliminar o editar.
  • El flujo final del JSON permite una funcionalidad única, como el scripting para filtrar.
  • Puede cambiar el nombre de los recursos para que se ajusten a las reglas sobre nombres.
  • Puede refactorizar el JSON en varios archivos de asignación.
  • Maneja grandes cantidades de recursos.

Inconvenientes:

  • En contextos simples, esta técnica podría sobrar.
  • Se necesitan modificaciones manuales.

Uso de bloques de importación de Terraform

Cuando se ejecuta aztfexport v0.13 o superior junto a Terraform v1.5 o superior, el --generate-import-block comando genera un archivo de asignación junto con un import.tf archivo. El archivo import.tf incluye bloques de importación para cada uno de los recursos aztfexport que se pudieron asignar. A partir de aquí, la configuración funciona de igual manera que el flujo de trabajo del bloque de importación preexistente. Para finalizar, ejecute terraform plan.

Para eliminar o filtrar recursos de la exportación final, puede eliminar el bloque que contiene el ID del recurso y demás información.

Comparativa entre bloques de importación y Azure Export

Es habitual preguntarse la diferencia entre usar Azure Export for Terraform y bloques de importación. Las ventajas de las dos herramientas que hemos observado son las siguientes:

  • Azure Export for Terraform es útil para detectar recursos. Existen varios métodos disponibles para detectar y exportar los recursos que desee.
  • Azure Export for Terraform incluye un sistema de filtrado de recursos, aunque también se puede hacer por medios manuales y automatizados.
  • Azure Export for Terraform genera automáticamente bloques de importación en sus resultados, lo que ahorra tiempo y esfuerzo en el proceso de creación.
  • Los bloques de importación de Terraform se admiten de forma nativa en Terraform, lo que facilita su uso. Creemos que el uso conjunto de ambos aporta una gran ventaja.

Ventajas:

  • Flujo de trabajo compatible con Terraform nativo. No se necesita JSON.
  • Como está editando un archivo, puede usar un editor para buscar y reemplazar lo que debe eliminar o editar.
  • Puede cambiar el nombre de los recursos para que se ajusten a las reglas sobre nombres.
  • Maneja grandes cantidades de recursos.

Inconvenientes:

  • En contextos simples, esta técnica podría sobrar.
  • Se necesitan hacer modificaciones manuales para filtrar.
  • No funciona con versiones anteriores de Terraform.

Resumen

En este artículo, ha conocido las distintas opciones para filtrar los recursos al exportar con Azure Export for Terraform.

Pasos siguientes