Terratestで作成したTerraform構成のテストコードをササっと書く

2022/11/23に公開

要約

  • Terratestを使用するとTerraform等のIac構成のテストコードをGoでササッと書ける

前回のあらすじ

https://zenn.dev/oniku2929/articles/b42ce397db73a1

  • test以下のtf構成のテストにはTerratestを初めて使ってみた所、便利だった事

こちらについての補足記事です。

Terratestとは

https://terratest.gruntwork.io/

Terratest is a Go library that provides patterns and helper functions for testing infrastructure, with 1st-class support for Terraform, Packer, Docker, Kubernetes, AWS, GCP, and more.
Terratestは、Terraform、Packer、Docker、Kubernetes、AWS、GCPなどを優先サポートし、インフラをテストするためのパターンとヘルパー関数を提供するGoライブラリです。

Github
https://github.com/gruntwork-io/terratest/tree/master

想定されているテスト環境の一覧
https://github.com/gruntwork-io/terratest/blob/master/README.md#L9-L24

また、そのほかにもpkg.goの定義を覗くと、「git」「OpenPolicyAgnet(opa)でのポリシーチェック」「DNSのテスト」といったシナリオにも対応しているようです。
https://pkg.go.dev/github.com/gruntwork-io/terratest/modules@v0.41.3

  • IaC構成の単体テスト
    • このDockerfile,Terraformは意図した通りに環境構築しているか?動作するかといった観点の確認で行うテスト
  • エンドツーエンドなテスト
    • たとえば,例として「AWSのあるリージョンにおいて自分たちが開発しているwebサーバをPackerでビルドし、コンテナイメージをECRにアップロード、そのイメージを使用してECSタスクを実行、最後に期待する出力が得られるか実際にアクセスして確認する」といった包括的なテスト

の双方の観点で用いる事ができます。

各構成毎に簡易なサンプルコードも上記のサイトに記載されています。
さらに具体的なサンプルコードも以下に用意されています。
https://github.com/gruntwork-io/terratest/tree/master/test

今回はTerraformに注目していく形で記載します。

実例

以下が実際に前回記事にて作成されたテストコードです。
https://github.com/oniku-2929/tf_agones_minikube_hyperv/blob/main/test/env_test.go#L47-L147
要約すると

  • 引数に応じた、minikubeクラスタの作成や後片付けの破棄処理
  • クラスタ内のすべてのLoadbalancerにminikube ipの出力で得られたIPが割り当てられているか(MetalLBの動作確認)
  • 立ち上がったgameserverに対してudpでパケットを送信、意図した通りの返信がかえってくるか
    • タイミングによってはgameserverのudp待ち受けが遅れる事があるので、リトライ処理が入っている

といったTerraform構成をapplyする前に、「手動で叩かなければいけなかったコマンド」も「コマンドの結果を目視で確認する必要があった項目」も
go test -vと実行するだけで、一連の作業が実行できる状態にできたのが非常に有効でした
Windows,Mac,Linuxと各環境でテストする際に、いちいち上記の操作を毎回実行するのに耐えかねたのが、導入してみようと思った一番の要因でした。

https://github.com/oniku-2929/tf_agones_minikube_hyperv/blob/main/test/env_test.go#L80-L87
Terraformに関する記述はこの部分だけです。
以下のように読み替えてもらえば、よりシンプルかなと思います。

env_test.go
    terraformOptions := terraform.WithDefaultRetryableErrors(t, &terraform.Options{
        TerraformDir: "../",
    })
    terraform.InitAndApply(t, terraformOptions)
    defer terraform.Destroy(t, terraformOptions)

他にどんな機能(関数)が用意されているのか

Terraformだけに着目してみても、結構な機能がすでに提供されているようです。
オプションの引数やどんな関数が存在するか、覗いてみたい場合は以下を参照してみてください。
https://pkg.go.dev/github.com/gruntwork-io/terratest@v0.41.3/modules/terraform

定義とテストコードを合わせて見てみると、よりつかいどころがイメージしやすいかなと思います。
以下は、種類別に要約したリストとなります。

所感

TerraformやPackerといった単一の構成のテストにも便利だし、メジャーなクラウドのテストコードとそれらを組み合わせる事で威力を発揮すると思うので
今後も積極的に使っていきたいなと思う所存です。

😁

「ハイハイ、ガンガンテスト書いて、ガンガン実行スルヨー」

😶⁉🧔

「てぇ~へんだ~!!、本番環境のDBにテスト用のレコード入ってるぞ~!!、ナンデダー!!」

😶🧔

「・・・ま、まさか・・・」

😇👈🧔

参照

サイト

https://terratest.gruntwork.io/

docs

https://terratest.gruntwork.io/docs/

Github

https://github.com/gruntwork-io/terratest/tree/master

pkg.go.dev

https://pkg.go.dev/github.com/gruntwork-io/terratest

Discussion