Utiliser des fonctions de fournisseur dans le fournisseur Terraform AzAPI

Terraform permet la définition, l’aperçu et le déploiement d’une infrastructure cloud. À l’aide de Terraform, vous créez des fichiers de configuration à l’aide de la syntaxe HCL. La syntaxe HCL vous permet de spécifier un fournisseur de services cloud, tel qu’Azure, et les éléments qui composent votre infrastructure cloud. Après avoir créé vos fichiers de configuration, vous créez un plan d’exécution qui vous permet d’afficher un aperçu de vos modifications d’infrastructure avant leur déploiement. Une fois que vous avez vérifié les modifications, vous appliquez le plan d’exécution pour déployer l’infrastructure.

AzAPI v2.0 et versions ultérieures inclut un ensemble de fonctions provider pour construire et analyser des ID de ressources Azure. Les fonctions de fournisseur s’exécutent au moment du plan dans la configuration Terraform et ne nécessitent pas de recherche de source de données ou d’appel réseau. Ils réduisent la complexité du code lorsque votre configuration doit construire ou décomposer des ID de ressource.

Note

Les fonctions de fournisseur nécessitent Terraform 1.8 ou une version ultérieure.

Fonctions de fournisseur disponibles

Function Description
build_resource_id Construit un ID de ressource à partir d’un ID parent, d’un type de ressource et d’un nom de ressource. Prend en charge les ressources de niveau supérieur et imbriquées.
extension_resource_id Construit un ID de ressource d’extension à partir d’un ID de ressource de base, d’un type de ressource et d’un nom de ressource.
management_group_resource_id Construit un ID de ressource délimité à un groupe d’administration.
parse_resource_id Analyse un ID de ressource Azure dans ses composants (ID d’abonnement, nom du groupe de ressources, espace de noms du fournisseur, nom de ressource, etc.).
resource_group_resource_id Construit un ID de ressource délimité à un groupe de ressources à partir d’un ID d’abonnement, d’un nom de groupe de ressources, d’un type de ressource et d’un nom de ressource.
subscription_resource_id Construit un ID de ressource applicable à l’abonnement.
tenant_resource_id Construit un ID de ressource au niveau du tenant.

Prerequisites

  • Abonnement Azure : si vous n’avez pas d’abonnement Azure, créez un compte gratuit avant de commencer.

Vérifiez que votre configuration déclare AzAPI v2.0 ou version ultérieure et Terraform 1.8 ou version ultérieure :

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

Analyser un ID de ressource avec parse_resource_id

Utilisez parse_resource_id pour décomposer un ID de ressource Azure existant en ses composants individuels. La fonction est utile lorsque vous avez besoin de l’ID d’abonnement, du nom du groupe de ressources ou du nom de ressource d’une ressource gérée ailleurs dans votre configuration ou transmise en tant que variable.

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 fonction retourne un objet avec ces champs :

  • id — ID de ressource complet
  • name — nom de la ressource
  • parent_id — ID de ressource de la ressource parente
  • parts — mappage de tous les segments d’ID de ressource
  • provider_namespace (par exemple, Microsoft.Storage)
  • resource_group_name
  • resource_group_id
  • subscription_id
  • type (par exemple, Microsoft.Storage/storageAccounts)

Construire un ID délimité par un groupe de ressources avec resource_group_resource_id

Utilisez resource_group_resource_id cette méthode lorsque vous devez référencer un ID de ressource pour une ressource que vous ne gérez pas dans Terraform (par exemple, une ressource existante passée en tant que variable) ou lorsque vous souhaitez construire un ID prédictible avant la création de ressources.

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

Le paramètre de noms de ressources accepte une liste pour prendre en charge les types de ressources imbriqués. Par exemple, pour construire un ID de sous-réseau :

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

Créez un ID à l'échelle de l'abonnement avec subscription_resource_id

Utilisez subscription_resource_id pour les ressources délimitées au niveau de l’abonnement, telles que les groupes de ressources ou les affectations de stratégies.

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

Construire un ID délimité par un groupe d’administration avec management_group_resource_id

Utilisez management_group_resource_id pour les ressources définies au niveau du groupe d'administration, telles que les attributions de stratégie et celles de rôles :

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

Construire un ID de ressource d’extension avec extension_resource_id

Utilisez extension_resource_id pour les ressources d’extension attachées à une autre ressource, telles que des verrous ou des attributions de rôles sur une ressource spécifique :

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

Créer un ID de ressource avec build_resource_id

Utilisez build_resource_id lorsqu’un ID de ressource parent détermine l’étendue et que vous n’avez pas besoin de spécifier séparément l’abonnement ou le groupe de ressources. Cette fonction déduit l’étendue de l’ID parent :

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

Comparer avec les approches des sources de données

Les fonctions de fournisseur sont préférables aux sources de données pour la construction et l’analyse d’ID, car elles :

  • Fonctionne entièrement pendant la phase de planification sans appels réseau.
  • N’ajoutez pas de ressources à l’état Terraform.
  • Sont déterministes et ne nécessitent depends_on pas de classement.

Utilisez azapi_resource la source de données lorsque vous devez lire les propriétés actives d’une ressource, pas seulement construire ou analyser son ID.

Étapes suivantes