AWSのリソース構成をServerspecのようにテストできる "awspec" をつくりました。
例えば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と同じです。
- 作者: 宮下剛輔
- 出版社/メーカー: オライリージャパン
- 発売日: 2015/01/17
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (5件) を見る
実は、ここ最近まで、ずっとServerspec本(通称:アホ毛本らしい)を読みかえしていました。
というのもServerspec本には、Serverspecの内部実装についてとても詳しく説明が書かれているからです。 さらに言うと、RSpecのタイプやマッチャの拡張とかはすべてServerspec本で学びました。
Serverspec(と、アホ毛本)がなかったらawspecはありませんでした。mizzyさんありがとうございます。
オリジナルのコンセプトは1年前
かつて、自分がやろうとして途中で諦めたコンセプトを実現しようとしているので、全力で応援したい / “k1LoW/awspec · GitHub” http://t.co/5pzfktAVu8
— Marcy Terui (@marcy_terui) July 29, 2015
@k1LoW 昔僕が作ってたやつから移植できそうなやつが一個だけあったのでPR送っておきましたー。
https://t.co/OzVLQ69O3t
— Marcy Terui (@marcy_terui) July 28, 2015
(非常にありがたいです!)
というわけで、実は、1年も前に「同じ名前」「同じコンセプト」で @marcy_terui さんがawspecをつくっていました。(作ったあと、ふとググったらあったという。。。すみませんすみません)
ちなみに rdb_db_parameter_group
リソースは marcy_terui さんからの提供です。
今後
AWSがいい感じの構成確認サービスを作るまでは(AWS Configに期待)、自分が使う範囲でボチボチ育てていこうかと思います。
宣伝
福岡でAWSと格闘したい方、AWSを使ったシステム構築をしたい方、なんかいろいろしてみたい方、プログラミングが好きな方、弊社Fusicではエンジニアを募集しています。こことかこことかで是非。