🤪

Terraform TestのMockを試してみる

2024/10/09に公開

本記事の想定読者

  • 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コードそのまま)

main.tf
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 ディレクトリを作成し、その中に以下のコードを準備します。

tests/aws_instance_test.tftest.hcl
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を作ってみます。

tests/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