Terraform TestのMockを試してみる
本記事の想定読者
- Terraform Testって何?Terraformにネイティブなtestコマンドなんてあったっけ。。。?🤔な方。
- Terraformのtestはちょっと使ったことがあるけどTerraform TestのMockってなに?👀な方。
はじめに
TerraformのTest
みなさん、Terraformコードのテストはどうしていますか?
Terraformは言わずと知れたIaCツールですが、実はそのTest機能は長らく実装されておらず、サードパーティのツールを使ってテストしたり、お手製スクリプトでテストしたりされるケースが多かったのではないかなと思います。
そんなTerraformコードのテストですが、最近(といってもそこそこ時間が経ちましたが、、、) terraform test
というコマンドが追加され、ネイティブにテストを実施することができるようになりました。
ここでは、そんな terraform test
について、簡単に触りつつ、Mock機能のご紹介をしていきたいと思います。
Terraformのテストを試してみよう!
まずはそもそもの terraform test
について、どんな感じでできるか見てみたいと思います。
まずは深く考えずに以下のようなコードを準備します。
(AWS ProviderのExampleコードそのまま)
data "aws_ami" "ubuntu" {
most_recent = true
filter {
name = "name"
values = ["ubuntu/images/hvm-ssd/ubuntu-jammy-22.04-amd64-server-*"]
}
filter {
name = "virtualization-type"
values = ["hvm"]
}
owners = ["099720109477"] # Canonical
}
resource "aws_instance" "web" {
ami = data.aws_ami.ubuntu.id
instance_type = "t3.micro"
tags = {
Name = "HelloWorld"
}
}
次に、 tests
ディレクトリを作成し、その中に以下のコードを準備します。
provider "aws" {}
run "create_instance" {
# Apply を実施し、その結果を見て Test
command = apply
# Assert 内にテストしたい項目を記述
assert {
condition = aws_instance.web.instance_type == "t3.micro"
error_message = "Instance type should be t3.micro"
}
}
これでテストの準備は完了です。
では、テストを実行してみましょう。
(AWS_ACCESS_KEY_ID
など、AWS Provider利用のための設定をあらかじめ入れておく必要があります。)
> terraform test
tests/aws_instance_test.tftest.hcl... in progress
run "create_instance"... pass
tests/aws_instance_test.tftest.hcl... tearing down
tests/aws_instance_test.tftest.hcl... pass
Success! 1 passed, 0 failed.
簡単ですね!terraform test
の要点は以下です。
- テストコードは
.tftest.hcl
という拡張子で、Terraformコードのrootか、tests
ディレクトリに配置する。 -
terraform test
は通常のTerraformフロー(terraform apply
など)とは独立しているため、コードさえ揃えばすぐにテストを実行できる。また、実際のTerraform管理リソースには影響しない。 -
terraform test
は、terraform apply
などと同様に、root moduleで実行する。 - pass/failの判定が終わり次第、テストで作成されたリソースは削除される。
- テスト実施には、実際のリソースを作成する。←つまり、クラウドリソースを作成する権限をとっておく必要がある。
この最後のポイントが、ちょっとテストしたいだけなのにーという場合には厄介です。
テストするたびにリソースを作成するのはコストもかかりますし、認証情報をいろんなところで持っておくのもセキュリティ上望ましくないです。
そんなあなたに使っていただきたい機能が、Mockです!
Terraform Mock Test
Mockって何?
TerraformのMock Testでは、実際のリソースを作ることなく、ロジックのテストを行うことができます。
Mockという単語には「真似る」「模倣する」といった意味がありますが、その名の通り、Testに必要だけど本当に作るとちょっとめんどくさいリソースのフリをする機能です。
Mockを使ってみよう!
と言うわけで、早速ですがMockを使ってみたいと思います。
先ほどのテストコードをコピーし、新たにmock_aws_instance_test.tftest.hcl
を作ってみます。
mock_provider "aws" {}
run "create_instance" {
command = apply
assert {
¦ ¦condition = aws_instance.web.instance_type == "t3.micro"
¦ ¦error_message = "Instance type should be t3.micro"
}
}
provider
の部分をmock_provider
に変更するだけで、Mockを使ったテストができるようになります。
では、試してみます。
> terraform test
tests/aws_instance_test.tftest.hcl... in progress
run "create_instance"... pass
tests/aws_instance_test.tftest.hcl... tearing down
tests/aws_instance_test.tftest.hcl... pass
tests/mock_aws_instance_test.tftest.hcl... in progress
run "create_instance"... pass
tests/mock_aws_instance_test.tftest.hcl... tearing down
tests/mock_aws_instance_test.tftest.hcl... pass
Success! 2 passed, 0 failed.
二つのテストが実行され、共にパスしています。
コード変えていないので当たり前ですね。
Mock Testでは、実際のリソースを作成することはないため、認証情報等がなくとも動作します。
> unset AWS_ACCESS_KEY_ID
> terraform test
tests/aws_instance_test.tftest.hcl... in progress
run "create_instance"... fail
~~略~~
tests/aws_instance_test.tftest.hcl... tearing down
tests/aws_instance_test.tftest.hcl... fail
tests/mock_aws_instance_test.tftest.hcl... in progress
run "create_instance"... pass
tests/mock_aws_instance_test.tftest.hcl... tearing down
tests/mock_aws_instance_test.tftest.hcl... pass
Failure! 1 passed, 1 failed.
AWSへの認証情報がないため、最初のテストは失敗していますが、Mock Testは問題なく通りました。
さいごに
いかがでしたでしょうか?非常に簡単にですが、Terraform TestとMockについてご紹介させていただきました。
ここで紹介した以外にも、特定のresourceのみをMockしたり、Testのためだけにつかうresourceを作ったりと、terraform test
ではさまざまなテストをすることができます。
また、ここでは触れませんでしたが、HCP Terraformでは、Private Moduleに対して自動的にテストを実行する機能も提供されており、よりTerraformを安全に活用できるようになっています。
ぜひ、みなさんの環境でもterraform test
を使って、Terraformコードの品質向上に役立ていただければと思います!
Discussion