構成ファイルの通りにインフラは立ち上がったのか? インフラ自動テストツール「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などで記述されたインフラ構成コードのテストに役立ててきたとのことです。

Tags: AWS 運用・監視 HashiCorp

このエントリーをはてなブックマークに追加
ツイート
follow us in feedly




タグクラウド

クラウド / AWS / Azure / Google Cloud
コンテナ / Docker / Kubernetes
クラウドネイティブ / サーバレス
クラウド障害 / 運用・監視

プログラミング言語 / 開発ツール
JavaScript / Java / .NET / WebAssembly
HTML/CSS / Web標準

アジャイル開発 / スクラム / DevOps / CI/CD
ソフトウェアテスト・品質
ローコード/ノーコード開発

データベース / RDB / NoSQL / 機械学習・AI
Oracle Database / MySQL / PostgreSQL
Office / 業務アプリケーション

ネットワーク / HTTP / QUIC / セキュリティ
OS / Windows / Linux / VMware
ハードウェア / サーバ / ストレージ

業界動向 / 働き方 / 給与・年収
編集後記 / 殿堂入り / おもしろ

全てのタグを見る

Blogger in Chief

photo of jniino

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

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

最新記事10本