Usare le funzioni del provider nel provider AzAPI Terraform

Terraform consente di definire, visualizzare in anteprima e distribuire l'infrastruttura cloud. Con Terraform è possibile creare file di configurazione usando la sintassi HCL. La sintassi HCL consente di specificare il provider di servizi cloud, ad esempio Azure, e gli elementi che costituiscono l'infrastruttura cloud. Dopo aver creato i file di configurazione, si crea un piano di esecuzione che consente di visualizzare in anteprima le modifiche dell'infrastruttura prima della distribuzione. Dopo aver verificato le modifiche, è possibile applicare il piano di esecuzione per distribuire l'infrastruttura.

AzAPI v2.0 e versioni successive include un set di funzioni provider per la creazione e l'analisi di ID risorsa Azure. Le funzioni del provider vengono eseguite in fase di pianificazione all'interno della configurazione di Terraform e non richiedono una ricerca dell'origine dati o una chiamata di rete. Riducono la complessità del codice quando la configurazione deve costruire o scomporre gli ID risorsa.

Note

Le funzioni del provider richiedono Terraform 1.8 o versione successiva.

Funzioni del provider disponibili

Function Descrizione
build_resource_id Costruisce un ID della risorsa da un ID padre, un tipo di risorsa e un nome di risorsa. Supporta sia le risorse di primo livello che le risorse annidate.
extension_resource_id Costruisce un ID risorsa di estensione da un ID risorsa di base, un tipo di risorsa e i nomi delle risorse.
management_group_resource_id Costruisce un ID risorsa con ambito gruppo di gestione.
parse_resource_id Analizza un ID risorsa Azure nei suoi componenti (ID della sottoscrizione, nome del gruppo di risorse, spazio dei nomi del provider, nome della risorsa e altro ancora).
resource_group_resource_id Costruisce un ID risorsa con ambito gruppo di risorse da un ID sottoscrizione, un nome del gruppo di risorse, un tipo di risorsa e nomi di risorse.
subscription_resource_id Costruisce un ID della risorsa a livello di sottoscrizione.
tenant_resource_id Crea un ID risorsa specifico per il tenant.

Prerequisiti

  • Sottoscrizione di Azure: se non si ha una sottoscrizione di Azure, creare un account gratuito prima di iniziare.

Verificare che la configurazione dichiari AzAPI v2.0 o versione successiva e Terraform 1.8 o versione successiva:

terraform {
  required_version = ">= 1.8"
  required_providers {
    azapi = {
      source  = "Azure/azapi"
      version = "~> 2.0"
    }
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "~> 4.0"
    }
  }
}

provider "azurerm" {
  features {}
}

provider "azapi" {}

Analizzare un ID risorsa con parse_resource_id

Usare parse_resource_id per scomporre un ID risorsa Azure esistente nei singoli componenti. La funzione è utile quando è necessario l'ID sottoscrizione, il nome del gruppo di risorse o il nome della risorsa da una risorsa gestita altrove nella tua configurazione o passata come variabile.

locals {
  storage_id_parts = provider::azapi::parse_resource_id(
    "Microsoft.Storage/storageAccounts",
    azurerm_storage_account.example.id
  )
}

output "subscription_id" {
  value = local.storage_id_parts.subscription_id
}

output "resource_group_name" {
  value = local.storage_id_parts.resource_group_name
}

output "storage_account_name" {
  value = local.storage_id_parts.name
}

La funzione restituisce un oggetto con questi campi:

  • id — ID risorsa completo
  • name — il nome della risorsa
  • parent_id — ID risorsa della risorsa padre
  • parts — una mappa di tutti i segmenti ID di risorsa
  • provider_namespace (ad esempio, Microsoft.Storage)
  • resource_group_name
  • resource_group_id
  • subscription_id
  • type (ad esempio, Microsoft.Storage/storageAccounts)

Creare un ID con ambito di gruppo di risorse con resource_group_resource_id

Usare resource_group_resource_id quando è necessario fare riferimento a un ID risorsa per una risorsa non gestita in Terraform (ad esempio, una risorsa esistente passata come variabile) o quando si vuole costruire un ID stimabile prima della creazione della risorsa.

variable "subscription_id" {
  type = string
}

variable "existing_resource_group" {
  type = string
}

variable "existing_storage_account" {
  type = string
}

locals {
  storage_account_id = provider::azapi::resource_group_resource_id(
    var.subscription_id,
    var.existing_resource_group,
    "Microsoft.Storage/storageAccounts",
    [var.existing_storage_account]
  )
}

# Reference the pre-existing storage account without a data source lookup
resource "azapi_resource_action" "regenerate_key" {
  type        = "Microsoft.Storage/storageAccounts@2023-01-01"
  resource_id = local.storage_account_id
  action      = "regenerateKey"
  method      = "POST"

  body = {
    keyName = "key1"
  }
}

Il parametro resource names accetta un elenco per supportare i tipi di risorse annidati. Ad esempio, per costruire un ID subnet:

locals {
  subnet_id = provider::azapi::resource_group_resource_id(
    var.subscription_id,
    var.resource_group_name,
    "Microsoft.Network/virtualNetworks/subnets",
    [var.vnet_name, var.subnet_name]
  )
}

Costruire un ID con ambito di sottoscrizione utilizzando subscription_resource_id

Usare subscription_resource_id per le risorse con ambito a livello di sottoscrizione, ad esempio gruppi di risorse o assegnazioni di criteri:

locals {
  resource_group_id = provider::azapi::subscription_resource_id(
    var.subscription_id,
    "Microsoft.Resources/resourceGroups",
    [var.resource_group_name]
  )
}

Costruire un ID con ambito a livello di gruppo di gestione con management_group_resource_id

Usare management_group_resource_id per le risorse con ambito gruppo di gestione, ad esempio assegnazioni di criteri e assegnazioni di ruolo:

locals {
  mg_policy_id = provider::azapi::management_group_resource_id(
    var.management_group_name,
    "Microsoft.Authorization/policyAssignments",
    [var.policy_assignment_name]
  )
}

Costruisci un ID risorsa di estensione con extension_resource_id

Usare extension_resource_id per le risorse di estensione associate a un'altra risorsa, ad esempio blocchi o assegnazioni di ruolo in una risorsa specifica:

locals {
  lock_id = provider::azapi::extension_resource_id(
    azurerm_storage_account.example.id,
    "Microsoft.Authorization/locks",
    [var.lock_name]
  )
}

Creare un ID risorsa con build_resource_id

Usare build_resource_id quando un ID risorsa padre definisce l'ambito e non è necessario specificare separatamente la sottoscrizione o il gruppo di risorse. Questa funzione deduce l'ambito dall'ID padre:

locals {
  subnet_id = provider::azapi::build_resource_id(
    azurerm_virtual_network.example.id,
    "Microsoft.Network/virtualNetworks/subnets",
    var.subnet_name
  )
}

Confrontare con gli approcci alla sorgente dati

Le funzioni del provider sono preferibili rispetto alle origini dati per la costruzione e l'analisi degli ID perché:

  • Viene eseguito interamente in fase di pianificazione senza chiamate di rete.
  • Non aggiungere risorse allo stato di Terraform.
  • Sono deterministici e non richiedono l'ordinamento di depends_on.

Usare l'origine azapi_resource dati quando è necessario consultare le proprietà attive di una risorsa, non solo costruire o interpretare il rispettivo ID.

Passaggi successivi