Schnellstart: Auflisten Azure Ressourcen mit dem AzAPI Terraform-Anbieter

Terraform ermöglicht die Definition, Vorschau und Bereitstellung der Cloudinfrastruktur. Mithilfe von Terraform erstellen Sie Konfigurationsdateien mit der HCL-Syntax. Mit der HCL-Syntax können Sie den Cloudanbieter ( z. B. Azure ) und die Elemente angeben, aus denen Ihre Cloudinfrastruktur besteht. Nach der Erstellung Ihrer Konfigurationsdateien erstellen Sie einen Ausführungsplan, mit dem Sie eine Vorschau Ihrer Infrastrukturänderungen anzeigen können, bevor diese bereitgestellt werden. Nachdem Sie die Änderungen überprüft haben, wenden Sie den Ausführungsplan an, um die Infrastruktur bereitzustellen.

In diesem Artikel verwenden Sie die Datenquelle azapi_resource_list, um Azure Ressourcen auflisten und Ergebnisse mit JMESPath Ausdrücken zu filtern. Sie erstellen zwei Speicherkonten, und verwenden azapi_resource_list sie dann zum Auflisten und Extrahieren ihrer Eigenschaften.

  • Erstellen einer Ressourcengruppe und zwei Speicherkonten mit dem AzureRM-Anbieter
  • Verwenden Sie azapi_resource_list, um die Speicherkonten aufzulisten und deren Namen und Speicherorte mithilfe von JMESPath zu extrahieren.

Voraussetzungen

  • Azure-Abonnement: Wenn Sie nicht über ein Azure-Abonnement verfügen, erstellen Sie ein kostenloses Konto , bevor Sie beginnen.

Wenn Sie sich mit einem Microsoft-Konto beim Azure-Portal anmelden, wird das Azure-Standardabonnement für dieses Konto verwendet.

Terraform authentifiziert sich automatisch mithilfe von Informationen aus dem Azure-Standardabonnement.

Führen Sie az account show aus , um das aktuelle Microsoft-Konto und das Azure-Abonnement zu überprüfen.

az account show

Alle Änderungen, die Sie über Terraform vornehmen, befinden sich im angezeigten Azure-Abonnement. Wenn Sie dies wünschen, überspringen Sie den Rest dieses Artikels.

Grundlagen zu response_export_values

Das response_export_values Attribut steuert, welche Eigenschaften aus der API-Antwort extrahiert und im output Attribut der Datenquelle verfügbar gemacht werden. Sie akzeptiert entweder eine Liste oder eine Karte:

  • Liste: Gibt JSON-Pfade an, die extrahiert werden sollen. Wird ["*"] verwendet, um den vollständigen Antworttext zu exportieren.
  • Map: Verwendet JMESPath-Ausdrücke zum Filtern und Umformen der Antwort. Der Schlüssel ist der Name des Ergebnisses, und der Wert ist der JMESPath-Ausdruck.

Das Kartenformular wird bevorzugt, wenn Sie bestimmte Felder extrahieren oder Listenantworten transformieren müssen, da es übersichtlichere, verwendbarere Ausgabewerte erzeugt.

Implementieren des Terraform-Codes

  1. Erstellen Sie ein Verzeichnis, in dem der Terraform-Beispielcode getestet werden soll, und legen Sie es als aktuelles Verzeichnis fest.

  2. Erstellen Sie eine Datei mit dem Namen providers.tf, und fügen Sie den folgenden Code ein:

    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. Erstellen Sie eine Datei mit dem Namen variables.tf, und fügen Sie den folgenden Code ein:

    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. Erstellen Sie eine Datei mit dem Namen main.tf, und fügen Sie den folgenden Code ein:

    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"
    }
    

Führen Sie terraform init aus, um die Terraform-Bereitstellung zu initialisieren. Dieser Befehl lädt den Azure-Anbieter herunter, der zum Verwalten Ihrer Azure-Ressourcen erforderlich ist.

terraform init -upgrade

Wichtige Punkte:

  • Der Parameter -upgrade aktualisiert die erforderlichen Anbieter-Plug-Ins auf die neueste Version, die den Versionseinschränkungen der Konfiguration entspricht.

Führen Sie terraform plan aus, um einen Ausführungsplan zu erstellen.

