Inicio rápido: Enumeración de recursos Azure con el proveedor AzAPI Terraform

Terraform habilita la definición, la versión preliminar y la implementación de la infraestructura en la nube. Con Terraform, se crean archivos de configuración mediante la sintaxis de HCL. La sintaxis de HCL permite especificar el proveedor de la nube, como Azure, y los elementos que componen la infraestructura de la nube. Después de crear los archivos de configuración, se crea un plan de ejecución que permite obtener una vista previa de los cambios de infraestructura antes de implementarlos. Una vez que compruebe los cambios, aplique el plan de ejecución para implementar la infraestructura.

En este artículo, usa el origen de datos azapi_resource_list para enumerar los recursos de Azure y filtrar los resultados con expresiones JMESPath. Cree dos cuentas de almacenamiento y, a continuación, use azapi_resource_list para enumerar y extraer sus propiedades.

  • Creación de un grupo de recursos y dos cuentas de almacenamiento con el proveedor de AzureRM
  • Use azapi_resource_list para enumerar las cuentas de almacenamiento y extraer sus nombres y ubicaciones mediante JMESPath

Prerequisites

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

Al iniciar sesión en Azure Portal con una cuenta Microsoft, se usa la suscripción de Azure predeterminada para esa cuenta.

Terraform se autentica automáticamente mediante la información de la suscripción de Azure predeterminada.

Ejecute az account show para comprobar la cuenta Microsoft actual y la suscripción de Azure.

az account show

Los cambios que realice a través de Terraform se encuentran en la suscripción de Azure mostrada. Si es lo que desea, omita el resto de este artículo.

Conocer response_export_values

El response_export_values atributo controla qué propiedades se extraen de la respuesta de la API y están disponibles en el output atributo del origen de datos. Acepta una lista o un mapa:

  • Lista: Especifica las rutas de acceso JSON que se van a extraer. Use ["*"] para exportar el cuerpo de la respuesta completa.
  • Mapa: usa expresiones JMESPath para filtrar y reformar la respuesta. La clave es el nombre del resultado y el valor es la expresión JMESPath.

Se prefiere la forma de mapa cuando necesita extraer campos específicos o transformar respuestas de lista, ya que genera valores de salida más limpios y utilizables.

Implementación del código de Terraform

  1. Cree un directorio en el que probar el código de ejemplo de Terraform y conviértalo en el directorio actual.

  2. Cree un archivo denominado providers.tf e inserte el siguiente código:

    terraform {
      required_providers {
        azapi = {
          source  = "Azure/azapi"
          version = "~> 2.0"
        }
        azurerm = {
          source  = "hashicorp/azurerm"
          version = "~> 4.0"
        }
        random = {
          source  = "hashicorp/random"
          version = "~> 3.0"
        }
      }
    }
    
    provider "azurerm" {
      features {}
    }
    
    provider "azapi" {}
    
  3. Cree un archivo denominado variables.tf e inserte el siguiente código:

    variable "resource_group_location" {
      type        = string
      default     = "eastus"
      description = "Location of the resource group."
    }
    
    variable "resource_group_name_prefix" {
      type        = string
      default     = "rg"
      description = "Prefix of the resource group name that's combined with a random value to create a unique name."
    }
    
  4. Cree un archivo denominado main.tf e inserte el siguiente código:

    resource "random_pet" "rg_name" {
      prefix = var.resource_group_name_prefix
    }
    
    resource "random_string" "storage_suffix" {
      length  = 8
      upper   = false
      special = false
    }
    
    resource "azurerm_resource_group" "example" {
      location = var.resource_group_location
      name     = random_pet.rg_name.id
    }
    
    resource "azurerm_storage_account" "example" {
      count                    = 2
      name                     = "st${random_string.storage_suffix.result}${count.index}"
      resource_group_name      = azurerm_resource_group.example.name
      location                 = azurerm_resource_group.example.location
      account_tier             = "Standard"
      account_replication_type = "LRS"
    }
    

Ejecute terraform init para inicializar la implementación de Terraform. Este comando descarga el proveedor de Azure necesario para administrar los recursos de Azure.

terraform init -upgrade

Puntos clave:

  • El parámetro -upgrade actualiza los complementos de proveedor necesarios a la versión más reciente que cumpla con las restricciones de versión de la configuración.

Ejecute terraform plan para crear un plan de ejecución.

terraform plan -out main.tfplan

