AWSのリソース構成をServerspecのようにテストする "awspec" をつくった

AWSのリソース構成をServerspecのようにテストできる "awspec" をつくりました。

github.com

例えばEC2インスタンスであれば、以下のように書けます。

describe ec2('my-ec2') do
  it { should exist }
  it { should be_running }
  it { should_not be_stopped }
  its(:instance_id) { should eq 'i-ec12345a' }
  its(:private_ip_address) { should eq '10.0.1.1' }
  it { should have_security_group('my-security-group-name') }
  it { should belong_to_vpc('my-vpc') }
  it { should belong_to_subnet('my-subnet') }
  it { should have_eip('123.0.456.789') }
end

使い方

awspecをインストール後、

$ awspec init

で、Rakefile、spec/spec_helper.rbを生成します。

AWSのクレデンシャル設定 (~/.aws/* か ENVか spec/secrets.yml) をしたあと、Serverspecと同じように *_spec.rb を書いていきます。

対応リソースタイプ

いまのところリソースタイプとして

  • ec2
  • rds
  • rds_db_parameter_group
  • vpc
  • security_group
  • route53_hosted_zone

があります。

route53_hosted_zone だと、

describe route53_hosted_zone('example.com.') do
  it { should exist }
  its(:resource_record_set_count) { should eq 5 }
  it { should have_record_set('example.com.').a('123.456.7.890') }
  it { should have_record_set('example.com.').mx('10 mail.example.com') }
  it { should have_record_set('mail.example.com.').a('123.456.7.890').ttl(3600) }
  ns = 'ns-123.awsdns-45.net.
ns-6789.awsdns-01.org.
ns-2345.awsdns-67.co.uk.
ns-890.awsdns-12.com.'
  it { should have_record_set('example.com.').ns(ns) }
  it { should have_record_set('s3.example.com.').alias('s3-website-us-east-1.amazonaws.com.', 'Z2ABCDEFGHIJKL') }
end

みたいな感じです。

spec生成機能

(テストツールとしては、???な機能ですが) awspec導入を簡単にするために既存のAWSリソース構成から spec を生成する機能を作っています。

AWSマネジメントコンソールなどでVPC ID (vpc-ab123cde) を調べた後、awspec generate コマンドで

$ awspec generate ec2 vpc-ab123cde

とすると標準出力にVPC内のEC2インストールの spec が出力されます。これを ec2_spec.rbなどに追記すれば簡単ですね!

つくった経緯など

あるAWSシステム構築案件で構築したあとに、その構成のチェックをしようとしたときに、良いチェック方法が見つからず。

AWS謹製のCloudFormer も開発進捗が見えず。

結局Excelのチェック表片手に目視確認などをして終わらせたことがあり、結構残念感がありました。

「サーバ構成はServerspecがあるのに、AWSリソース構成はServerspecのようにはテストできないかな」

ということで、つくってみようかなと、つくりはじめました。

awspecのアーキテクチャ

ソースコードの構成をみると一目瞭然なのですが、awspecのアーキテクチャというか設計は、ほとんどServerspecと同じです。

Serverspec

Serverspec

実は、ここ最近まで、ずっとServerspec本(通称:アホ毛本らしい)を読みかえしていました。

というのもServerspec本には、Serverspecの内部実装についてとても詳しく説明が書かれているからです。 さらに言うと、RSpecのタイプやマッチャの拡張とかはすべてServerspec本で学びました。

Serverspec(と、アホ毛本)がなかったらawspecはありませんでした。mizzyさんありがとうございます。

オリジナルのコンセプトは1年前

(非常にありがたいです!)

というわけで、実は、1年も前に「同じ名前」「同じコンセプト」で @marcy_terui さんがawspecをつくっていました。(作ったあと、ふとググったらあったという。。。すみませんすみません)

ちなみに rdb_db_parameter_group リソースは marcy_terui さんからの提供です。

今後

AWSがいい感じの構成確認サービスを作るまでは(AWS Configに期待)、自分が使う範囲でボチボチ育てていこうかと思います。


宣伝

福岡でAWSと格闘したい方、AWSを使ったシステム構築をしたい方、なんかいろいろしてみたい方、プログラミングが好きな方、弊社Fusicではエンジニアを募集しています。こことかこことかで是非。