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 サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。
Terraform の構成: まだ構成していない場合は、次のいずれかのオプションを使用して Terraform を構成します。
構成で 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_nameresource_group_idsubscription_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 を構築または解析するだけでなく、リソースのライブ プロパティを読み取る必要がある場合は、データ ソースを使用します。