OSSのクラウド基盤「Eucalyptus」を使う(8)--応用編〜おわりに

高橋浩和、箕浦真(VA Linux Systems Japan)
2009-08-04 15:35:01
  • このエントリーをはてなブックマークに追加

 この連載では、Amazon EC2互換のクラウド基盤であるOSS「Eucalyptus」を使い、「自分たち専用」のクラウド環境を構築することを目標に解説を行ってきました。今回は最後のまとめとして、ビルド専用環境の構築方法を考えてみましょう。

13.応用編〜ビルド専用環境

 Eucalyptusの持つさまざまな機能を活用して、もう少し実用的な使い方を試してみましょう。例として、Eucalyptus自体の開発版をビルドするための環境を構築してみます。「最新版を取得し、そこに含まれるspecファイルをもとにRPMファイルを作成する」というものです。以下のような機能を活用します。

ユーザーデータ

 「ec2-run-instances」の「-d」オプションで任意の文字列をインスタンスに与えられます。インスタンスからはHTTPで取得できますので、動作の微調整に使えます。

EBS

 Eucalyptusの開発版ソースコードを置いておくのに使います。Eucalyptusはソースコード管理にBazaarを使っています。CheckoutしたソースツリーをEBSに保存しておくことで、最新版への更新時の負荷が下がります。

インスタンスストレージ

 「/dev/sda2」にattachされる一時ディスクを「/usr/src/redhat」にmountし、ビルド作業用および結果保存用などに使います。「/dev/sda2」は都度mkfsされてしまうので、「/usr/src/redhat」以下の「BUILD」「RPMS」などのサブディレクトリは作る必要があります。

Walrus

 ビルドした結果のrpmファイルをWalrusに置くことにしましょう。Walrusは、インスタンス側からもクラウドの外からもアクセスできるストレージですので、このような目的には最適です。

ユーザーイメージ

 「起動すると自動的にソースツリーを最新の開発版に更新し、ビルドする」という仕組を仕込んだマシンイメージを作ります。最初に作成したCentOSのマシンイメージをベースとして利用します。

 まずは細かい仕様を決めてしまいましょう。動作に関しては、ユーザーデータとして渡された文字列をそのままgetopt(1)に渡す形にしましょうか。(*1)

  • -n: ビルドの実行をしない(既定では「する」)
  • -h: 終了後インスタンスを終了しない(既定では「する」)
  • -b : ビルド結果を格納するWalrusのbucketを指定する(既定では「eucabuild」)

 たとえば「-n -h」と指定すれば、ビルドを実行しないでログインを受け付けるようにする、という意図になります。

 ビルドには、Bazaarリポジトリの最新版に含まれるspecファイルを使いますが、このspecファイルに書かれたバージョン/リビジョン番号は、通常リリース寸前にしか更新されません。一方で、できたrpmファイルを識別するためには、すべてのビルドについてバージョン/リビジョン番号が変わっていた方が便利です。

 そこで、バージョン文字列にビルド番号を含むようspecファイルを編集して使うことにします。ビルド番号はEBSに保存しておき、ビルドのたびに増やします。

 ビルドログを取り、rpmファイルといっしょにWalrusに置くことにしましょう。

 以上をスクリプト化し、起動時に実行するようにします。スクリプトのうちキモとなる部分を説明しましょう。

(*1)この仕様でうまくいきそうに見えますが、実はAmazon EC2 API Tools 1.3-30349の「ec2-run-instances」コマンドには不具合があって、「-」(ハイフン) で始まる文字列を「-d」オプションを使って渡そうとすると、混乱してコマンドラインをうまく解釈できないようです。euca2oolsなど他のツールを使うか、ec2-run-instancesの「-f」オプションを使えば渡すことができます。

スクリプトの解説

  • 新着記事
  • 特集
  • ブログ