AzAPI Terraform プロバイダーでプロバイダー関数を使用する

Terraform を使用すると、クラウド インフラストラクチャの定義、プレビュー、およびデプロイを行うことができます。 Terraform を使用する際は、HCL 構文を使って構成ファイルを作成します。 HCL 構文を使用すると、クラウド プロバイダー (Azure など) とクラウド インフラストラクチャを構成する要素を指定できます。 構成ファイルを作成したら、"実行プラン" を作成します。これにより、インフラストラクチャの変更をデプロイ前にプレビューすることができます。 変更を確認したら、実行プランを適用してインフラストラクチャをデプロイします。

AzAPI v2.0以降は、AzureリソースIDを構築および解析するためのプロバイダー関数のセットが含まれています。 プロバイダー関数は Terraform 構成内で計画時に実行され、データ ソースの参照やネットワーク呼び出しは必要ありません。 これにより、構成でリソース ID を構築または分解する必要がある場合に、コードの複雑さが軽減されます。

Note

プロバイダー関数には Terraform 1.8 以降が必要です。

使用可能なプロバイダー関数

Function 説明
build_resource_id 親 ID、リソースの種類、およびリソース名からリソース ID を構築します。 最上位レベルのリソースと入れ子になったリソースの両方をサポートします。
extension_resource_id 基本リソース ID、リソースの種類、およびリソース名から拡張リソース ID を構築します。
management_group_resource_id 管理グループスコープのリソース ID を構築します。
parse_resource_id Azure リソース ID をコンポーネント パーツ (サブスクリプション ID、リソース グループ名、プロバイダー名前空間、リソース名など) に解析します。
resource_group_resource_id サブスクリプション ID、リソース グループ名、リソースの種類、およびリソース名からリソース グループスコープのリソース ID を構築します。
subscription_resource_id サブスクリプション スコープのリソース ID を作成します。
tenant_resource_id テナント スコープのリソース ID を構築します。

前提条件

  • Azure サブスクリプション:Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。

構成で AzAPI v2.0 以降と Terraform 1.8 以降が宣言されていることを確認します。

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

でリソース ID を解析する parse_resource_id

parse_resource_id を使用して、既存のAzure リソース ID を個々のコンポーネントに分解します。 この関数は、構成内の別の場所で管理されているリソースまたは変数として渡されたリソースのサブスクリプション ID、リソース グループ名、またはリソース名が必要な場合に便利です。

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
}

この関数は、次のフィールドを持つオブジェクトを返します。

  • id — 完全なリソース ID
  • name — リソース名
  • parent_id — 親リソースのリソース ID
  • parts — すべてのリソース ID セグメントのマップ
  • provider_namespace (例: Microsoft.Storage)
  • resource_group_name
  • resource_group_id
  • subscription_id
  • type (例: Microsoft.Storage/storageAccounts)

リソース グループスコープ ID を作成する resource_group_resource_id

resource_group_resource_id、Terraform で管理していないリソースのリソース ID (たとえば、変数として渡された既存のリソース) を参照する必要がある場合、またはリソース作成の前に予測可能な ID を構築する場合に使用します。

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

リソース名パラメーターは、入れ子になったリソースの種類をサポートするリストを受け入れます。 たとえば、サブネット 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]
  )
}

subscription_resource_id を使用してサブスクリプションスコープのIDを構築する。

リソース グループやポリシーの割り当てなど、サブスクリプション レベルでスコープが設定されたリソースには、 subscription_resource_id を使用します。

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

を使用して管理グループスコープ ID を作成する management_group_resource_id

ポリシーの割り当てやロールの割り当てなど、管理グループスコープのリソースに management_group_resource_id を使用します。

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

extension_resource_id を使用して拡張機能リソース ID を構築します。

extension_resource_idは、特定のリソースのロックやロールの割り当てなど、別のリソースにアタッチされている拡張機能リソースに使用します。

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

を使用してリソース ID を作成する build_resource_id

親リソース ID によってスコープが決定され、サブスクリプションまたはリソース グループを個別に指定する必要がない場合は、 build_resource_id を使用します。 この関数は、親 ID からスコープを推論します。

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

データ ソースアプローチとの比較

プロバイダー関数は、ID の構築と解析のためにデータ ソースよりも優先されます。

  • ネットワーク呼び出しなしで計画時に完全に実行します。
  • Terraform 状態にリソースを追加しないでください。
  • 決定論的であり、 depends_on 順序付けを必要としません。

リソース azapi_resource ID を構築または解析するだけでなく、リソースのライブ プロパティを読み取る必要がある場合は、データ ソースを使用します。

次のステップ