Providerfuncties gebruiken in de AzAPI Terraform-provider

Terraform maakt de definitie, preview en implementatie van de cloudinfrastructuur mogelijk. Met Terraform maakt u configuratiebestanden met behulp van HCL-syntaxis. Met de HCL-syntaxis kunt u de cloudprovider opgeven, zoals Azure, en de elementen waaruit uw cloudinfrastructuur bestaat. Nadat u uw configuratiebestanden hebt gemaakt, maakt u een uitvoeringsplan waarmee u een voorbeeld van uw infrastructuurwijzigingen kunt bekijken voordat ze worden geïmplementeerd. Zodra u de wijzigingen hebt gecontroleerd, past u het uitvoeringsplan toe om de infrastructuur te implementeren.

AzAPI v2.0 en hoger bevat een set providerfuncties voor het maken en parseren van Azure resource-id's. Providerfuncties worden uitgevoerd op plantijd binnen de Terraform-configuratie en vereisen geen opzoekactie voor gegevensbronnen of een netwerkoproep. Ze verminderen de complexiteit van code wanneer uw configuratie resource-ID's moet maken of decomponeren.

Note

Voor providerfuncties is Terraform 1.8 of hoger vereist.

Beschikbare providerfuncties

Function Beschrijving
build_resource_id Maakt een resource-ID van een ouder-ID, resourcetype en resourcenaam. Ondersteunt zowel toplevel- als geneste resources.
extension_resource_id Maakt een extensieresource-id op basis van een basisresource-id, resourcetype en resourcenamen.
management_group_resource_id Construeert een resource-ID binnen het bereik van een beheergroep.
parse_resource_id Parseert een Azure resource-id in de onderdelen ervan (abonnements-id, resourcegroepnaam, providernaamruimte, resourcenaam en meer).
resource_group_resource_id Hiermee wordt een resourcegroep-id gemaakt op basis van een abonnements-id, resourcegroepnaam, resourcetype en resourcenamen.
subscription_resource_id Maakt een resource-id binnen het subscriptiebereik.
tenant_resource_id Maakt een resource-ID met een tenant-bereik.

Prerequisites

  • Azure-abonnement: als u nog geen abonnement op Azure hebt, maakt u een gratis Azure-account aan voordat u begint.

Zorg ervoor dat uw configuratie AzAPI v2.0 of hoger en Terraform 1.8 of hoger declareert:

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

Een resource-id parseren met parse_resource_id

Gebruik parse_resource_id om een bestaande Azure resource-id op te delen in de afzonderlijke onderdelen. De functie is handig wanneer u de abonnements-id, resourcegroepnaam of resourcenaam nodig hebt van een resource die elders in uw configuratie wordt beheerd of als variabele is doorgegeven.

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
}

De functie retourneert een object met deze velden:

  • id — de volledige resource-ID
  • name — de resourcenaam
  • parent_id — de resource-ID van de bovenliggende resource
  • parts — een kaart van alle resource-id-segmenten
  • provider_namespace (bijvoorbeeld, Microsoft.Storage)
  • resource_group_name
  • resource_group_id
  • subscription_id
  • type (bijvoorbeeld, Microsoft.Storage/storageAccounts)

Een resourcegroep-bereik-id maken met resource_group_resource_id

Gebruik resource_group_resource_id deze opdracht wanneer u naar een resource-id moet verwijzen voor een resource die u niet beheert in Terraform (bijvoorbeeld een bestaande resource die als variabele is doorgegeven), of wanneer u een voorspelbare id wilt maken voordat u resources maakt.

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

De parameter resourcenamen accepteert een lijst ter ondersteuning van geneste resourcetypen. Als u bijvoorbeeld een subnet-id wilt maken:

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

Een abonnementsbereik-ID maken met subscription_resource_id

Gebruiken subscription_resource_id voor resources binnen het bereik op abonnementsniveau, zoals resourcegroepen of beleidstoewijzingen:

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

Maak een ID voor beheergroep-scoping met management_group_resource_id

Gebruiken management_group_resource_id voor beheergroepsbronnen, zoals beleidstoewijzingen en roltoewijzingen:

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

Een extensie-resource-ID maken met extension_resource_id

Gebruiken extension_resource_id voor extensieresources die zijn gekoppeld aan een andere resource, zoals vergrendelingen of roltoewijzingen voor een specifieke resource:

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

Een resource-id maken met build_resource_id

Gebruik build_resource_id wanneer een bovenliggende resource-ID het bereik bepaalt en u geen abonnement of resourcegroep afzonderlijk hoeft op te geven. Met deze functie wordt het bereik afgeleid van de parent-ID.

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

Vergelijken met benaderingen voor gegevensbronnen

Providerfuncties hebben de voorkeur boven gegevensbronnen voor het bouwen en parseren van id's, omdat ze:

  • Voer volledig uit op plantijd zonder netwerkoproepen.
  • Voeg geen resources toe aan de Terraform-state.
  • Zijn deterministisch en vereisen geen depends_on volgorde.

Gebruik azapi_resource gegevensbron wanneer u live-eigenschappen van een resource moet lezen, niet alleen de id samenstellen of parseren.

Volgende stappen