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

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

 API Toolsの動作確認も兼ねて、インスタンス内部からEBSを割り当て、まずはEucalyptusの最新開発版をチェックアウトしてみます。ここでは、EucalyptusのX.509証明書を「/root」に、API Toolsを「/usr/local/ec2」に置いてあるものとします。

code01 コマンドの入力例(赤字の部分をコマンドとして入力する)

 スクリプトの動作確認をしたら、これが起動時に実行されるようcrontabにでも追加して、イメージを作ります。イメージは、インスタンスストレージ上に作るようにします。

code02 コマンドの入力例(赤字の部分をコマンドとして入力する)

 入力例4行目の“”の部分は、eucarcの中で定義されている「alias ec2-bundle-image」を見てください。

 できたバンドルは、いつものようにアップロード・登録して完了です。なお、カーネルやramdiskのイメージは、adminユーザにしか登録できませんが、マシンイメージは誰でも登録できます。

(本稿の一番最後に「自動ビルドスクリプト」のコード例を掲載しています)

終わりに

 本連載(自分たち専用のクラウドを作ろう)では、クラウドが生まれた背景の話から始まり、Eucalyptusを用いてクラウド環境を立ち上げるための手順までを解説してきました。

 限られたページ数の中でですが、基本的な事項については一通り説明することができたと思います。しかし、連載ではセキュリティグループを始めとする、触れることのできなかった興味深い仕組みがまだいくつかあります。これらの機能については、ぜひ自分の手で調べ進めてみてください。

 今回は、Amazon EC2やEucalyptusを題材にしましたが、これらの仕組みだけがクラウド基盤ではありません。しかし、これらはクラウド基盤としては非常に典型的な機能を提供しており、今後次々と立ち上がってくるであろう様々なクラウドシステムの手本とされると思われます。

 今回知ることのできた、クラウド基盤が提供すべき機能の知識や、クラウド基盤に使われる要素技術は、今後現れてくるであろう別のクラウドシステムに対しても通用すると思います。

 長きに渡った本連載も、今回が最終回です。Eucalyptusが大きく進化した時、またはクラウドコンピューティングの世界に新たな流れが生まれた時、再びこの場を借りて、解説させていただければと考えています。

自動ビルドスクリプトのサンプルコード

#!/bin/sh

EUCA_KEY_DIR=/root
S3_URL=http://172.16.4.1:8773/services/Walrus
EC2_URL=http://172.16.4.1:8773/services/Eucalyptus
EC2_PRIVATE_KEY=${EUCA_KEY_DIR}/euca2-foo-XXXXXXXX-pk.pem
EC2_CERT=${EUCA_KEY_DIR}/euca2-foo-XXXXXXXX-cert.pem
EUCALYPTUS_CERT=${EUCA_KEY_DIR}/cloud-cert.pem
EC2_ACCESS_KEY='??????????????????????'
EC2_SECRET_KEY='??????????????????????????????????????'

VOLUME=vol-XXXXXXXX

EC2_HOME=/usr/local/ec2
JAVA_HOME=/usr/lib/jvm/java-1.6.0
export EC2_HOME
export JAVA_HOME

PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/ec2/bin

do_build() {
    # skip error checks; assume set -e
    for dir in SOURCES SRPMS SPECS RPMS RPMS/geode RPMS/i386 RPMS/athlon RPMS/noarch RPMS/i586 RPMS/i486 RPMS/i686 BUILD; do
if [ ! -d /usr/src/redhat/$dir ]; then
    mkdir /usr/src/redhat/$dir
fi
    done
    find /usr/src/redhat \! -type d | xargs rm -f

    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

    cd /mnt/eucalyptus
    bzr update

    if [ "$nobuild" = "1" ]; then
      echo "Skipping build"
      return
    fi

    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

    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
}


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

cleanup () {
    s3-curl.pl --id=foo --createBucket=$bucket -- $S3_URL/$bucket
    s3-curl.pl --id=foo --put=/tmp/log -- $S3_URL/$bucket/log
}

trap cleanup 0
set -ex

do_build 2>&1 | tee /tmp/log

set +e
trap '' 0

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

if [ "$nohalt" != "1" ]; then
  halt
fi
筆者紹介

VA Linux Systems Japan 高橋浩和・小田逸郎・箕浦真(MAIL
各種OS、仮想化、Linux Kernelおよびオープンソースにおける高度な技術と経験を基盤とした、技術コンサルティング、開発、インテグレーションとソフトウェアソリューションを提供。VA Linuxは、2000年9月に設立され、Linux Kernelや仮想化に関するグローバルレベルの技術力をベースにLinuxおよびオープンソース業界を牽引する中核企業として成長を続けている。

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