AWS上でインフラストラクチャをコードとして採用する組織は、インフラストラクチャが正しくプロビジョニングされているだけでなく、展開後も意図した通りに機能していることを保証することに苦労することがよくあります。わずかな設定ミスでも、高額なダウンタイムやセキュリティの脆弱性、パフォーマンスの問題を引き起こす可能性があります。
従来のテスト方法 — リソースを手動で検査することや静的コード分析にのみ依存することなど — は、運用環境に対して十分な信頼性を提供しません。変更が本番環境に反映される前に、AWSインフラストラクチャの変更を検証するための自動化された信頼できる方法が切実に求められています。
解決策
Terratestは、Goで書かれた自動テストフレームワークで、AWSのような実際のクラウド環境でインフラコードをテストするために特別に設計されています。プログラム的にリソースをデプロイ、検証、破棄することで、TerratestはIaCを書くこと(例:Terraform)と信頼を持って変更を出荷することとのギャップを埋めます。以下はその仕組みです:
以下は、Terraformを使用してTerratestでAWSインフラストラクチャテストを達成するための詳細なガイドであり、Goのサンプルコードスニペットも含まれています。このワークフローは、AWSリソースをプロビジョニングし、それらが意図した通りに機能することを確認するためにテストを実行し、その後すべてを自動的に破棄するのに役立ちます。
前提条件
Terraformをインストール
Terraformを公式サイトからダウンロードしてインストールします。
Goをインストール
TerratestはGoで書かれているため、Goがインストールされている必要があります。Goを公式サイトからダウンロードしてください。
AWSクレデンシャルを設定
AWSクレデンシャルが設定されていることを確認します(例:~/.aws/credentialsまたはAWS_ACCESS_KEY_ID
やAWS_SECRET_ACCESS_KEY
のような環境変数を使用)。
Goモジュールを初期化
プロジェクトディレクトリで以下を実行します:
go mod init github.com/yourusername/yourproject
go mod tidy
Terratestを追加go.mod
プロジェクト/リポジトリディレクトリで以下を実行します:
go get github.com/gruntwork-io/terratest/modules/terraform
go get github.com/stretchr/testify/assert
サンプルTerraform構成
AWS EC2インスタンスを起動するシンプルなTerraform構成を作成します。以下のファイルをaws_ec2_example(またはお好みの名前)のディレクトリに配置します。
参照用にmain.tfとして保存します。
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 4.0"
}
}
required_version = ">= 1.3.0"
}
provider "aws" {
region = var.aws_region
}
resource "aws_instance" "example" {
ami = var.ami_id
instance_type = "t2.micro"
tags = {
Name = "Terratest-Example"
}
}
output "instance_id" {
value = aws_instance.example.id
}
次に、variables.tf:
variable "aws_region" {
type = string
default = "us-east-1"
}
variable "ami_id" {
type = string
default = "ami-0c55b159cbfafe1f0" # Example Amazon Linux AMI (update as needed)
}
Terratestコードスニペット
testという名前のディレクトリにGoテストファイルを作成します(他の名前でも構いませんが、testが一般的です)。例えば、aws_ec2_test.go:
package test
import (
"testing"
"github.com/gruntwork-io/terratest/modules/terraform"
"github.com/stretchr/testify/assert"
)
func TestAwsEC2Instance(t *testing.T) {
// Define Terraform options to point to the Terraform folder
terraformOptions := &terraform.Options{
TerraformDir: "../aws_ec2_example",
// Optional: pass variables if you want to override defaults
Vars: map[string]interface{}{
"aws_region": "us-east-1",
"ami_id": "ami-0c55b159cbfafe1f0",
},
}
// At the end of the test, destroy the resources
defer terraform.Destroy(t, terraformOptions)
// Init and apply the Terraform configuration
terraform.InitAndApply(t, terraformOptions)
// Fetch the output variable
instanceID := terraform.Output(t, terraformOptions, "instance_id")
// Run a simple assertion to ensure the instance ID is not empty
assert.NotEmpty(t, instanceID, "Instance ID should not be empty")
}
このテストが行うこと
- Terraformの設定を初期化し、適用します
../aws_ec2_example
で。 - 指定されたAMIを使用してus-east-1にEC2インスタンスをデプロイします。
- Terraformの出力として
instance_id
をキャプチャします。 - Testifyのアサートライブラリを使用して、インスタンスIDが空でないことを検証します。
- テストの最後にリソースを破棄して、継続的なコストが発生しないようにします。
テストの実行
- Goのテストファイル(例:テストディレクトリ)が含まれているディレクトリに移動します。
- 次のコマンドを実行します:
go test -v
- 出力を確認します:
- AWSインフラストラクチャの初期化と適用が行われるのを確認できます
- テストのアサーションが通過すると、Terraformはリソースを破棄します
。
。
結論
これらの手順に従うことで、TerratestをAWS IaCワークフローに統合し、
- AWSリソースをTerraformを使用してプロビジョニングします。
- それらをGoベースのテストでプログラム的にテストします。
- インフラストラクチャが正しく構成され、期待通りに機能していることを検証します。
- ティアダウンを自動化して、不要なAWSコストをかけずに繰り返しテストを実行するためのクリーンな環境を維持します。