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

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

カテゴリ 運用ツール / システム運用
タグ  AWS , DevOps , HashiCorp


次の記事
インテル、アルテラ買収後初のXeonとFPGAの統合製品「Intel Xeon Scalable Processor 6138P」発表。FPGAで仮想スイッチを高速に実行

前の記事
Google Cloud、最大メモリ4TB/160vCPUの大型マシンタイプ「n1-ultramem」提供を発表


カテゴリ



Blogger in Chief

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

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



新着記事 10本


PR - Books


fig

fig

fig