Terraform の test コマンドを試してみる in Azure
ごきげんよう!mihohoi です。
terraform の v1.6 から新しい test コマンドが追加されました。やや遅めの記事ですが、Azure リソースをデプロイして test コマンドについて動作を確認したいと思います。
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 plan
か terraform 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 ライフを!
Discussion