1. HOME
  2. ブログ
  3. IT技術
  4. terraform のテストをHCLで書く方法

terraform のテストをHCLで書く方法

はじめに

今までは、terraformでテストを実行するときは、Terratestなどの外部ツールを利用する必要がありました。

2023年10月4日にリリースされた、terraform 1.6.0の機能の terraform test コマンドを利用することで、インフラストラクチャの更新や作成のテストを、Terraform単体で完結できるようになりました。

本記事は terraform test コマンドの紹介記事になります。

リリースノート
Releases · hashicorp/terraform 160-october-4-2023

terraform testのメリット

Terraform 1.6.0以前では、テストコードの作成にTerratestなどの外部ツールを使用する必要があり、HCL以外のプログラミング言語、例えばGo言語の学習が必須でした。

テストコードとインフラストラクチャの更新・作成の記述がHCLに統一されることで、学習コストが削減され、実際のプロジェクトへの導入のハードルが下がります。

テスト実行方法

実行方法としてはシンプルで、拡張子が tftest.hclもしくは、tftest.jsonのファイルにテストコードを記述し、 terraform test  コマンドを実行するのみです。

terraform testの動作

デフォルトのテストの動作です。

  1. terraformがテストファイルを検知
  2. テスト用のインフラストラクチャを作成
  3. 作成されたインフラストラクチャに対してアサーションと検証を実行
  4. テスト用に作成されたインフラストラクチャを削除

テスト実行時にインフラを実際に作成したくない場合は、commandオプションにplanを指定することで、実際にインフラを作成せず。planに対してのチェックを実施することができます。

テストコードの記述方法

tftestファイルの基本的な記述方法です。

  • 一つのrunブロックに対して、複数のassertを記述することができます。
  • assertブロックでは、conditionに条件を記載し、error_messageにテスト失敗時のメッセージを設定します。
  • conditionでは、比較演算子を使用して検証を行います。また、for式の利用やlengthなどの関数の記述も可能です。

実際にテストコードを書いてみる

今回はGCPへのリソースの作成に対して、テストコードを記述していきます。

以降はterraform v1.6.5で実施しています

Cloud Storageのオブジェクト名のチェック

tfファイルでCloud Storageのバケットにindex.htmlを追加します。

以下のtfファイルを作成し、同じディレクトリ内に空のindex.htmlファイルを作成します。

cloud_storage.tf

テストコードを、tftest.hclファイルに記述します。

cloud_storage.tftest.hcl

コンソールで terraform test を実行

成功

次は失敗させてみます。

cloud_storage.tfのオブジェクト名をtest.htmlに変更

コンソールで terraform test を実行

テストが失敗します。失敗したときは、テストコードassertブロックに設定しているerror_messageが表示されます。

Object name is not index.html 

セキュリティポリシーの妥当性をチェック

続いて、アクセスを許可するIPアドレスをを間違えて "*" が設定してしまった際に、テスト時点で検知できるようにしていきます。

src_ip_rangesに"*"を間違えて追加してください。

cloud_armor.tf

src_ip_rangesに "*"が含まれていたら、テストを失敗させます。

cloud_armor.tftest.hcl

terraform test  実行

ちゃんと失敗していますね。src_ip_rangesから、"*"を削除するとテストが通ることも確認してみてください。

conditionの説明

[for <ITEM> in <LIST> : <OUTPUT> <条件式>] の形で、<LIST>の中から条件式に該当する値を<OUTPUT>として取得することができます。

<OUTPUT>は配列として出力されるので、最後にインデックス[0]を指定して、src_ip_ranges内の"*"を文字列として取得しています。

for文とテストコードを組み合わせることで、src_ip_rangesにIPが複数設定されていても全て検証するようにしています。

terraformのネストが分かりづらいですね。。もっとシンプルに書きたいところです。

最後に

いかがだったでしょうか?

terraform のテストコードがtfファイルと同じように書けるのはとても便利ですね。

インフラストラクチャの更新の際に、ここだけは変えないでほしい箇所をテストコードに記述しておくとよさそうです。

次はCI/CDツールとの連携も書きたいですね

現在(2023年12月20日時点)beta版の1.7.0では、tfファイル内のoutputをテストコード内で取得したり、プロバイダーやモジュールをモック化する機能が追加されていました。

正式リリースが楽しみですね。更新があれば、また記事にしていきたいと思います。

Terraformリリースノート
Releases · hashicorp/terraform

terraform test ドキュメント

Tests - Configuration Language | Terraform | HashiCorp Developer

書いた人はこんな人

やのけん(エンジニア)
やのけん(エンジニア)エンジニア
矢野健太郎です。
バスケットボールとお酒と漫画が好きです。

修行の日々です。

関連記事

採用情報

\ あの有名サービスに参画!? /

バックエンドエンジニア

\ クリエイティブの最前線 /

フロントエンドエンジニア

\ 世界を変える…! /

Androidエンジニア

\ みんなが使うアプリを創る /

iOSエンジニア