使用Terratest进行对Terraform代码的测试

简而言之

IaC具有可以创建无数次的相同环境的特点。许多人认为使用IaC的最大理由是为了利用这一特点。但是,在实施之前或之后,你不想进行测试吗?

本文将介绍如何使用Terratest来测试Terraform。预设环境为AWS。

Terratest测试

Terratest 是什么意思?

Terratest是一個用於測試Terraform、Kubernetes等工具的工具,使用Go語言開發。(不詳細介紹)
Terratest通常用於單元測試和集成測試。

在使用Terratest之前有以下两个前提:
– 环境可以使用Go语言
– 能够使用Go编写程序

在IaC中,单元测试和集成测试的流程

在基础设施即代码(IaC)领域,单元测试和集成测试与应用程序开发中的单元测试和集成测试不同,其涉及到”部署”过程。
在IaC中,测试会部署资源并验证部署的资源的配置是否正确。验证完成后,会删除所有通过测试创建的资源。

以下是流程的概述,本文主要解释了Validate。

– 部署
– 验证
– 删除

准备中

只要存在用Go语言编写的测试代码文件,则可以对Terratest进行测试。从Terratest官方提供的Github代码来看,根据作者的认为,应将其分开放置在另一个文件夹里,筆者通常使用以下文件夹结构…
※Terratest的测试文件需要遵循Go语言测试文件的命名规则,即[xxx_test.go]的格式。

├── main.tf
├── output.tf
├── provider.tf
├── terraform.tf
├── test
│   ├── go.mod
│   ├── terraform_aws_vpc_test.go →これがTerratestで書かれたテストコードファイル
├── userdata
│   └── setup.sh
└── variables.tf

以上的測試程式碼文件構成如下:
參考以下連結:
https://github.com/gruntwork-io/terratest/blob/master/test/terraform_hello_world_example_test.go

package test

import (
	"testing"

	"github.com/gruntwork-io/terratest/modules/terraform"
	"github.com/stretchr/testify/assert"
)

func TestTerraformHelloWorldExample(t *testing.T) {
	// TerraformのOption
        // 主にTerraformコードのディレクトリを指します。上記のような構成の場合に以下のようになります。
	terraformOptions := terraform.WithDefaultRetryableErrors(t, &terraform.Options{
		TerraformDir: "../",
                // 下記に変数の置き換えが可能です
                Vars: map[string]interface{}{
			"instance_name": expectedName,
			"instance_type": instanceType,
		},

		// 環境変数の設定も可能です
		EnvVars: map[string]string{
			"AWS_DEFAULT_REGION": awsRegion,
		},
	})

	// テスト後リソースを削除するコード
	defer terraform.Destroy(t, terraformOptions)

	// Terraform InitとApplyを実行するコード
	terraform.InitAndApply(t, terraformOptions)

	// Outputが想定どおりであることをAssert Moduleを利用して比較する
	output := terraform.Output(t, terraformOptions, "hello_world")
	assert.Equal(t, "Hello, World!", output)
}

根据上述代码所示,资源的部署(创建)和删除使用了现有的函数,所以没有特别困难的地方。
关于验证部分,我想分享一下作者尝试使用后的感受。

让我们利用Terratest提供的库。

在Terratest中,为常用的云端服务如AWS、Azure和GCP提供了模块。例如,如果要使用AWS模块,可以通过添加以下代码到导入部分来使用。

import (
...
"github.com/gruntwork-io/terratest/modules/aws"
...
)

在Terratest中提供的AWS模块提供了经常使用的功能,并且非常易于使用。

请参考以下链接以获取更详细信息:https://github.com/gruntwork-io/terratest/tree/master/modules/aws

Terratest提供的模块并非无所不能。

在某些情况下,Terratest可能没有您想要使用的功能。(例如,无法获取VPC安全组规则的详细信息)

如果这种情况发生,请利用AWS等提供的模块。
详情请参考以下链接:https://github.com/aws/aws-sdk-go/

我们可以利用Terratest提供的实例。

在Terratest提供的示例中,存在许多测试示例。通过参考这些测试示例,可以有效地提升编写IaC测试代码的效率,并且可以了解到应该进行哪些测试。

示例链接:https://github.com/gruntwork-io/terratest/tree/master/examples

思绪

我认为Terratest是一个很好的工具。但是,目前对于开发基础设施即代码(IaC)的测试代码的项目的观念本身就很少,所以如果决定采用IaC,请考虑一下。另外,由于Terraform的许可证已于今年8月更改,我认为今后采用会更加困难,但是认为对于IaC进行测试是必要的这一观念很重要,希望这能给您提供参考。

广告
将在 10 秒后关闭
bannerAds