Quickstart: Listar recursos do Azure com o fornecedor AzAPI Terraform

Terraform permite a definição, visualização e implantação de infraestrutura em nuvem. Usando Terraform, você cria arquivos de configuração usando a sintaxe HCL. A sintaxe HCL permite especificar o provedor de nuvem - como o Azure - e os elementos que compõem sua infraestrutura de nuvem. Depois de criares os ficheiros de configuração, crias um plano de execução que te permite pré-visualizar as alterações da infraestrutura antes de serem implementadas. Depois de verificares as alterações, aplicas o plano de execução para implementar a infraestrutura.

Neste artigo, utiliza a fonte de dados azapi_resource_list para listar Azure recursos e filtrar os resultados com expressões JMESPath. Crias duas contas de armazenamento, depois usas azapi_resource_list para listar e extrair as suas propriedades.

  • Crie um grupo de recursos e duas contas de armazenamento com o fornecedor AzureRM
  • Use azapi_resource_list para listar as contas de armazenamento e extrair os seus nomes e localizações usando JMESPath

Pré-requisitos

  • Subscrição do Azure: Se não tiver uma subscrição do Azure, crie uma conta gratuita antes de começar.

Quando inicia sessão no portal do Azure com uma conta Microsoft, é utilizada a subscrição predefinida do Azure para essa conta.

O Terraform autentica automaticamente usando informações da assinatura padrão do Azure.

Execute az account show para verificar a conta Microsoft atual e a assinatura do Azure.

az account show

As alterações que fizer através do Terraform serão aplicadas à subscrição do Azure exibida. Se é isso que você quer, pule o resto deste artigo.

Percebe response_export_values

O response_export_values atributo controla quais as propriedades extraídas da resposta da API e disponibilizadas no output atributo da fonte de dados. Aceita uma lista ou um mapa:

  • Lista: Especifica caminhos JSON a extrair. Use ["*"] para exportar o corpo completo da resposta.
  • Mapa: Utiliza expressões JMESPath para filtrar e remodelar a resposta. A chave é o nome do resultado, e o valor é a expressão JMESPath.

A forma de mapa é preferida quando é necessário extrair campos específicos ou transformar respostas de lista, porque produz valores de saída mais limpos e utilizáveis.

Implementar o código Terraform

  1. Crie um diretório no qual testar o código Terraform de exemplo e torná-lo o diretório atual.

  2. Crie um arquivo chamado providers.tf e insira o seguinte 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. Crie um arquivo chamado variables.tf e insira o seguinte 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. Crie um arquivo chamado main.tf e insira o seguinte 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"
    }
    

Execute terraform init para inicializar a implantação do Terraform. Este comando descarrega o fornecedor Azure necessário para gerir os seus recursos Azure.

terraform init -upgrade

Pontos principais:

  • O -upgrade parâmetro atualiza os plugins do fornecedor necessários para a versão mais recente que cumpra as restrições de versão da configuração.

Execute o comando terraform plan para criar um plano de execução.

terraform plan -out main.tfplan

Pontos principais:

  • O terraform plan comando cria um plano de execução, mas não o executa. Em vez disso, ele determina quais ações são necessárias para criar a configuração especificada em seus arquivos de configuração. Esse padrão permite que você verifique se o plano de execução corresponde às suas expectativas antes de fazer quaisquer alterações nos recursos reais.
  • O parâmetro opcional -out permite-lhe especificar um ficheiro de saída para o plano. Usar o -out parâmetro garante que o plano que analisou é exatamente o que é aplicado.

Executa o Terraform Application para aplicar o plano de execução à tua infraestrutura cloud.

terraform apply main.tfplan

Pontos principais:

  • O comando de exemplo terraform apply pressupõe que já executaste terraform plan -out main.tfplan anteriormente.
  • Se você especificou um nome de arquivo diferente para o parâmetro -out, use esse mesmo nome de arquivo na chamada para terraform apply.
  • Se não usaste o -out parâmetro, chama terraform apply sem nenhum parâmetro.

Listar recursos com azapi_resource_list

Agora que as contas de armazenamento foram criadas, adicione uma fonte de dados para as listar e extraia propriedades usando JMESPath.

  1. Crie um arquivo chamado list_resources.tf e insira o seguinte 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. Crie um arquivo chamado outputs.tf e insira o seguinte 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. Execute terraform apply novamente para criar a fonte de dados e extrair as saídas:

    terraform apply
    

Pontos-chave sobre azapi_resource_list

  • O type campo identifica o tipo de recurso e a versão da API a listar.
  • O parent_id campo define o âmbito: um ID de grupo de recursos para listar dentro de um grupo de recursos, um ID de subscrição para listar numa subscrição, ou um ID de recurso pai para listar recursos filhos (por exemplo, sub-redes sob um VNet).
  • A forma de mapa de response_export_values utiliza expressões JMESPath contra a resposta bruta da API. A API da lista de contas de armazenamento devolve resultados num array de topo value , pelo que as expressões começam com value[].

Liste recursos em diferentes áreas

Determina parent_id o âmbito do anúncio. Examples:

# 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 = ["*"]
}

Limpeza de recursos

Quando já não precisares dos recursos criados via Terraform, faz os seguintes passos:

  1. Execute terraform plan e especifique o parâmetro destroy.

    terraform plan -destroy -out main.destroy.tfplan
    

    Pontos principais:

    • O terraform plan comando cria um plano de execução, mas não o executa. Em vez disso, ele determina quais ações são necessárias para criar a configuração especificada em seus arquivos de configuração. Esse padrão permite que você verifique se o plano de execução corresponde às suas expectativas antes de fazer quaisquer alterações nos recursos reais.
    • O parâmetro opcional -out permite-lhe especificar um ficheiro de saída para o plano. Usar o -out parâmetro garante que o plano que analisou é exatamente o que é aplicado.
  2. Execute terraform apply para aplicar o plano de execução.

    terraform apply main.destroy.tfplan
    

Solucionar problemas do Terraform no Azure

Solucionar problemas comuns ao usar o Terraform no Azure

Passos seguintes