🐈

Terraform の test コマンドを試してみる in Azure

2024/02/23に公開

ごきげんよう!mihohoi です。
terraform の v1.6 から新しい test コマンドが追加されました。やや遅めの記事ですが、Azure リソースをデプロイして test コマンドについて動作を確認したいと思います。

test コマンドとは

https://developer.hashicorp.com/terraform/cli/commands/test

テストコードを実行することで、実際に作成する予定のリソースがテストシナリオ通りに作成できるかどうかを確認できます。
テストの書き方は、.tftest.hcl or .tftest.jsonの形式でファイルを作成する必要があるみたい。

Azure のリソースをテストする

それでは、ストレージアカウントを作成してテストを実行してみます。
作成する tf ファイルは以下のとおりです。特に何も細かいことはしていません。

main.tf

resource "azurerm_resource_group" "rg" {
    name     = var.project_name
    location = var.resource_group_location
}

resource "azurerm_storage_account" "sa" {
    name                     = var.storageaccount_name
    resource_group_name      = azurerm_resource_group.rg.name
    location                 = azurerm_resource_group.rg.location
    account_tier             = "Standard"
    account_replication_type = "GRS"
}

variables.tf

# Resource Group Location
variable "resource_group_location" {
  type = string
  default = "japaneast"
}

# Storage Account Name
variable "storageaccount_name" {
  type = string
  default = "mihohoi0322"
}

providor.tf

terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "3.77.0"
    }
  }
}

provider "azurerm" {
  subscription_id = var.subscription_id
  features {}
}

※同じディレクトリ上で階層を今回は分けずに作成しています。

上記を実行すると、ストレージアカウントが作成されます。個人で実行する分にはこちらで完結しますが、実際に IaC としてチームで使う場合は、静的解析やプレフライト検証などが必要になってきます。そして CI/CD の部分を考える必要が出てくると思います。

Terraform のテスト

ではここからテストを行うために準備をしていきます。
このコマンドでは "「書いたテストシナリオ」通りに実行できるか" を事前に確認したいときに使います。
つまり、terraform test を実行しただけでは、何もテストは実行してくれないので、テスト用のファイルが必要になります。
テストファイルは .tftest.hcl もしくは .tftest.json の形式で書きます。今回は同じフォルダに main.tftest.hcl を作成しました。

テストファイルの中身は以下を書きます。

main.tftest.hcl

run "check_storageaccount_name" {
    command = plan

    assert {
        condition = azurerm_storage_account.sa.name == "mihohoi0322"
        error_message  = "storage account name is not mihohoi0322"
    }
}

run "check_location" {
    command = plan
    
    assert {
        condition = azurerm_resource_group.rg.location == "japaneast"
        error_message = "location is NG"
    }
}

テストファイルの書き方については、こちらに詳しく書いてあります。いずれ別の記事でもう少し細かいテストを書いてみたいと思いますが、今回は単純な判定を入れました。

check_storageaccount_name では、ストレージアカウント名が mihohoi0322 であるかを確認しています。もし違っていたら、メッセージを出すようにしました。この、conditionは、以下の部分を示しています。ここを辿れば何を確認したいのか?が分かりますね。

resource "azurerm_storage_account" "sa" {
    name                     = var.storageaccount_name ←ここを確認したい
(略)

check_locationも同じく文字列が正しいかどうかを確認しています。

また、command が何をしているかというと、terraform planterraform apply かを選択します。plan を指定すると、プロビジョニングを行いません。デフォルトは apply となるので、注意してください。最後に apply にしたときの挙動をみたいと思います。

成功例

% terraform test
main.tftest.hcl... in progress
  run "check_storageaccount_name"... pass
  run "check_location"... pass
main.tftest.hcl... tearing down
main.tftest.hcl... pass

Success! 2 passed, 0 failed.

失敗例

% terraform test
main.tftest.hcl... in progress
  run "check_storageaccount_name"... fail
╷
│ Error: Test assertion failed
│ 
│   on main.tftest.hcl line 5, in run "check_storageaccount_name":5:         condition = azurerm_storage_account.sa.name == "mihohoi0322"
│     ├────────────────
│     │ azurerm_storage_account.sa.name is "mihohoi0321"
│ 
│ storage account name is not mihohoi0322
╵
  run "check_location"... pass
main.tftest.hcl... tearing down
main.tftest.hcl... fail

Failure! 1 passed, 1 failed.

失敗例から分かる通り、ストレージアカウントの名前が「思っていたんと違う」ということでエラーが出ています。

command = apply にしたときの挙動

せっかくなので、command = apply をした時の挙動がどうなるのかを見てみましょう。

run "check_storageaccount_name" {
    command = apply

    assert {
        condition = azurerm_storage_account.sa.name == "mihohoi0322"
        error_message  = "storage account name is not mihohoi0322"
    }
}

これを実行するとどうなるのか?

% terraform test
main.tftest.hcl... in progress
  run "check_storageaccount_name"... pass
  run "check_location"... pass
main.tftest.hcl... tearing down
main.tftest.hcl... pass

Success! 2 passed, 0 failed.

コマンド上では変わりませんが、一瞬だけリソースが作成されます。
テストが完了後にリソースは削除されます。もし気になった方は、ポータル上から確認してみてください。

まとめ

まずは test がどのような動作となるかを Azure ストレージアカウントを作成する tf ファイルを使って確認しました。
実際に作成する際はもっと細かいレベルでテストを行うはずなので、また詳細なテストの内容を考えて書いてみたいと思います。

それでは良い Terraform ライフを!

GitHubで編集を提案

Discussion