構成ファイルの通りにインフラは立ち上がったのか? インフラ自動テストツール「Terratest」がオープンソースで公開
クラウドの利用において、インフラの構成をコードで記述することは一般的になってきました。インスタンスのサイズや台数を指定し、仮想マシンのイメージを指定し、ネットワーク構成を指定する、といった内容を記述したファイルを用意し、ChefやAnsible、Terraform、あるいはAWS CloudFormationといったインフラ構成ツールで実行することで、つねに同じ構成のインフラを立ち上げることができます。
インフラの構成を変更する際にもGitHubのようなバージョン管理システムでインフラの構成コードを管理できるため、いつ誰がどのようにインフラを変更したのか、履歴の管理が可能になると同時に、問題が発生した場合には以前の状態に戻すこともできます。
オープンソースで公開された「Terratest」は、こうしたインフラ構成のためのコードが、管理者が想定したとおりにインフラを構成できたのか、自動的にテストを行えるツールです。
HashiCorpのTerraformやPacker、Docker、AWSなどの環境に対応しています。
説明に使われているサンプルを引用して機能を紹介しましょう。例えば、下記はTerraformを用いてAWSのインスタンスを立ち上げ、Webサーバのindex.hmlでHello Worldを返す機能を持つインフラを立ち上げるスクリプトです。
provider "aws" {
region = "us-east-1"
}
resource "aws_instance" "web_server" {
ami = "ami-43a15f3e" # Ubuntu 16.04
instance_type = "t2.micro"
vpc_security_group_ids = ["${aws_security_group.web_server.id}"]
# Run a "Hello, World" web server on port 8080
user_data = <<-EOF
#!/bin/bash
echo "Hello, World" > index.html
nohup busybox httpd -f -p 8080 &
EOF
}
# Allow the web app to receive requests on port 8080
resource "aws_security_group" "web_server" {
ingress {
from_port = 8080
to_port = 8080
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
}
output "url" {
value = "http://${aws_instance.web_server.public_ip}:8080"
}
インフラが正常に立ち上がったかどうかをチェックするには、最後のURLにアクセスして確認します。
Terratestで下記のようなスクリプトを書くことで、上記のスクリプトを実行し、結果を確認し、破棄するまでの作業を自動的に行ってくれます。
func TestWebServer(t *testing.T) {
terraformOptions := &terraform.Options {
// The path to where your Terraform code is located
TerraformDir: "../web-server",
}
// At the end of the test, run `terraform destroy`
defer terraform.Destroy(t, terraformOptions)
// Run `terraform init` and `terraform apply`
terraform.InitAndApply(t, terraformOptions)
// Run `terraform output` to get the value of an output variable
url := terraform.Output(t, terraformOptions, "url")
// Verify that we get back a 200 OK with the expected text. It
// takes ~1 min for the Instance to boot, so retry a few times.
status := 200
text := "Hello, World"
retries := 15
sleep := 5 * time.Second
http_helper.HttpGetWithRetry(t, url, status, text, retries, sleep)
}
上記のTerratestのスクリプトでは、まず読み込むTerraformのスクリプトを指定し、処理が終わったら破棄(destroy)することを指定、そして実行します。
確認すべきURLを読み込み、確認する内容を指定し、実行が終わった時点で確認を実行する、という内容になっています。
テストを実行すると、実行の様子と最終結果がコンソール上に表示されるわけです。
TerratestはGo言語で記述されており、開発元のGruntworkでは合計で25万行ものTerraformやGo、Python、Bashなどで記述されたインフラ構成コードのテストに役立ててきたとのことです。
あわせて読みたい
インテル、アルテラ買収後初のXeonとFPGAの統合製品「Intel Xeon Scalable Processor 6138P」発表。FPGAで仮想スイッチを高速に実行
≪前の記事
Google Cloud、最大メモリ4TB/160vCPUの大型マシンタイプ「n1-ultramem」提供を発表