カテゴリー別アーカイブ: AWS

CookbookのCIはkitchen-docker on SSDインスタンスRAID0で高速化(2014.04.17追記:しないかも…)

 

ChefのCookbookの開発保守効率向上のために、

Jenkinsによる自動テスト・CIを最近始めましたが、

色々やりながらちょっとずつ試して、

やっと「コレだ!」と思える構成とフローができました。

その全体像は別で述べたいと思いますが、

その中でやっている、テスト実行の高速化が上手くいったのでその話を。

 

Cookbookの開発で一番ネックになるのはやはりテストで、

  • テスト環境の立ち上げ
  • Cookbook適用
  • テスト実行

で、一回の実行にけっこう時間がかかる訳です。

 

git pushをJenkinsでフックして自動実行→終わったら通知

となって待たなくて良くなったとはいえ、できる限り早く結果は知りたい。

 

まず、Virtualbox仮想環境→コンテナ環境でテスト環境の立ち上げを高速化。

そもそも僕の場合はCI環境はEC2仮想サーバなので、

Virtualboxは使えないのですが、

LXCではなく、一応Macでも同じ方法でテストできるDockerを選択しました。

 

その上で、Dockerのコンテナ配置場所を

SSDインスタンスのエフェメラルディスクをRAID0で組んでマウントすることで、

さらに高速化することができました。

 

Dockerやtest-kitchen,kitchen-dockerのインストール方法及びAWSの操作は本筋とそれるので割愛します。

2014.04.17 /var/lib/docker/containers→/var/lib/dockerに修正しました。

/var/lib/docker/containersだと、

起動時にEBS領域から切り取られてコンテナ用のファイルシステムが作られてしまいます。

RAID組んでDockerのコンテナ配置場所にマウントするのはこんな感じです↓

# mdadm --create --verbose /dev/md0 --level=stripe --raid-devices=2 /dev/xvdb /dev/xvdc
# mkfs.ext4 /dev/md0
# mount /dev/md0 /var/lib/docker

※インスタンスタイプがc3.lergeの例なので、エフェメラルディスクは2つ
※HVM AMIを選択すること
※エフェメラルディスクは起動時に割り当てが必要

 

エフェメラルディスクのRAID設定はよく使いそうなので、

「それこそChefの出番だろ」と思ってコチラも作ってはみたのですが、

Stop→StartでRAIDの設定消えたり、

RebootではRAIDの設定は残るけど、RAIDデバイスの名前が変わったりで、

上手くいかない場合があって試行錯誤中です…

とりあえず試作品です。上手くいったらLWRPで手軽に使える感じにしたいです。

 

これをやることで、以下のような結果が得られました。

測定に使用したCookbookはコチラです。

 

EBS

Chef Client finished, 52/60 resources updated in 292.319082057 seconds
Kitchen is finished. (5m44.96s)

Ephemeral disk RAID0

Chef Client finished, 52/60 resources updated in 220.907645243 seconds
Kitchen is finished. (4m37.20s)

iMac(2011 mid)で10分以上、さくらVPS2GBプラン(個人ではAWSまだ高いw)で、

8分ほどかかる特別時間のかかるCookbook(wなので、

かなり良い結果と言えるのではないでしょうか:-)

 

2014.04.17 追記:

上述したように、/var/lib/docker/containersだと、

起動時にEBS領域から切り取られてコンテナ用のファイルシステムが作られてしまっていることが発覚しましたが、

変更してEphemeral disk上になるようにしても優位な結果が得られませんでした。

上の比較で優位な結果が出たのは、起動直後のEBSは性能が悪い聞いたことがあるので、

そういう類で差がついたものと思われます。

 

 

全然別件ですが、もしChefネタなので一応宣伝。

札幌に在住の方がもし居ましたら、

こんなんやりますので、ご興味あればどうぞ。

Chef Meetup Sapporo

 

 

 

 


シンプルなEC2の料金表作った

AWSの衝撃的な値下げ(4/1~)もあり、料金表を見直すことが多くなるわけですが、

最近、EC2の料金表が見づらいやら表示が遅いやらで、

かなりイライラすることが増えたので、

シンプルに見られる料金表のページを作った。

 

ちゃんとAWSのHPで使われてるデータソースと同じのを使っているので、

フォーマット変わったりしなければ更新が反映されるはず…?

 

ソース(っていってもhtmlとjsだけですが)はGithubで管理しているので、

何か変なところがあればIssue切るなりしてもらって結構です。

直してもらってpull reqでも良いですよ:)

だいぶ殴り書きっぽいソースはコチラ

 

たぶん、自分がよく使うのでブログのメニューに入れてみました。

コチラからどうぞ

 

 


serverspecでRDSのパラメータをテストするカスタムリソースを作ってみた

最近、「にわかChef使い」「オレ流運用」から脱却し、

「汎用Chef使い」「モダンな運用」を目指して、

構成の見直しや今までに書き溜めたcookbookのリファクタリングをしています。

 

…で、リファクタリングするならテスト書かなきゃダメでしょう!

(っていうか今まで書いてなかったんかいって話ですがw)

 

ということで、serverspecでテストも書き始めました。

 

そんな中に、

「RDSのパラメータの設定もChefでやっちゃえば設定周りは全部chef-solo実行するだけになるから楽じゃね?」

って勢いで作ったレシピがありまして、

これのテストをどうしたもんかなあ…と思ってGoogle先生に聞いても、

なんか良い方法を教えてくれなかったので、作ってみました。

 

serverspecの拡張方法はきっとGoogle先生が教えてくれるはず!と思ったら、

やっぱりありました。

 

これを参考に、作ったらこんな感じになりました↓

こんな感じで使えます↓

シンプルで良い感じです。

 

参考にさせていただいた記事にも書かれている(下の*1)ように、

「本来であれば、serverspec をフォークし、新しいリソースタイプを追加した上で pull リクエストを送るのが筋」なのかとも思いましたが、

以下の理由から辞めました。

  1. serverspecに本質的には関係の無いAWS SDKという依存関係を持ち込むのは良くない
  2. serverspecはSSHで対象のサーバに繋いでテストするツールな訳だが、
    RDSのパラメータ取得するのにSSH要らない
    (Chefで設定するのも一気に全部できて楽だからというだけで、同じ理由で冗長であるw)

まあ、↑じゃなくてもチキンなので多分できなかったでしょうがw

 

テストの実行は、

  1. git push
  2. Jenkinsさんが検知
  3. Jenkins先生がEC2にサーバ立ててChef実行
  4. Jenkins様がテストして結果を教えてくれる

っていう所謂自動テスト•CI的な所もチャレンジしていて、一応動いてるんですけど、

微妙に安定稼働していないのと試行錯誤してやったのでまとめきれていないので、

また今度書こうと思います。