Använda providerfunktioner i AzAPI Terraform-providern

Terraform möjliggör definition, förhandsversion och distribution av molninfrastruktur. Med Terraform skapar du konfigurationsfiler med hjälp av HCL-syntax. Med HCL-syntaxen kan du ange molnleverantören – till exempel Azure – och de element som utgör din molninfrastruktur. När du har skapat konfigurationsfilerna skapar du en körningsplan som gör att du kan förhandsgranska ändringarna i infrastrukturen innan de distribueras. När du har verifierat ändringarna tillämpar du genomförandeplanen för att implementera infrastrukturen.

AzAPI v2.0 och senare innehåller en uppsättning provider-funktioner för att konstruera och parsa Azure resurs-ID:er. Leverantörsfunktioner körs under planeringsfasen i Terraform-konfigurationen och kräver inte någon sökning efter datakälla eller ett nätverksanrop. De minskar kodkomplexiteten när konfigurationen behöver konstruera eller dela upp resurs-ID:t.

Anmärkning

Providerfunktioner kräver Terraform 1.8 eller senare.

Tillgängliga providerfunktioner

Function Beskrivning
build_resource_id Konstruerar ett resurs-ID från ett överordnat ID, resurstyp och resursnamn. Stödjer både resurser på toppnivå och kapslade resurser.
extension_resource_id Konstruerar ett tilläggsresurs-ID från ett basresurs-ID, resurstyp och resursnamn.
management_group_resource_id Konstruerar ett resurs-ID för hanteringsgruppsomfång.
parse_resource_id Parsar ett Azure resurs-ID i dess komponentdelar (prenumerations-ID, resursgruppsnamn, providernamnområde, resursnamn med mera).
resource_group_resource_id Konstruerar ett resursgruppsomfångsbegränsat resurs-ID från ett prenumerations-ID, resursgruppsnamn, resurstyp och resursnamn.
subscription_resource_id Konstruerar ett resurs-ID med prenumerationsomfång.
tenant_resource_id Konstruerar ett hyresgästspecificerat resurs-ID.

Förutsättningar

  • Azure-prenumeration: Om du inte har en Azure-prenumeration skapar du ett kostnadsfritt konto innan du börjar.

Se till att konfigurationen deklarerar AzAPI v2.0 eller senare och Terraform 1.8 eller senare:

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

Parsa ett resurs-ID med parse_resource_id

Använd parse_resource_id för att dela upp ett befintligt Azure resurs-ID i dess enskilda komponenter. Funktionen är användbar när du behöver prenumerations-ID, resursgruppsnamn eller resursnamn från en resurs som hanteras någon annanstans i konfigurationen eller skickas som en variabel.

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
}

Funktionen returnerar ett objekt med följande fält:

  • id — det fullständiga resurs-ID:t
  • name — resursnamnet
  • parent_id – resurs-ID för den överordnade resursen
  • parts — en karta över alla resurs-ID-segment
  • provider_namespace (till exempel Microsoft.Storage)
  • resource_group_name
  • resource_group_id
  • subscription_id
  • type (till exempel Microsoft.Storage/storageAccounts)

Skapa ett resursgruppsomfångs-ID med resource_group_resource_id

Använd resource_group_resource_id när du behöver referera till ett resurs-ID för en resurs som du inte hanterar i Terraform (till exempel en befintlig resurs som skickas som en variabel) eller när du vill skapa ett förutsägbart ID innan resursen skapas.

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

Parametern resursnamn accepterar en lista som stöder kapslade resurstyper. Om du till exempel vill skapa ett undernäts-ID:

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]
  )
}

Skapa ett prenumerationsomfångs-ID med subscription_resource_id

Använd subscription_resource_id för resurser som är begränsade på prenumerationsnivå, till exempel resursgrupper eller principtilldelningar:

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

Skapa ett hanteringsgruppsomfångs-ID med management_group_resource_id

Använd management_group_resource_id för resurser inom hanteringsgruppen, till exempel principtilldelningar och rolltilldelningar:

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

Skapa ett tilläggsresurs-ID med extension_resource_id

Används extension_resource_id för tilläggsresurser som är kopplade till en annan resurs, till exempel lås eller rolltilldelningar på en specifik resurs:

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

Skapa ett resurs-ID med build_resource_id

Använd build_resource_id när ett överordnat resurs-ID avgör omfånget och du inte behöver ange prenumeration eller resursgrupp separat. Den här funktionen härleder omfånget från det överordnade ID:t:

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

Jämför med datakällans metoder

Providerfunktioner är att föredra framför datakällor för ID-konstruktion och parsning eftersom de:

  • Kör helt under planeringstiden utan nätverksanrop.
  • Lägg inte till resurser i Terraform-tillstånd.
  • Är deterministiska och kräver inte depends_on ordning.

Använd azapi_resource datakälla när du behöver läsa liveegenskaper för en resurs, inte bara skapa eller parsa dess ID.

Nästa steg