概要
概要は以下の記事を確認ください。
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で公開します。
main.tf
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
ローカルでテストを実行
テストファイルは以下のとおりです。
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します。
main.tf
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)でした。