terraform plan -out main.tfplan

Wichtige Punkte:

  • Der Befehl terraform plan erstellt einen Ausführungsplan, führt ihn aber nicht aus. Stattdessen wird bestimmt, welche Aktionen erforderlich sind, um die in Ihren Konfigurationsdateien angegebene Konfiguration zu erstellen. Mit diesem Muster können Sie überprüfen, ob der Ausführungsplan Ihren Erwartungen entspricht, bevor Sie Änderungen an tatsächlichen Ressourcen vornehmen.
  • Mit dem optionalen -out-Parameter können Sie eine Ausgabedatei für den Plan angeben. Durch die Verwendung des Parameters -out wird sichergestellt, dass genau der von Ihnen überprüfte Plan angewendet wird.

Führen Sie terraform apply aus, um den Ausführungsplan auf Ihre Cloudinfrastruktur anzuwenden.

terraform apply main.tfplan

Wichtige Punkte:

  • Der Beispielbefehl terraform apply setzt voraus, dass Sie zuvor terraform plan -out main.tfplan ausgeführt haben.
  • Wenn Sie einen anderen Dateinamen für den Parameter -out angegeben haben, verwenden Sie denselben Dateinamen im Aufruf von terraform apply.
  • Wenn Sie den Parameter -out nicht verwendet haben, rufen Sie terraform apply ohne Parameter auf.

Ressourcen auflisten mit azapi_resource_list

Nachdem die Speicherkonten erstellt wurden, fügen Sie eine Datenquelle hinzu, um sie aufzulisten und Eigenschaften mithilfe von JMESPath zu extrahieren.

  1. Erstellen Sie eine Datei mit dem Namen list_resources.tf, und fügen Sie den folgenden Code ein:

    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. Erstellen Sie eine Datei mit dem Namen outputs.tf, und fügen Sie den folgenden Code ein:

    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. Führen Sie den Vorgang terraform apply erneut aus, um die Datenquelle zu erstellen und die Ausgaben zu extrahieren:

    terraform apply
    

Wichtige Punkte zu azapi_resource_list

  • Das type Feld identifiziert den Ressourcentyp und die API-Version, die aufgeführt werden soll.
  • Das parent_id-Feld legt den Bereich fest: eine Ressourcengruppen-ID zum Auflisten innerhalb einer Ressourcengruppe, eine Abonnement-ID zum Auflisten innerhalb eines Abonnements oder eine übergeordnete Ressourcen-ID, um untergeordnete Ressourcen aufzulisten (z. B. Subnetze in einem VNet).
  • Die Kartenform von response_export_values verwendet JMESPath-Ausdrücke gegen die unformatierte API-Antwort. Die Speicherkontolisten-API gibt Ergebnisse in einem Array der obersten Ebene value zurück, sodass Ausdrücken mit value[] beginnen.

Auflisten von Ressourcen in verschiedenen Bereichen

Der parent_id bestimmt den Eintragsbereich. Beispiele

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

Bereinigen von Ressourcen

Wenn Sie die über Terraform erstellten Ressourcen nicht mehr benötigen, führen Sie die folgenden Schritte aus:

  1. Führen Sie terraform plan aus, und geben Sie das Flag destroy an.

    terraform plan -destroy -out main.destroy.tfplan
    

    Wichtige Punkte:

    • Der Befehl terraform plan erstellt einen Ausführungsplan, führt ihn aber nicht aus. Stattdessen wird bestimmt, welche Aktionen erforderlich sind, um die in Ihren Konfigurationsdateien angegebene Konfiguration zu erstellen. Mit diesem Muster können Sie überprüfen, ob der Ausführungsplan Ihren Erwartungen entspricht, bevor Sie Änderungen an tatsächlichen Ressourcen vornehmen.
    • Mit dem optionalen -out-Parameter können Sie eine Ausgabedatei für den Plan angeben. Durch die Verwendung des Parameters -out wird sichergestellt, dass genau der von Ihnen überprüfte Plan angewendet wird.
  2. Führen Sie den Befehl terraform apply aus, um den Ausführungsplan anzuwenden.

    terraform apply main.destroy.tfplan
    

Problembehandlung von Terraform auf Azure

Behebung häufiger Probleme bei der Verwendung von Terraform in Azure

Nächste Schritte