Terratestで作成したTerraform構成のテストコードをササっと書く
要約
- Terratestを使用するとTerraform等のIac構成のテストコードをGoでササッと書ける
前回のあらすじ
- test以下のtf構成のテストにはTerratestを初めて使ってみた所、便利だった事
こちらについての補足記事です。
Terratestとは
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
想定されているテスト環境の一覧
また、そのほかにもpkg.goの定義を覗くと、「git」「OpenPolicyAgnet(opa)でのポリシーチェック」「DNSのテスト」といったシナリオにも対応しているようです。
- IaC構成の単体テスト
- このDockerfile,Terraformは意図した通りに環境構築しているか?動作するかといった観点の確認で行うテスト
- エンドツーエンドなテスト
- たとえば,例として「AWSのあるリージョンにおいて自分たちが開発しているwebサーバをPackerでビルドし、コンテナイメージをECRにアップロード、そのイメージを使用してECSタスクを実行、最後に期待する出力が得られるか実際にアクセスして確認する」といった包括的なテスト
の双方の観点で用いる事ができます。
各構成毎に簡易なサンプルコードも上記のサイトに記載されています。
さらに具体的なサンプルコードも以下に用意されています。
今回はTerraformに注目していく形で記載します。
実例
以下が実際に前回記事にて作成されたテストコードです。
要約すると- 引数に応じた、minikubeクラスタの作成や後片付けの破棄処理
- クラスタ内のすべてのLoadbalancerに
minikube ip
の出力で得られたIPが割り当てられているか(MetalLBの動作確認) - 立ち上がったgameserverに対してudpでパケットを送信、意図した通りの返信がかえってくるか
- タイミングによってはgameserverのudp待ち受けが遅れる事があるので、リトライ処理が入っている
といったTerraform構成をapplyする前に、「手動で叩かなければいけなかったコマンド」も「コマンドの結果を目視で確認する必要があった項目」も
go test -v
と実行するだけで、一連の作業が実行できる状態にできたのが非常に有効でした
Windows,Mac,Linuxと各環境でテストする際に、いちいち上記の操作を毎回実行するのに耐えかねたのが、導入してみようと思った一番の要因でした。
以下のように読み替えてもらえば、よりシンプルかなと思います。
terraformOptions := terraform.WithDefaultRetryableErrors(t, &terraform.Options{
TerraformDir: "../",
})
terraform.InitAndApply(t, terraformOptions)
defer terraform.Destroy(t, terraformOptions)
他にどんな機能(関数)が用意されているのか
Terraformだけに着目してみても、結構な機能がすでに提供されているようです。
オプションの引数やどんな関数が存在するか、覗いてみたい場合は以下を参照してみてください。
定義とテストコードを合わせて見てみると、よりつかいどころがイメージしやすいかなと思います。
以下は、種類別に要約したリストとなります。
- Apply系
terraform applyを実行する
+ ~~をする、~~を確認する- 例:ApplyAndIdempotentは「terraform applyを実行した後にplanを実行し、変更が検知されない事を確認」、リソース破棄(destroyの呼び出し)は呼び出し元の責任
- Destory系
-
terraform destroy
を実行する
-
- Format系
- Get系
- HCLFileToJSONFile
- .tf(HCL)ファイルをJsonの定義ファイルに変換
- 後述のOPAEvalの箇所等で用いられている
- Init系
-
terraform init
を実行する + ~~をする、~~を確認する - InitAndApplyや、InitAndPlanAndShowあたりは一番よく使う関数かなと思います。
-
- OPAEval
-
OpenPolicyAgentを使用したポリシーチェックをtfの定義に対して
opa eval
経由で実行する - opaがtfの定義をそのまま認識できないので、一度jsonに変換して適用される
-
OpenPolicyAgentを使用したポリシーチェックをtfの定義に対して
- Output系
- Plan系
- AssertPlannedValuesMapKeyExists,RequirePlannedValuesMapKeyExists
- planの出力に指定したkeyのresourceが含まれているかを確認する
- AssertとRequireの違い
- AssertResourceChangesMapKeyExists,RequireResourceChangesMapKeyExists
- planの変更差分の中に、指定したkeyのresourceが含まれているかを確認する
- Show
-
terraform show
を実行する
-
- Tg**系
-
Terragrunt系のコマンド(例:
terragrunt apply
)を実行する
-
Terragrunt系のコマンド(例:
- Validate
- ValidateInputs
- Workspace系
-
terraform workspace
関連の操作を提供する -
WorkspaceDeleteは削除、
default
ワークスペースは削除不可 - WorkspaceSelectOrNewは、新規作成or無ければワークスペースを変更
-
所感
TerraformやPackerといった単一の構成のテストにも便利だし、メジャーなクラウドのテストコードとそれらを組み合わせる事で威力を発揮すると思うので
今後も積極的に使っていきたいなと思う所存です。
😁
「ハイハイ、ガンガンテスト書いて、ガンガン実行スルヨー」
😶⁉🧔
「てぇ~へんだ~!!、本番環境のDBにテスト用のレコード入ってるぞ~!!、ナンデダー!!」
😶🧔
「・・・ま、まさか・・・」
😇👈🧔
参照
サイト
docs
Github
pkg.go.dev
Discussion