👌
terraformにおけるconftestの調査・実験メモ
参考にした記事
実際に書いて動かしてみたコード
package main
# 以下3つはterraform用のconftestで共通で使われるパーツっぽい
has_field(object, field) {
object[field]
}
has_field(object, field) {
object[field] == false
}
has_field(object, field) := false {
not object[field]
not object[field] == false
}
deny[msg] {
expect := ">= 1.7.6"
has_field(input, "terraform")
has_field(input.terraform, "required_version")
not input.terraform.required_version == expect
msg = sprintf("terraform.required_version must be '%v', not '%v'", [expect, input.terraform.required_version])
}
これで、required_versionが >= 1.7.6
ではない箇所をlintできる。
やってみた所感
意外と簡単? テスト対象がjson化された構造であるというのと、それを簡単に確認できる TerraformをテストするためにConftestを導入しました - GO Tech Blog のデバッグ方法の知識、あとはconftest自体の実行モデル
deny[msg]内にはルール違反の条件がつらつらと列挙されているが、読み方としては1行ごとにルール的に一致するとアウトな条件が羅列されていて、1つでも一致しない条件があったらセーフでチェック終了、全部一致して最後の行まで到達した場合はアウト=ルール違反であると理解すればいい。
がわかっていれば、数時間でそこそこ書けるようになった。
これ、あくまでテスト対象は単なるjson構造であるため、一度習得すると同種のalt-json系構造すべてをlintできて非常に応用の幅が広そう。
15:41 追記
ルールの共有や配布が可能らしいので、trivyでやっているlintをこちらで担保するようなことももしかしたら簡単に可能かもしれない(すでにあればだけど)。
Discussion