クイック スタート: AzAPI Terraform プロバイダーを使用してAzureリソース アクションを実行する

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

マネージド Terraform リソースとして azapi_resource_action を使用して、Azure リソースに対して命令型の状態変更操作を実行します。 この例では、Azureストレージ アカウントを作成し、そのアクセス キーをローテーションします。

azapi_resource_action には、次の 2 つの使用形式があります。

  • リソース: terraform apply中に状態変更操作を実行します。 Terraform はアクションの状態を追跡し、必要に応じて terraform destroyで元に戻すことができます。
  • データ ソース: 計画中に読み取り専用操作を実行します。 そのシナリオについては、 リソース アクション データ ソースのクイック スタート を参照してください。

Terraform で、資格情報のローテーション、VM の開始または停止、フェールオーバーのトリガーなど、標準的な作成、読み取り、更新、削除のライフサイクルに基づいていないAzure操作を実行する必要がある場合は、リソース フォームを使用します。

  • AzureRM プロバイダーを使用してストレージ アカウントを作成する
  • でストレージ アカウントのアクセス キーをローテーションする azapi_resource_action

前提条件

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

Microsoft アカウントを使用して Azure portal にログインすると、そのアカウントの既定の Azure サブスクリプションが使用されます。

Terraform は、既定の Azure サブスクリプションの情報を使用して自動的に認証します。

az account show を実行して、現在の Microsoft アカウントと Azure サブスクリプションを確認します。

az account show

Terraform を使用して行った変更は、表示される Azure サブスクリプション上にあります。 これが必要な場合は、この記事の残りの部分をスキップしてください。

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."
    }
    
    variable "storage_account_name_prefix" {
      type        = string
      default     = "st"
      description = "Prefix of the storage account 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" {
      name                     = "${var.storage_account_name_prefix}${random_string.storage_suffix.result}"
      resource_group_name      = azurerm_resource_group.example.name
      location                 = azurerm_resource_group.example.location
      account_tier             = "Standard"
      account_replication_type = "LRS"
    }
    
    resource "azapi_resource_action" "regenerate_key" {
      type        = "Microsoft.Storage/storageAccounts@2023-01-01"
      resource_id = azurerm_storage_account.example.id
      action      = "regenerateKey"
      method      = "POST"
    
      body = {
        keyName = "key1"
      }
    }
    

    リソースとしての azapi_resource_action の使用に関する重要なポイント:

    • action フィールドは、実行する ARM 操作を指定します。 ストレージ アカウント キーのローテーションには、 regenerateKeyを使用します。
    • method フィールドは、HTTP メソッドを指定します。 命令型アクションのほとんどは、 POSTを使用します。
    • body属性は、アクションにデータを渡します。 キーの再生成では、回転するキー (key1 または key2) を指定します。
    • アクションは terraform apply 中に実行され、Terraform 状態で追跡されます。
  5. outputs.tf という名前のファイルを作成し、次のコードを挿入します。

    output "resource_group_name" {
      value = azurerm_resource_group.example.name
    }
    
    output "storage_account_name" {
      value = azurerm_storage_account.example.name
    }
    

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 を呼び出します。

結果を確認してください。

terraform applyが完了すると、ストレージ アカウント キーがローテーションされます。 キーのローテーションを確認するには、Azureのストレージ アカウント キーを確認します。

az storage account keys list を実行して、ストレージ アカウント キーを表示します。

```azurecli
az storage account keys list \
  --resource-group <resource_group_name> \
  --account-name <storage_account_name>
```

The `value` field shows the current key.

その他のリソース アクションの例

azapi_resource_action リソースは、多くのAzure操作で動作します。 一般的な例を次に示します。

  • Virtual Machines: deallocatestartrestartpowerOffreimage
  • Key Vault: purge (論理的に削除されたコンテナーの場合)、 rotate (マネージド キーの場合)
  • App Services: swap (デプロイ スロットの場合) restart
  • データベース: failoverpromote
  • コンピュート リソース: リソースを作成または破棄せずに状態を変更するような、Azure REST API によって公開される操作

リソースをクリーンアップする

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 を使用する際の一般的な問題をトラブルシュートする

次のステップ