
OSSのクラウド基盤「Eucalyptus」を使う(8)--応用編〜おわりに
スクリプトの解説
まずはユーザーデータを取得します。デバッグ用に、スクリプトに引数が渡されていれば、それを代わりに使います。
nobuild= nohalt= bucket=eucabuild if [ $# -eq 0 ]; then curl -s -o /tmp/ud$$ http://169.254.169.254/latest/user-data || exit 11 ud=`cat /tmp/ud$$` set -- $ud fi args=`getopt nhb: $*` if [ $? -ne 0 ]; then echo 'Usage: ec2run -d "[-n] [-h] [-b]"' `curl -s http://169.254.169.254/latest/meta-data/ami-id` exit 12 fi set -- $args while [ $# -gt 0]; do case "$1" in -n) nobuild=1;; -h) nohalt=1;; -b) bucket=$2 shift;; --) shift break;; esac shift done if [ $# -gt 0]; then echo 'Usage: ec2run -d "[-n] [-h] [-b ]"' `curl -s http://169.254.169.254/latest/meta-data/ami-id` exit 13 fi
ここでは、ユーザーデータをcurlで取得してその値をそのままgetopt(1)に渡しています。オプションの分析結果はシェル変数「nobuild」「nohalt」「bucket」に反映させます。
EBSをインスタンスに割り当てる部分を見てみましょう。試験などのためには、既に割り当てられていたらスキップするような処理があるとよいでしょう。
MYID=`curl -s http://169.254.169.254/latest/meta-data/instance-id` case "$MYID" in i-????????) ;; *) echo "Cannot get my instance ID" return ;; esac if [ ! -d /sys/block/sdb1 ]; then ec2-attach-volume -K $EC2_PRIVATE_KEY -C $EC2_CERT -U $EC2_URL $VOLUME -i $MYID -d sdb1 i=0 while [ $i -lt 30 ]; do if [ -d /sys/block/sdb1 ]; then break fi sleep 1 i=$(($i+1)) done if [ $i -ge 30 ]; then echo "Failed to attach EBS" return fi fi if [ ! -d /mnt/eucalyptus ]; then mount /dev/sdb1 /mnt fi
ここで「EC2_PRIVATE_KEY」「EC2_CERT」「EC2_URL」は、それぞれeucarcの変数と同じです。また、VOLUMEはEBSのID、つまり「vol-????????」です。
EBSを含むすべてのブロックデバイスは、「/sys/block」の下にエントリを持ちますので、EBSがインスタンスに割り当てられているか否かの判断に使えます。
ec2-attach-volumeコマンドが終了しても、実際に割り当てられるまでには時間がかかりますので、しばらくポーリングしています。
Bazaarのリポジトリから最新版を取得した後、ソースコードに含まれているspecファイルを編集します。ビルド毎にバージョンを変えるのが目的ですから、specファイルの「Release:〜」の行の最後にビルド番号を追加することにします。specファイル名が一度変わっているのでそれに対応しました。また、合わせてtarボールとSRPMを作ります。
if [ ! -f /mnt/revno ]; then revno=0 else revno=`cat /mnt/revno` fi revno=$(($revno+1)) echo $revno > /mnt/revno if [ -f /mnt/eucalyptus/eucalyptus.spec ]; then specfile=eucalyptus/eucalyptus.spec elif [ -f /mnt/eucalyptus/eucalyptus.spec.centos ]; then specfile=eucalyptus/eucalyptus.spec.centos else echo "specfile not found" return fi sed -e "/^Release:/s/\$/.$revno/" /mnt/$specfile > /usr/src/redhat/SPECS/eucalyptus.spec version=`rpm -q --specfile /usr/src/redhat/SPECS/eucalyptus.spec --qf "%{VERSION}\n" | head -1` cd /mnt find eucalyptus -name .bzr -prune -o -print | sort | pax -wd | gzip -9v > /usr/src/redhat/SOURCES/eucalyptus-${version}.tgz rpmbuild -bs --nodeps /usr/src/redhat/SPECS/eucalyptus.spec
この後、念のため依存パッケージを調べてyumでインストールします。
rpm -q -p /usr/src/redhat/SRPMS/eucalyptus-*.src.rpm -R | sed -e 's% *$%%' | xargs -d '\n' yum -y install rpmbuild -bb /usr/src/redhat/SPECS/eucalyptus.spec
最後に、できたRPMファイルとここまでのログをWalrusにアップロードします。アップロードには、ホスト名を修正した「S3 curl」を使います。
s3-curl.pl --id=foo --createBucket=$bucket -- $S3_URL/$bucket for file in `find /usr/src/redhat/RPMS /usr/src/redhat/SRPMS -name \*.rpm`; do s3-curl.pl --id=foo --put=$file -- $S3_URL/$bucket/`basename $file` done s3-curl.pl --id=foo --put=/tmp/log -- $S3_URL/$bucket/log
それでは以上の実行環境を整えてみましょう。いつものようにインスタンスを起動してログインします。以下のような作業は定石として実行しておきます。
- yumのBaseグループのインストール(yum groupinstall Base)
- firstbootコマンドによる各種設定
- アカウント設定、.sshのauthorized_keys編集
- ホスト名変更
firstbootコマンドはBaseグループに含まれていますが、一度実行しておかないと、起動の度に実行されることになります。
Eucalyptusビルド環境用に必要な処理としては、以下があります。
- Baseグループに加えてDevelopment Toolsグループも合わせてインストール。rpmbuildなどが含まれます。
- Eucalyptusのソースコードリポジトリに使われているBazaarのコマンドラインツールbzrのインストール。bzrは例によってEPELにありますが、Eucalyptusが依存しているいくつかのパッケージもEPELにありますので、EPELのリリースファイル「epel-release-5-3.noarch.rpm」も入れておくのがよいと思います。
- Amazon API Toolsのインストール。インスタンス内部からEBSを割り当てるのに使います。
- Java実行環境のインストール。API ToolsがJavaで書かれているため必要になります。
- Walrus用に修正したS3 curlのインストール。できたパッケージやログをアップロードするのに使います。
- API ToolsとS3 curlの設定。具体的には、EucalyptusアカウントのX.509証明書や、「$HOME/.s3curl」をコピーしておきます。
- 依存パッケージのインストール、またはバンドルされている依存パッケージのyumリポジトリ化。依存パッケージが変わることを考慮すると、後者がよいと思われます。チェックアウトしたソースコードとともに、EBSに置くのがよいのではないでしょうか。
- axis2の展開。Eucalyptusのspecファイルでは、eucalyptus-src-depsに含まれるaxis2-1.4.tgzが、/opt/packages以下に展開されていることを前提にしています。
- fstabの編集。一時ディスクsda2が、/usr/src/redhatにmountされるようにします。
- 新着記事
- 特集
- ブログ
- 企画特集
-
データの散在と非常率運用がネック
-
クラウド時代に理想のセキュリティ
-
いまあるデータで身近な業務をDX
-
次の一手はこれだ!
-
ゼロトラストに向けた道のりを支援
-
M365 活用のセキュリティ対策
-
連載!プロが語るストレージ戦略
-
SoRとSoEをつなぐDX推進の要
-
コスト・運用の壁を崩す!
-
いまさら聞けない「PPAP」
-
第4回CNBFミートアップレポート
-
漫画で解説:IoTはじめの一歩
-
IDaaSって何?
-
連載!プロが語るストレージ戦略
-
ハイブリッドクラウドとAI
-
性能の大幅向上を実現!
-
リモート、オフィス、オンサイト
-
厳しい目が向けられる内部不正
-
明日からではもう遅い?!
-
企業のリスクマネージメント対策に
-
その先へ
-
デジタルを当たり前と言えるか?
-
連載!プロが語るストレージ戦略
-
ネットワークもサービスとして使う
-
クラウド活用 虎の巻
-
セキュリティの今を知る
-
特集:IT最適化への道
-
次期自治体ネットワーク強靭化へ
-
部分最適だけではダメ
-
未来のセキュリティイノベーターへ
-
DX時代のアプリケーションセキュリティ
-
ビッグデータ最前線!
-
SECCON2020レポート第二弾!