Terratest is a popular testing framework for infrastructure as code (IaC) tools like Terraform. It allows developers to write automated tests for their IaC configurations, ensuring that the infrastructure deployments are reliable and stable. In this tutorial, we will explore how to use Terratest to test a simple Terraform configuration for creating an S3 bucket with static website hosting enabled.
To get started, you need to have Go installed on your system. You can download it from https://golang.org/dl/. Once Go is installed, follow these steps:
1. Create a new directory for the test project and navigate into it:
```bash
mkdir terratest-s3-test && cd terratest-s3-test
```
2. Initialize a Go module by running `go mod init`:
```bash
go mod init github.com/yourusername/terratest-s3-test
```
Replace `yourusername` with your GitHub username or any other desired identifier.
3. Create a new file named `main.tf` and add the following content:
```hcl
provider "aws" {
region = "us-west-2"
}
resource "aws_s3_bucket" "static_website" {
bucket = "mytestbucket-${timestamp()}"
acl = "public-read"
website {
index_document = "index.html"
error_document = "error.html"
}
}
```
This Terraform configuration creates an S3 bucket with static website hosting enabled and sets the `index.html` and `error.html` files as default documents for the website.
4. Create another file named `tf_test.go` and add the following content:
```go
package main
import (
"fmt"
"log"
"os"
"testing"
"github.com/gruntwork-io/terratest/modules/aws"
"github.com/gruntwork-io/terratest/modules/random"
"github.com/gruntwork-io/terratest/moduletest"
)
func TestS3(t *testing.T) {
// Generate a unique bucket name for each test run
bucketName := fmt.Sprintf("mytestbucket-%s", random.UniqueId())
// Define the Terraform options with the bucket name and AWS region
terraformOptions := &moduletest.Options{
TerraformDir: "../",
Vars: map[string]interface{}{
"bucket_name": bucketName,
},
}
// Run `terraform init` and `terraform apply` to create the S3 bucket
aws.AssertS3BucketDoesNotExist(t, terraformOptions.AWSRegion, bucketName)
err := moduletest.RunTerraformCommandsE(t, terraformOptions, []string{
"init",
"apply",
})
if err != nil {
log.Fatalf("Error running Terraform: %s", err)
}
// Run `terraform destroy` to clean up the resources after testing
err = moduletest.RunTerraformCommandsE(t, terraformOptions, []string{
"destroy",
})
if err != nil {
log.Fatalf("Error running Terraform: %s", err)
}
}
```
This Go test function uses the `terratest/moduletest` package to run the Terraform commands and validate that the S3 bucket is created as expected. The `AssertS3BucketDoesNotExist()` function checks if the bucket does not exist before running the tests, ensuring a clean environment for each test run.
5. Run the test by executing the following command:
```bash
go test -v
```
You should see output similar to this:
```
ok github.com/yourusername/terratest-s3-test 0.128s
```
This indicates that the test passed successfully, and the S3 bucket was created as expected by the Terraform configuration.
In conclusion, Terratest is a powerful tool for testing infrastructure as code configurations. By leveraging its capabilities, you can ensure the reliability and stability of your IaC deployments. In this tutorial, we demonstrated how to use Terratest to test a simple Terraform configuration for creating an S3 bucket with static website hosting enabled. You can further explore Terratest's features and capabilities by visiting its official documentation at https://terratest.gruntwork.io/.