
Terraform Cloudのプライベートモジュールのテスト機能とテスト自動生成を試してみた
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
概要
概要は以下の記事を確認ください。
2023/10時点ではこの機能は、ベータです。利用するには、Plusプランが必要です。
やってみた
前提
テストを実施するには、公開ワークフローをブランチベースに設定しておく必要があります。
If your module uses the branch-based publishing workflow and its source code includes tests, you can enable testing at any time.
Testing Private Modules - Private Registry - Terraform Cloud | Terraform | HashiCorp Developerから引用
Private Registryでモジュールを公開する
以下のサンプルコードをGitHubにPushして、Private Registryで公開します。
variable "prefix" {}
variable "name" {}
resource "aws_sqs_queue" "this" {
name = "${prefix}-${name}"
sqs_managed_sse_enabled = true
}
output "queue_url" {
value = aws_sqs_queue.this.url
}
モジュール追加時に、publishing typeをBranchにします。
また、テストを有効にするために、TestitngをEnable testing for Moduleにチェックをいれます。

上記の設定は登録済みのモジュールでも、いつでも変更可能です。

環境変数を設定
Testはクラウドプロバイダーの認証情報が必要です。
今回はAWSを例に設定します。

AWS認証情報とリージョンを設定します。AWS認証情報の権限はSQSを操作できる権限があれば大丈夫です。
通常であれば、リージョンはAWS Providerで設定可能ですが、module内ではAWS Providerを宣言しないため環境変数として設定します。 (2023/10時点では、Variables Setは対応していない)
| Key | Value | Category |
|---|---|---|
| AWS_ACCESS_KEY_ID | <AWSアクセスキー> | env |
| AWS_SECRET_ACCESS_KEY | <AWSシークレットアクセスキー> | env |
| AWS_REGION | ap-northeast-1 | env |

テストファイルを生成しローカルにダウンロード
View test filesからテストファイルを確認しダウンロードします。


ファイルをダウンロードして、ローカルのモジュールがあるディレクトリに置きます。
$ ls -1 main.tf main.tftest.hcl
ローカルでテストを実行
テストファイルは以下のとおりです。
# WARNING: Generated module tests should be considered experimental and be reviewed by the module author.
variables {
prefix = "test"
name = "queue"
}
run "attributes_validation" {
assert {
condition = aws_sqs_queue.this.name == "test-queue"
error_message = "incorrect value for queue name"
}
assert {
condition = aws_sqs_queue.this.sqs_managed_sse_enabled == true
error_message = "incorrect value for sqs_managed_sse_enabled"
}
}
run "output_validation" {
assert {
condition = output.queue_url == aws_sqs_queue.this.url
error_message = "incorrect value for queue url"
}
}
以下の項目がチェックされます。
- SQSキュー名
- キューの暗号化
- アウトプットの値
テストファイルの構文は以下で確認できます。
Tests - Configuration Language | Terraform | HashiCorp Developer
ローカルでテストを実行してみましょう。以下のコマンドで実行できます。
$ terraform test -cloud-run=app.terraform.io/:ORG/:MODULE_NAME/:PROVIDER
今回の場合、MODULE_NAMEがmodule-test-sampleでPROVIDERはaws`のため以下になります。
$ terraform test -cloud-run=app.terraform.io/<Org名>/module-test-sample/aws Waiting for the tests to start... (0s elapsed) Terraform v1.6.1 on linux_amd64 Initializing plugins and modules... main.tftest.hcl... in progress attributes_validation... pass output_validation... pass main.tftest.hcl... tearing down main.tftest.hcl... pass Success! 2 passed, 0 failed.
Success! 2 passed, 0 failed. となっており、ローカルのテストが成功しました。
結果はTerraform Cloud上でも確認できます。

公開のタイミングでテストを実行
テスト機能を使ったモジュール公開の流れを試してみます。
誤って設定値を変更してしまったケースを想定して、SQSの暗号化を有効->無効に変更して公開してみます。
ハイライトの箇所を変更してGitHubにPushします。
variable "prefix" {}
variable "name" {}
resource "aws_sqs_queue" "this" {
name = "${var.prefix}-${var.name}"
sqs_managed_sse_enabled = false # trueからfalseに変更
}
output "queue_url" {
value = aws_sqs_queue.this.url
}
$ git add . $ git commti -m "test" $ git push origin HEAD
Private Moduleを見ると、テストがfaileになっています。
テストは全てのコミットに対して実施されます。(公開まで行わなくても、VCS上にコミットが追加されたタイミングで)


テストの詳細を見てみると、想定通りSQSの暗号化の部分でテストが失敗していることが分かります。
該当箇所を戻して(false -> true)、GitHubにPushし直します。
Terraform Cloud上でテストが実行されて、成功しました。

バージョンを公開します。指定したブランチ(今回はmain)のコミット単位で公開するバージョンを選ぶことができます。

Versionが先程設定したバージョンになっていれば完了です。

## 補足: テストが失敗しているバージョンを公開できるか
可能です。現時点では、テストを失敗しているバージョンを公開できなくする機能はありません。(2023/10時点)
機能追加に来たいですね。
おわりに
Terraform CloudのModule Test機能とTest自動生成機能を試して見ました。
Testがあることで、よりモジュールを安全に公開できるようになりました。
パラメータ多いとテストを書くのが大変ですが、自動生成機能を使えば簡単にテストが書けそうです。
以上、AWS事業本部の佐藤(@chari7311)でした。






