Terraform Cloudのプライベートモジュールのテスト機能とテスト自動生成を試してみた

2023.10.13

概要

概要は以下の記事を確認ください。

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 typeBranchにします。

また、テストを有効にするために、TestitngEnable 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-samplePROVIDERは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)でした。

参考