[アドカレ2023] Terraform v1.6 のtestコマンドつかってみた

はじめに

アドベントカレンダー 2023 12月06日担当の牛山です。

遂に12月を迎え、街中もクリスマス一色に変わってきましたね。

12月6日の記念日は「サンタクロースの日」だそうです。
Amazon Bedrockに教えてもらいました。


Terraform 1.6が米国時間10月4日に一般提供開始されました。

testコマンドの実装、importブロックの改善が含まれます。

importブロックでは、id属性で静的な値のみに対応していましたが、id属性は、変数やリソース属性など他の値を参照する式を受け付けるよう改善されました。

本記事では、testコマンド(テストコードと呼ばれる実行結果が適切かどうかをチェックするためのコードに基づいて、プロビジョニングされたインフラ構成が正しく構成されているかテストするコマンド)を紹介します。

Terraform 1.6.2にて、testコマンドの改善がなされている為、1.6.2のバージョンで動作をみます。

前置き

これまで、preconditionやpostconditionブロックを使用した、個々のデータソースやリソースを検証する機能、checkブロックによるテスト手法が追加されてきましたが今回紹介するtestコマンドでは、ユニットテストや結合テストのニーズを満たす機能となります。

testコマンドの動作として以下の様に動作となります。

  1. 構成内のテストファイル(.tftest.hcl)を検索します。

  2. ブロックで定義されたテストに基づいて構成をプロビジョニングします。(runブロック)

  3. カスタムアサーションを評価します。

  4. テストの終了時にプロビジョニングされたインフラストラクチャを自動的に破棄します。

    • command = plan または apply によって動作を変更できます。

      • plan 時:インフラストラクチャをデプロイせず構成を検証。

      • apply 時:インフラストラクチャをデプロイし構成を検証し検証に失敗時、リソースの削除がおこなわれる。

それでは実際にみていきましょう。

プロジェクトの準備

以下、過去記事より、「プロジェクト作成方法」を記載していますので、terraform init部分まで進めます。

検証用RDS作成

テスト対象のRDSインスタンス作成する記述をおこないます。
作成は、以前、投稿した「TerraformでRDSインスタンスをimportしてみた」記事を参考としてインポートしたリソースをテストする形とします。

実施する内容は同じですので参考記事内「リソース確認」まで進んでいる状態とします。

また、一部、main.tf記述を以下へ修正します。

terraform {
    required_version = "1.6.2"
    required_providers {
      aws = {
          source = "hashicorp/aws"
          version = "~> 5.28.0"
      }
    }
}

variable "aws_access_key" {}
variable "aws_secret_key" {}
variable region {
  default     = "ap-northeast-1"
}

provider "aws" {
    access_key = var.aws_access_key
    secret_key = var.aws_secret_key
    region = var.region
}

テストファイルの作成

概要

テストコードに記述する run ブロック構成は以下の要素から成り立っています。

テスト1:RDS インスタンスクラスをチェックする

vi 01-rds-instance-class-check.tftest.hcl

run "valid_rds_instance_class" {
  # `command = apply` にすると実際にリソースを作成して検証することができる
  command = plan

  assert {
    condition     = aws_db_instance.test.instance_class == "db.t3.medium"
    error_message = "${aws_db_instance.test.identifier} のDBインスタンスクラスがdb.t3.microになっていません。確認して下さい。"
  }
}

テスト2:RDS 変更をすぐに適用するになっているかチェックする

vi 02-rds-apply_immediately-check.tftest.hcl

run "valid_rds_instance_apply_immediately" {
  # `command = apply` にすると実際にリソースを作成して検証することができる
  command = plan

  assert {
    condition     = aws_db_instance.test.apply_immediately == true
    error_message = "${aws_db_instance.test.identifier} のDB変更をすぐに適用が有効になっていません。確認して下さい。"
  }
}

テストを実行する

作成したファイル類のディレクトリ構成は以下のようになりました。

tree -t --charset=C

.
|-- terraform.tfvars
|-- rds.tf
|-- terraform.tfstate
|-- main.tf
|-- 01-rds-instance-class-check.tftest.hcl
|-- 02-rds-apply_immediately-check.tftest.hcl
`-- generated.tf

0 directories, 7 files

terraform test コマンドでテストを実行する事が可能です。

実行した結果以下の通りとなりました。

※注意:command = apply時、テスト対象リソースが既にインフラストラクチャ環境に存在し、テスト失敗時、対象リソースが削除される動作となりますので実施時はよく確認してからおこなうようにします。


01-rds-instance-class-check.tftest.hcl... in progress
  run "valid_rds_instance_class"... fail
╷
x Error: Test assertion failed
x
x   on 01-rds-instance-class-check.tftest.hcl line 5, in run "valid_rds_instance_class":
x    5:     condition     = aws_db_instance.test.instance_class == "db.t3.medium"
x     tqqqqqqqqqqqqqqqq
x     x aws_db_instance.test.instance_class is "db.t3.micro"
x
x terraform-import-rds のDBインスタンスクラスがdb.t3.microになっていません。確認して下さい。
╵
01-rds-instance-class-check.tftest.hcl... tearing down
01-rds-instance-class-check.tftest.hcl... fail
02-rds-apply_immediately-check.tftest.hcl... in progress
  run "valid_rds_instance_apply_immediately"... fail
╷
x Error: Test assertion failed
x
x   on 02-rds-apply_immediately-check.tftest.hcl line 5, in run "valid_rds_instance_apply_immediately":
x    5:     condition     = aws_db_instance.test.apply_immediately == true
x     tqqqqqqqqqqqqqqqq
x     x aws_db_instance.test.apply_immediately is null
x
x terraform-import-rds のDB変更をすぐに適用が有効になっていません。確認して下さい。
╵
02-rds-apply_immediately-check.tftest.hcl... tearing down
02-rds-apply_immediately-check.tftest.hcl... fail

Failure! 0 passed, 2 failed.

おわりに

いかがでしたでしょうか、plan時はcheckブロックと同じ様な挙動となりますが、apply時は実際にインフラストラクチャ環境にデプロイをおこないテスト失敗時、削除の挙動となることが分かりました。

terraform test時、テスト専用として確認がおこなえますのでより便利になるのではないでしょうか。

簡単な動作確認となりますが、この他にもオプションがありますので気になる方は試して見ても損はないです。

参考文献

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA