ソースに絡まるエスカルゴ

貧弱プログラマの外部記憶装置です。

【Terraform】Terraformでモックを使ったテストの書き方(Mock Test)

 最近Terraformを触る機会があったのですが、モックを使って動作を確認したいと思って調べると、Terraformでもモックを使えるようでした。
 比較的新しい機能らしく、ネットで検索してもS3バケットのモックばかり出てきて、実用的なモックの書き方が見当たりませんでした。

 悩みながら色々やった結果、それなりに書き方がわかってきたので今回はその備忘録になります。

 自分なりにまとめたものなので「間違っていたり、他に良い書き方がある可能性がある」ので注意してください。


 では、始めます。


1:環境について
 前提として、TerraformとAWS CLIの設定を済ませておいてください。今回の実行環境での各バージョンは以下のようになります。

名称 バージョン
Terraform 1.9.5
AWS CLI 2.17.63


2:Terraformのテストファイルについて
 Terraformのルートモジュール配下に「.tftest.hcl」拡張子のファイルを作成すると、自動的にそれがTerraformのテストファイルとみなされます。
 またルートモジュール配下に「tests」ディレクトリを作成し、その中に複数の.tftest.hclファイルを作成すると「terraform test」コマンドで、まとめてテストファイルを実行できます。

 自分で動作確認した範囲では、.tftest.hclファイルの中ではlocalsやvariablesでの変数は使えないようです。
 モックにしたい部分は基本的にはdataリソースを使って検索する形にするのが良さそうだと思っています。


3:Terraformのテストの書き方
 Terraformのテストでは、以下の内容を書けていれば基本的には動きます。

・モック用プロバイダ(あった方が良い)

mock_provider "aws" {
  alias = "fake"
}

・dataリソースを上書き(モック)

override_data {
  target = data.xxx.yyy # ルートモジュール内にある対象リソース

  # モックとして返す値の設定(複数の要素を設定可能)
  values = {
    id = "xxx-id"
    ids = ["id1", "id2"]
    name = "xxx-name"
  }
}

・テスト実行部分

# runの次がテスト名
run "test_name" {
  command = plan  # planコマンドでテスト

  # モック用プロバイダを使用
  providers = {
    aws = aws.fake
  }

  # assertで結果を確認(assertを複数書くことも可能)
  assert {
    condition     = aws_xxx.id == "hogehoge" # 結果比較
    error_message = "Error!"                 # 結果が違う場合の表示メッセージ
  }
}

 それぞれについては内容を読めば理解できるかと思います。

 上記の内容をまとめてより具体的にした例が以下になります。

# --- モックを含むテストの例 ---

# モック用プロバイダ
mock_provider "aws" {
  alias = "fake"
}

# dataの内容をモックの値で上書き
override_data {
  target = data.aws_vpc.search # 対象リソース
  # モックで返す値
  values = {
    # VPCのidしか使わないのでidのみをモックにする
    id = "vpc-mock-id"
  }
}

# テスト実行
run "subnet_test" {
  command = plan  # planコマンドでテスト

  # モック用プロバイダを使用
  providers = {
    aws = aws.fake
  }

  assert {
    # 作成したsn1のサブネットのVPC IDがモック通りかを確認
    condition = aws_subnet.sn1.vpc_id == "vpc-mock-id"
    error_message = "aws_subnet sn1 create Error!"
  }
}


4:Terraformのモックテストのサンプル
 上記までの説明を見ても実際に動かしてみないとわからないと思うので、以下にモックを用いたTerraformテストのサンプルを公開しています。

 git cloneやzipダウンロードして解凍したそのディレクトリに移動し、「terraform init」コマンドをしてから「terraform test」コマンドを実行するとテストが行われます。
 conditionなどの値を変更してテストを実行するとエラーを出すこともできるので、色々と試してみてください。


 以上がTerraformでモックを使ったテストの書き方になります。

 Terraformのモックで悩んでいる方の参考になれば幸いです。


・参考資料