メソッド屋のブログ

米マイクロソフト Software Development Engineer 牛尾の日記です。ソフトウェア開発の上手なやり方を追求するのがライフワーク。本ブログは、個人の意見であり、所属会社とは関係がありません。

アジャイルなインフラのつくり方とデータマネジメント

さて、今日2発目のブログは、多くの人に書いてくれ〜と言われて約束していたネタです。


目下最近の私の2大関心毎は「Lean Startup/UX」と「Continuous Delivery」です。Lean Startupは書きましたので、何で「Continuous Delivery」か?というのは、理由があります。


 最近実は企画フェーズのコンサルの中でプログラムを書いています。JQuery Mobile + Ruby on Rails on EC2 という感じです。インフラからアプリケーション、そしてUX的な要求開発なんかもやっています。チームは企画フェーズのアジャイルなので小さいですが、今回のアプリケーションを作っていて思っていることですが、Agileに加えてRailsJQuery Mobileを使うとかなり開発って加速するのですが、どうしてもめんどくさい事があります。1つはインフラ構築です。EC2でさっと立ち上げれるのはかなりええ感じですが、EC2特有の料金トラップがあるので、何回か環境を再作成してとってもめんどくさい想いをしました。
 そして、もう一点がデータ。今回は本番データを使っていますが、そのデータ移行は本当に手間がかかるのです。私もアジャイラーなので、結構自動化していますが、データ量がとてつもなく多い事もあって、時間がとてもかかります。データを自分の環境だけでなく、本番環境、そして他の開発メンバPCにもセットアップしてもらう必要があるのでむっちゃくちゃめんどくさいのです。
 そういったことを含めて、アプリがいくら早くつくれても、結局本番化やデータマネジメントの泥臭い部分がネックになると思うのです。


 最初はRailsマイグレーションにしこんで自動化していたのですが、データ量が強烈だったので、その仕組みがマイグレーションRuby実行だけでCPU100%の悲しい目にあい早くも破綻しましたww ですので、MySQL+シェルでやるとかいろいろ工夫してやっていますが、マイグレーションに100%頼っているときよりもまだ自動化のシステムがうまくできていません。


#ちなみにContinuous Delivery」のデータマネジメントの章をみると、開発環境はあくまで本番データ等をさまってもってくるようなことをしたらあかんと書いていました。通常は本番/ステージング/開発環境を用意して開発環境は作成データとしますが、やっぱりそれがいいみたいです(今回は企画時のRubyプロトタイプなのでそうしませんでしたが、私の間違いでした)そして開発環境はインメモリデータベースとかにするといいんじゃね?とか書いてあり、なるほどなぁ。と思いました。データベースリファクタリングにも似たような事が書いてあったような気がします。つまりテストを自動化出来る必要がありますよね。リアルデータはステージング以上の環境で検証すればいいのです。(ある意味当たり前ですね)アジャイル時のデータマネジメントについてはもっともっと、研究が必要と思います。Rails特有のデータの洗い替えの必要性(サロゲートキー環境へのデータインポート等)もありますし、、、まだまだですね(私が)。


Continuous Delivery: Reliable Software Releases through Build, Test, and Deployment Automation (Addison-Wesley Signature Series (Fowler))

Continuous Delivery: Reliable Software Releases through Build, Test, and Deployment Automation (Addison-Wesley Signature Series (Fowler))

Refactoring Databases: Evolutionary Database Design (paperback) (Addison-Wesley Signature Series (Fowler))

Refactoring Databases: Evolutionary Database Design (paperback) (Addison-Wesley Signature Series (Fowler))


しかし、それでもインフラ構築はEC2になってもめんどくさい面があります。何度もMySQLRuby On Rails , Apacheなんかを同じコマンドをうって環境構築なんか、怠惰なプログラマには耐えられません。
しかし、実はAgile2011でとっても面白いセッションを見てきたので、皆さんに情報共有してみたいと思います。


どんなものかというと、インフラ構築も自動化してしまって、自動テストまでしてしまえ、、、という恐ろしいソリューションです。しかも全てRubyの世界でかたが着きます。Lean Startupな企業の皆さんはやはりRoRで作っている方が多かったですが、そういう方にも今後注目のソリューションだと思います。


Continous Integegration for the world : Agile code + Agile Infrastructure:

Agile2011: Continuous Integration for the world: Ag...


コレはデモのセッションなのですが、Rubyのライブラリを入れて、Rakeで使うような設定ファイルをちょちょいと設定すると、ワンボタンで仮想マシンの立ち上げ/設定/テストなんかも自動化して実施されてしてしまします。また、インフラはもちろんの事、一番上のレイヤのアプリケーションレイヤまで全て自動化のソリューションがそろっているのは本当に面白い。

実際に試してないのでどの程度使えるかしりませんが、まさにInfrastructure as a codeという世界です。


まず最初に紹介したいのがこれ

veewee

インストール方法も上記のページにのっています。

VeeweeはVargant(これも後で紹介)ベースのバーチャルマシンボックス(EC2でいうところのAMIみたいなもの)をカンタンに作るツールです。ciefかpuppet(後述)を使えます。

Vargant
Vargant

さっきのVeeweeはこのVargantの上で動いています。Vargantは仮想開発環境を構築するツールです。 Ruby DSLで設定を書きます。以降のツールはすべてRubyDSLで設定を書きます
プロビジョニングもやりはります。

この衝撃のデモを見てくださいww

こっちのリンクの方がわかりやすいけどww
http://vimeo.com/9976342


こちらはAgile2011の公式なリンクのデモ

ちなみにインターネットでググると既に日本語で情報を発信している人が。凄いおとこやで。

他の参考資料


MCCloud

jedi4ever/mccloud · GitHub

Vargantのクラウドバージョン。つまりEC2で動きます。まさに夢のようですね。動いたら。試してみたい!プロビジョニングもできます(確か)


Chef/Puppet

Vargantで使われているシステム管理のツールです。各種周布とのインストール設定等を自動化するもののようです。どうやらAll about Chef ... — Chef Docs
chefの方が新しいっぽいので、こっちでいいみたいです。

例えばシェフの説明では

シェフは、システムインテグレーションフレームワークで、インフラストラクチャーに対して構成管理の利点をもたらします。

・あなたのサーバーをコードを書く事で管理する。コマンドを実行することなく
・アプリケーション、データベース、LDAPディレクトリ等をインテグレートします。
・インフラに対して、カンタンにアプリケーションを設定できます。(どんなシステムが、自分のアプリケーションで動いている?マスターデータベースサーバはどれ?等)




検索すると日本語でも多少言及されているみたいです。
さようならPuppet、こんにちはChef - Masatomo Nakano Blog
システム管理ツールChefのチュートリアル(RailsConf2009レポート) - クックパッド開発者ブログ
大規模システム運用でpuppetやchefだけでは解決しづらいことを解決するMCollective! - よかろうもん!


今までは、ユニットテストの自動化、スモークテストの自動化、受入テストの自動化などのアプリケーションレイヤの自動化が中心でしたが、とうとうインフラレイヤも自動生成/自動テストの時代になりましたね。これは楽しいです。

あとはデータマネジメントがすっきりすればうれしいけど、これはいつもめんどくさいところなんですなぁ、、、泥臭いけど、本当に大切なところです。


Cucumber