1. 導入:なぜインフラに「テスト」が必要なのか?
インフラ構築において、TerraformなどのIaC(Infrastructure as Code)を活用するのは当たり前になりました。しかし、「コードを書いたけれど、実際に意図した設定でリソースが立ち上がっているか不安」と感じることはありませんか?手動でAWSコンソールを確認するのは時間がかかりますし、ヒューマンエラーも防げません。そこで役立つのが「Terratest」です。Terratestを使えば、Terraformで作成したリソースを自動で立ち上げ、正常に動作するかチェックし、最後に自動で削除するまでの一連の流れを自動化できます。
2. 基礎知識:Terratestとは何か?
Terratestは、Go言語で記述されたテストフレームワークです。単なる構文チェック(terraform validate)とは異なり、実際にクラウド環境(AWS, Azure, GCPなど)へリソースを作成して、「本当にHTTPアクセスができるか?」「タグは正しく付与されているか?」といった「本物の動作確認」ができるのが最大の特徴です。CI/CDパイプラインに組み込むことで、リリース前にインフラの安全性を担保できるようになります。
3. 実装/解決策:テストの基本的な流れ
Terratestによるテストは、以下のステップで進みます。
1. Terraformの初期化(terraform init)
2. リソースの作成(terraform apply)
3. 検証(HTTPリクエストの送信など)
4. リソースの破棄(terraform destroy)
この一連の流れをGoのコードで記述し、`go test`コマンドを実行するだけでテストが完結します。
4. サンプルプログラム:簡単なAWSリソースのテスト
以下は、Terraformで作成したS3バケットをテストするGoのコード例です。
package test
import (
“testing”
“github.com/gruntwork-io/terratest/modules/terraform”
)
func TestS3Bucket(t testing.T) {
// Terraformコードがあるディレクトリを指定
terraformOptions := &terraform.Options{
TerraformDir: “../examples/s3-bucket”,
}
// テスト終了時に必ずリソースを破棄する設定
defer terraform.Destroy(t, terraformOptions)
// TerraformのApplyを実行してリソースを作成
terraform.InitAndApply(t, terraformOptions)
// ここで「期待通り作成されたか」を検証するロジックを記述
// 例: S3のバケット名が想定通りかチェックする処理など
}
5. 応用・注意点:現場で陥りやすい罠
注意点1:コストと実行時間
実際にリソースを作成するため、テストのたびにクラウド料金が発生します。また、リソースの起動完了を待つ時間が必要なため、テスト実行には数分〜数十分かかります。開発環境と本番環境でテスト範囲を分けるのが賢明です。
注意点2:リソースの削除漏れ
`defer terraform.Destroy`を書き忘れると、テスト用リソースがクラウド上に放置され、高額な請求が来る可能性があります。必ずテストの最初に破棄処理を定義する癖をつけましょう。
応用:CI/CDとの連携
GitHub ActionsなどのCIツールで`go test`を呼び出すように設定すれば、コードをプッシュするたびに自動でインフラのテストが走ります。これにより、設定ミスによる障害をリリース前に検知できる、極めて堅牢なインフラ管理体制が構築可能です。

コメント