構成ファイルの通りにインフラは立ち上がったのか? インフラ自動テストツール「Terratest」がオープンソースで公開

2018年5月17日

クラウドの利用において、インフラの構成をコードで記述することは一般的になってきました。インスタンスのサイズや台数を指定し、仮想マシンのイメージを指定し、ネットワーク構成を指定する、といった内容を記述したファイルを用意し、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などで記述されたインフラ構成コードのテストに役立ててきたとのことです。

あわせて読みたい

AWS 運用・監視 HashiCorp




タグクラウド

クラウド
AWS / Azure / Google Cloud
クラウドネイティブ / サーバレス
クラウドのシェア / クラウドの障害

コンテナ型仮想化

プログラミング言語
JavaScript / Java / .NET
WebAssembly / Web標準
開発ツール / テスト・品質

アジャイル開発 / スクラム / DevOps

データベース / 機械学習・AI
RDB / NoSQL

ネットワーク / セキュリティ
HTTP / QUIC

OS / Windows / Linux / 仮想化
サーバ / ストレージ / ハードウェア

ITエンジニアの給与・年収 / 働き方

殿堂入り / おもしろ / 編集後記

全てのタグを見る

Blogger in Chief

photo of jniino

Junichi Niino(jniino)
IT系の雑誌編集者、オンラインメディア発行人を経て独立。2009年にPublickeyを開始しました。
詳しいプロフィール

Publickeyの新着情報をチェックしませんか?
Twitterで : @Publickey
Facebookで : Publickeyのページ
RSSリーダーで : Feed

最新記事10本