Puntos clave:

  • El comando terraform plan crea un plan de ejecución, pero no lo ejecuta. En su lugar, determina qué acciones son necesarias para crear la configuración especificada en los archivos de configuración. Este patrón le permite comprobar si el plan de ejecución coincide con sus expectativas antes de realizar cambios en los recursos reales.
  • El parámetro opcional -out permite especificar un archivo de salida para el plan. El uso del parámetro -out garantiza que el plan que ha revisado es exactamente lo que se aplica.

Ejecute terraform apply para aplicar el plan de ejecución a su infraestructura en la nube.

terraform apply main.tfplan

Puntos clave:

  • El comando terraform apply de ejemplo asume que ejecutó terraform plan -out main.tfplan previamente.
  • Si especificó un nombre de archivo diferente para el parámetro -out, use ese mismo nombre de archivo en la llamada a terraform apply.
  • Si no ha utilizado el parámetro -out, llame a terraform apply sin ningún parámetro.

Enumeración de recursos con azapi_resource_list

Ahora que se crean las cuentas de almacenamiento, agregue un origen de datos para enumerarlos y extraiga propiedades mediante JMESPath.

  1. Cree un archivo denominado list_resources.tf e inserte el siguiente código:

    data "azapi_resource_list" "storage_accounts" {
      type      = "Microsoft.Storage/storageAccounts@2023-01-01"
      parent_id = azurerm_resource_group.example.id
    
      # Use JMESPath expressions to extract specific fields from the response.
      # The API returns a list of resources in a top-level "value" array.
      response_export_values = {
        "names"     = "value[].name"
        "locations" = "value[].location"
        "skus"      = "value[].sku.name"
      }
    }
    
  2. Cree un archivo denominado outputs.tf e inserte el siguiente código:

    output "resource_group_name" {
      value = azurerm_resource_group.example.name
    }
    
    output "storage_account_names" {
      value = data.azapi_resource_list.storage_accounts.output.names
    }
    
    output "storage_account_locations" {
      value = data.azapi_resource_list.storage_accounts.output.locations
    }
    
    output "storage_account_skus" {
      value = data.azapi_resource_list.storage_accounts.output.skus
    }
    
  3. Vuelva a ejecutar terraform apply para crear el origen de datos y extraer las salidas:

    terraform apply
    

Puntos clave sobre azapi_resource_list

  • El type campo identifica el tipo de recurso y la versión de API que se va a enumerar.
  • El parent_id campo define el alcance: un identificador de grupo de recursos para enumerar dentro de un grupo de recursos, un identificador de suscripción para enumerar en una suscripción, o un identificador de recurso padre para enumerar los recursos secundarios (por ejemplo, subredes dentro de una VNet).
  • El formato de mapa de response_export_values utiliza expresiones JMESPath en la respuesta de la API sin procesar. La API de lista de cuentas de almacenamiento devuelve resultados en una matriz de nivel value superior, por lo que las expresiones comienzan por value[].

Enumeración de recursos en distintos ámbitos

parent_id determina el alcance del listado. Ejemplos:

# List all storage accounts in a subscription
data "azapi_resource_list" "all_storage" {
  type      = "Microsoft.Storage/storageAccounts@2023-01-01"
  parent_id = "/subscriptions/${var.subscription_id}"
  response_export_values = {
    "names" = "value[].name"
  }
}

# List subnets in a virtual network (child resource listing)
data "azapi_resource_list" "subnets" {
  type      = "Microsoft.Network/virtualNetworks/subnets@2023-11-01"
  parent_id = azurerm_virtual_network.example.id
  response_export_values = ["*"]
}

Limpieza de recursos

Cuando ya no necesite los recursos creados a través de Terraform, siga estos pasos:

  1. Ejecute terraform plan y especifique el indicador destroy.

    terraform plan -destroy -out main.destroy.tfplan
    

    Puntos clave:

    • El comando terraform plan crea un plan de ejecución, pero no lo ejecuta. En su lugar, determina qué acciones son necesarias para crear la configuración especificada en los archivos de configuración. Este patrón le permite comprobar si el plan de ejecución coincide con sus expectativas antes de realizar cambios en los recursos reales.
    • El parámetro opcional -out permite especificar un archivo de salida para el plan. El uso del parámetro -out garantiza que el plan que ha revisado es exactamente lo que se aplica.
  2. Ejecute terraform apply para aplicar el plan de ejecución.

    terraform apply main.destroy.tfplan
    

Solución de problemas de Terraform en Azure

Solución de problemas comunes al usar Terraform en Azure

Pasos siguientes