Início Rápido: Listar recursos Azure com o provedor Terraform do AzAPI

O Terraform permite a definição, a visualização e a implantação da infraestrutura de nuvem. Usando o Terraform, você cria arquivos de configuração usando a sintaxe HCL. A sintaxe da HCL permite que você especifique o provedor de nuvem, como o Azure, e os elementos que compõem sua infraestrutura de nuvem. Depois de criar os arquivos de configuração, você cria um plano de execução que permite visualizar as alterações de infraestrutura antes de serem implantadas. Depois de verificar as alterações, você aplica o plano de execução para implantar a infraestrutura.

Neste artigo, você usa a fonte de dados azapi_resource_list para listar Azure recursos e filtrar resultados com expressões JMESPath. Você cria duas contas de armazenamento e usa azapi_resource_list para listar e extrair suas propriedades.

  • Criar um grupo de recursos e duas contas de armazenamento com o provedor do AzureRM
  • Use azapi_resource_list para listar as contas de armazenamento e extrair seus nomes e locais usando o JMESPath

Pré-requisitos

  • Assinatura do Azure: Se você não tiver uma assinatura do Azure, crie uma conta gratuita antes de começar.

Quando você faz logon no portal do Azure com uma conta da Microsoft, a assinatura padrão do Azure para essa conta é usada.

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

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

az account show

Todas as alterações feitas por meio do Terraform estão na assinatura exibida do Azure. Se é isso que você quer, ignore o restante deste artigo.

Entender o response_export_values

O response_export_values atributo controla quais propriedades são extraídas da resposta da API e disponibilizadas no output atributo da fonte de dados. Ele aceita uma lista ou um mapa:

  • Lista: especifica caminhos JSON a serem extraídos. Use ["*"] para exportar o corpo completo da resposta.
  • Mapa: usa expressões JMESPath para filtrar e remodelar a resposta. A chave é o nome do resultado e o valor é a expressão JMESPath.

O formulário de mapa é preferencial quando você precisa extrair campos específicos ou transformar respostas de lista, pois ele produz valores de saída mais limpos e utilizáveis.

Implementar o código Terraform

  1. Crie um diretório em que você vai testar o código de exemplo do Terraform, depois transforme-o no 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. Esse comando baixa o provedor de Azure necessário para gerenciar seus recursos de Azure.

terraform init -upgrade

Pontos principais:

  • O parâmetro -upgrade atualiza os plug-ins do provedor necessários para a versão mais recente que esteja em conformidade com 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 comando terraform plan 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 verificar se o plano de execução corresponde às suas expectativas antes de fazer alterações nos recursos reais.
  • O parâmetro opcional -out permite que você especifique um arquivo de saída para o plano. Usar o parâmetro -out garante que o plano que você examinou seja exatamente o que é aplicado.

Execute o comando terraform apply para aplicar o plano de execução à sua infraestrutura de nuvem.

terraform apply main.tfplan

Pontos principais:

  • O comando de exemplo terraform apply pressupõe que você executou terraform plan -out main.tfplananteriormente.
  • 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 você não usou o parâmetro -out, chame terraform apply sem nenhum parâmetro.

Listar recursos com azapi_resource_list

Agora que as contas de armazenamento são criadas, adicione uma fonte de dados para listá-las e extrair 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 ser listada.
  • O campo parent_id define o escopo: uma ID de grupo de recursos para listar dentro de um grupo de recursos, uma ID de assinatura para listar em toda uma assinatura, ou uma ID de recurso pai para listar recursos filhos (por exemplo, sub-redes em uma VNet).
  • A forma de mapa de response_export_values usa expressões JMESPath contra a resposta bruta da API. A API da lista de contas de armazenamento retorna resultados em uma matriz de nível value superior, portanto, as expressões começam com value[].

Listar recursos em escopos diferentes

Determina parent_id o escopo de listagem. Exemplos:

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

Limpar os recursos

Quando você não precisar mais dos recursos criados por meio do Terraform, execute as seguintes etapas:

  1. Execute o comando terraform plan e especifique a flag destroy.

    terraform plan -destroy -out main.destroy.tfplan
    

    Pontos principais:

    • O comando terraform plan 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 verificar se o plano de execução corresponde às suas expectativas antes de fazer alterações nos recursos reais.
    • O parâmetro opcional -out permite que você especifique um arquivo de saída para o plano. Usar o parâmetro -out garante que o plano que você examinou seja exatamente o que é aplicado.
  2. Execute o comando 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

Próximas Etapas