クイック スタート: AzAPI Terraform プロバイダー Azureリソースを一覧表示する

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

この記事では、azapi_resource_list データ ソースを使用して、Azure リソースを一覧表示し、JMESPath 式で結果をフィルター処理します。 2 つのストレージ アカウントを作成し、 azapi_resource_list を使用してプロパティを一覧表示および抽出します。

  • AzureRM プロバイダーを使用してリソース グループと 2 つのストレージ アカウントを作成する
  • azapi_resource_listを使用してストレージ アカウントを一覧表示し、JMESPath を使用して名前と場所を抽出する

前提条件

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

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 コードを実装する

  1. サンプルの Terraform コードをテストするディレクトリを作成し、それを現在のディレクトリにします。

  2. 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" {}
    
  3. 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."
    }
    
  4. 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 を使用してプロパティを抽出します。

  1. 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"
      }
    }
    
  2. 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
    }
    
  3. 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 を使用して作成したリソースが不要になった場合は、次の手順を実行します。

  1. terraform plan を実行し、destroy フラグを指定してください。

    terraform plan -destroy -out main.destroy.tfplan
    

    重要なポイント:

    • terraform plan コマンドは実行プランを作成しますが、実行はしません。 代わりに、それは設定ファイルで指定された設定を作成するために必要な手順を決定します。 このパターンを使用すると、実際のリソースに変更を加える前に、実行プランが自分の想定と一致しているかどうかを確認できます。
    • 省略可能な -out パラメーターを使用すると、プランの出力ファイルを指定できます。 -out パラメーターを使用すると、レビューしたプランが適用内容とまったく同じであることが確実になります。
  2. terraform applyを実行して、実行プランを適用します。

    terraform apply main.destroy.tfplan
    

Azure での Terraform のトラブルシューティング

Azure で Terraform を使用する際の一般的な問題をトラブルシュートする

次のステップ