Terraform を使用すると、クラウド インフラストラクチャの定義、プレビュー、およびデプロイを行うことができます。 Terraform を使用する際は、HCL 構文を使って構成ファイルを作成します。 HCL 構文を使用すると、クラウド プロバイダー (Azure など) とクラウド インフラストラクチャを構成する要素を指定できます。 構成ファイルを作成したら、"実行プラン" を作成します。これにより、インフラストラクチャの変更をデプロイ前にプレビューすることができます。 変更を確認したら、実行プランを適用してインフラストラクチャをデプロイします。
この記事では、azapi_resource_list データ ソースを使用して、Azure リソースを一覧表示し、JMESPath 式で結果をフィルター処理します。 2 つのストレージ アカウントを作成し、 azapi_resource_list を使用してプロパティを一覧表示および抽出します。
- AzureRM プロバイダーを使用してリソース グループと 2 つのストレージ アカウントを作成する
-
azapi_resource_listを使用してストレージ アカウントを一覧表示し、JMESPath を使用して名前と場所を抽出する
前提条件
- Azure サブスクリプション:Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。
Terraform の構成: まだ構成していない場合は、次のいずれかのオプションを使用して Terraform を構成します。
Microsoft アカウントを使用して Azure portal にログインすると、そのアカウントの既定の Azure サブスクリプションが使用されます。
Terraform は、既定の Azure サブスクリプションの情報を使用して自動的に認証します。
az account show を実行して、現在の Microsoft アカウントと Azure サブスクリプションを確認します。
az account show
Terraform を使用して行った変更は、表示される Azure サブスクリプション上にあります。 これが必要な場合は、この記事の残りの部分をスキップしてください。
response_export_values を理解する
response_export_values属性は、API 応答から抽出され、データ ソースのoutput属性で使用できるプロパティを制御します。 リストまたはマップのいずれかを受け入れます。
-
リスト: 抽出する JSON パスを指定します。
["*"]を使用して、完全な応答本文をエクスポートします。 - マップ: JMESPath 式を使用して、応答をフィルター処理して整形します。 キーは結果の名前で、値は JMESPath 式です。
マップ フォームは、よりクリーンで使いやすい出力値が生成されるため、特定のフィールドを抽出したり、リストの応答を変換したりする必要がある場合に推奨されます。
Terraform コードを実装する
サンプルの Terraform コードをテストするディレクトリを作成し、それを現在のディレクトリにします。
providers.tfという名前のファイルを作成し、次のコードを挿入します。terraform { required_providers { azapi = { source = "Azure/azapi" version = "~> 2.0" } azurerm = { source = "hashicorp/azurerm" version = "~> 4.0" } random = { source = "hashicorp/random" version = "~> 3.0" } } } provider "azurerm" { features {} } provider "azapi" {}variables.tfという名前のファイルを作成し、次のコードを挿入します。variable "resource_group_location" { type = string default = "eastus" description = "Location of the resource group." } variable "resource_group_name_prefix" { type = string default = "rg" description = "Prefix of the resource group name that's combined with a random value to create a unique name." }main.tfという名前のファイルを作成し、次のコードを挿入します。resource "random_pet" "rg_name" { prefix = var.resource_group_name_prefix } resource "random_string" "storage_suffix" { length = 8 upper = false special = false } resource "azurerm_resource_group" "example" { location = var.resource_group_location name = random_pet.rg_name.id } resource "azurerm_storage_account" "example" { count = 2 name = "st${random_string.storage_suffix.result}${count.index}" resource_group_name = azurerm_resource_group.example.name location = azurerm_resource_group.example.location account_tier = "Standard" account_replication_type = "LRS" }
terraform init を実行して、Terraform のデプロイを初期化します。 このコマンドは、Azureリソースを管理するために必要なAzureプロバイダーをダウンロードします。
terraform init -upgrade
重要なポイント:
-
-upgradeパラメーターは、必要なプロバイダー プラグインを、構成のバージョン制約に準拠する最新バージョンにアップグレードします。
実行計画を作成するために terraform plan を実行してください。
terraform plan -out main.tfplan
重要なポイント:
-
terraform planコマンドは実行プランを作成しますが、実行はしません。 代わりに、それは設定ファイルで指定された設定を作成するために必要な手順を決定します。 このパターンを使用すると、実際のリソースに変更を加える前に、実行プランが自分の想定と一致しているかどうかを確認できます。 - 省略可能な
-outパラメーターを使用すると、プランの出力ファイルを指定できます。-outパラメーターを使用すると、レビューしたプランが適用内容とまったく同じであることが確実になります。
クラウドインフラストラクチャに対して実行計画を適用するには、terraform apply を実行してください。
terraform apply main.tfplan
重要なポイント:
-
terraform applyコマンドの例では、以前にterraform plan -out main.tfplanを実行していることを前提としています。 -
-outパラメーターに別のファイル名を指定した場合は、terraform applyへの呼び出しで同じファイル名を使用してください。 -
-outパラメーターを使用しなかった場合は、パラメーターを指定せずにterraform applyを呼び出します。
を使用してリソースを一覧表示する azapi_resource_list
ストレージ アカウントが作成されたら、データ ソースを追加して一覧表示し、JMESPath を使用してプロパティを抽出します。
list_resources.tfという名前のファイルを作成し、次のコードを挿入します。data "azapi_resource_list" "storage_accounts" { type = "Microsoft.Storage/storageAccounts@2023-01-01" parent_id = azurerm_resource_group.example.id # Use JMESPath expressions to extract specific fields from the response. # The API returns a list of resources in a top-level "value" array. response_export_values = { "names" = "value[].name" "locations" = "value[].location" "skus" = "value[].sku.name" } }outputs.tfという名前のファイルを作成し、次のコードを挿入します。output "resource_group_name" { value = azurerm_resource_group.example.name } output "storage_account_names" { value = data.azapi_resource_list.storage_accounts.output.names } output "storage_account_locations" { value = data.azapi_resource_list.storage_accounts.output.locations } output "storage_account_skus" { value = data.azapi_resource_list.storage_accounts.output.skus }terraform applyをもう一度実行してデータ ソースを作成し、出力を抽出します。terraform apply
に関する重要なポイント azapi_resource_list
-
typeフィールドは、一覧表示するリソースの種類と API のバージョンを識別します。 -
parent_idフィールドは、スコープを設定します。リソース グループ内に一覧表示するリソース グループ ID、サブスクリプション全体を一覧表示するサブスクリプション ID、子リソースを一覧表示する親リソース ID (VNet の下のサブネットなど)。 -
response_export_valuesのマップ形式では、生の API 応答に対して JMESPath 式が使用されます。 ストレージ アカウント リスト API は、最上位レベルのvalue配列で結果を返します。そのため、式はvalue[]で始まります。
さまざまなスコープでリソースを一覧表示する
parent_idによって、一覧のスコープが決まります。 例:
# List all storage accounts in a subscription
data "azapi_resource_list" "all_storage" {
type = "Microsoft.Storage/storageAccounts@2023-01-01"
parent_id = "/subscriptions/${var.subscription_id}"
response_export_values = {
"names" = "value[].name"
}
}
# List subnets in a virtual network (child resource listing)
data "azapi_resource_list" "subnets" {
type = "Microsoft.Network/virtualNetworks/subnets@2023-11-01"
parent_id = azurerm_virtual_network.example.id
response_export_values = ["*"]
}
リソースをクリーンアップする
Terraform を使用して作成したリソースが不要になった場合は、次の手順を実行します。
terraform plan を実行し、
destroyフラグを指定してください。terraform plan -destroy -out main.destroy.tfplan重要なポイント:
-
terraform planコマンドは実行プランを作成しますが、実行はしません。 代わりに、それは設定ファイルで指定された設定を作成するために必要な手順を決定します。 このパターンを使用すると、実際のリソースに変更を加える前に、実行プランが自分の想定と一致しているかどうかを確認できます。 - 省略可能な
-outパラメーターを使用すると、プランの出力ファイルを指定できます。-outパラメーターを使用すると、レビューしたプランが適用内容とまったく同じであることが確実になります。
-
terraform applyを実行して、実行プランを適用します。
terraform apply main.destroy.tfplan
Azure での Terraform のトラブルシューティング
Azure で Terraform を使用する際の一般的な問題をトラブルシュートする