使用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进行测试是必要的这一观念很重要,希望这能给您提供参考。