たろマーク (はてなブックマーク)
-
[ design ][ oss ][ design ]
-
[ css ]
-
新しく作った開発プロセスの問題点が見えたわけだから、それはそれとして改善すればいいのに。プロジェクトに併せてテーラリングされてないのとか。そういうことを自発的にやれる人たちが必要だというのもわかるけど
-
python manage.py runserver
■ Amazon EC2 用に自分で CentOS 5 のイメージを用意する
Amazon EC2 では、Amazon 公式で用意されたイメージの他にいろんなひとがイメージを登録して share してるんですが、やっぱり見ず知らずの人が用意したイメージはあまり使いたくないなぁということで、自分で用意してみたのでその手順です。
EC2 のマニュアルでは、"Using Amazon EC2" -> "Creating and Preparing AMIs" あたりです。(マニュアルは Fedora ベースです)
作業は CentOS5 上で行いました。
追記 (2009-11-05T21:50:56+09:00)
S3 上へのイメージのアップロードとかは、試行錯誤には時間かかります。
nokoya さんの EC2 上で新規 AMI を作るのは良い手段だと思いました。
AMI tools をインストールする
AMI tools は ruby が必要なので、install されていない場合は入れてください。
# yum install ruby
ec2-ami-tools.noarch.rpm をインストールします。
# rpm -i ec2-ami-tools.noarch.rpm
まず空のイメージを作る
# dd if=/dev/zero of=centos5.img bs=1M count=2024
マニュアルだと例示されてるのが 1GB なんですが、CentOS 5 入れてて足りなくなったので 2GB にしました。(やっぱりこころもとなかったので 3GB 作り中。後で CPAN とかインストールしたイメージ作りたいから。ちなみに /mnt に 残りの領域がマウントされるので、/home とかはそっち使えばいいと思う。)
ext3 ファイルシステムを作成する
# mke2fs -F -j centos5.img
マウントする
# mkdir /mnt/ec2-fs # mount -o loop centos5.img /mnt/ec2-fs
イメージ上にディレクトリ作ったりしていろいろ準備
/dev を用意する。
# mkdir /mnt/ec2-fs/dev # for i in console null zero ; do /sbin/MAKEDEV -d /mnt/ec2-fs/dev -x $i; done
/mnt/ec2-fs/etc/fstab を作る。
/dev/sda1 / ext3 defaults 1 1 none /dev/pts devpts gid=5,mode=620 0 0 none /dev/shm tmpfs defaults 0 0 none /proc proc defaults 0 0 none /sys sysfs defaults 0 0
yum-xen.conf をつくる
[main] cachedir=/var/cache/yum debuglevel=2 logfile=/var/log/yum.log exclude=*-debuginfo gpgcheck=0 obsoletes=1 reposdir=/dev/null [base] name=CentOS-5.2 - Base mirrorlist=http://mirrorlist.centos.org/?release=5.2&arch=i386&repo=os enabled=1 [updates-released] name=CentOS-$releasever - Updates mirrorlist=http://mirrorlist.centos.org/?release=5.2&arch=i386&repo=updates enabled=1
proc ディレクトリ作って mount する
# mkdir /mnt/ec2-fs/proc # mount -t proc none /mnt/ec2-fs/proc
yum で 作ったイメージに CentOS 5 をインストールする
yum -c yum-xen.conf --installroot=/mnt/ec2-fs -y groupinstall Core yum -c yum-xen.conf --installroot=/mnt/ec2-fs -y groupinstall Base
/mnt/ec2-fs/etc/sysconfig/network-scripts/ifcfg-eth0 を作る
DEVICE=eth0 BOOTPROTO=dhcp ONBOOT=yes TYPE=Ethernet USERCTL=yes PEERDNS=yes IPV6INIT=no
/mnt/ec2-fs/etc/sysconfig/network を作る
NETWORKING=yes
/mnt/ec2-fs/etc/fstab に追記
EC2 のサービスでは /mnt 以下に今回作ったイメージ以外の領域がマウントされるので、それを追記しておきます。
/dev/sda2 /mnt ext3 defaults 0 0 /dev/sda3 swap swap defaults 0 0
キー受け取り用のスクリプトを仕込んでおく
これをやっておかないと ec2-add-keypair で作った公開鍵が、起動時に受け取れません。このあたり意味がわからなくて少しハマった。
/mnt/ec2-fs/etc/rc.d/rc.local
#!/bin/sh # # This script will be executed *after* all the other init scripts. # You can put your own initialization stuff in here if you don't # want to do the full Sys V style init stuff. touch /var/lock/subsys/local /usr/local/sbin/get-credentials.sh
/usr/local/sbin/get-credentials.sh
このファイルは、実行権限付けておくのも忘れないように!
#!/bin/bash # Retreive the credentials from relevant sources. # Fetch any credentials presented at launch time and add them to # root's public keys PUB_KEY_URI=http://169.254.169.254/1.0/meta-data/public-keys/0/openssh-key PUB_KEY_FROM_HTTP=/tmp/openssh_id.pub PUB_KEY_FROM_EPHEMERAL=/mnt/openssh_id.pub ROOT_AUTHORIZED_KEYS=/root/.ssh/authorized_keys # We need somewhere to put the keys. if [ ! -d /root/.ssh ] ; then mkdir -p /root/.ssh chmod 700 /root/.ssh fi # Fetch credentials... # First try http curl --retry 3 --retry-delay 0 --silent --fail -o $PUB_KEY_FROM_HTTP $PUB_KEY_URI if [ $? -eq 0 -a -e $PUB_KEY_FROM_HTTP ] ; then if ! grep -q -f $PUB_KEY_FROM_HTTP $ROOT_AUTHORIZED_KEYS then cat $PUB_KEY_FROM_HTTP >> $ROOT_AUTHORIZED_KEYS echo "New key added to authrozied keys file from parameters"|logger -t "ec2" fi chmod 600 $ROOT_AUTHORIZED_KEYS rm -f $PUB_KEY_FROM_HTTP elif [ -e $PUB_KEY_FROM_EPHEMERAL ] ; then # Try back to ephemeral store if http failed. # NOTE: This usage is deprecated and will be removed in the future if ! grep -q -f $PUB_KEY_FROM_EPHEMERAL $ROOT_AUTHORIZED_KEYS then cat $PUB_KEY_FROM_EPHEMERAL >> $ROOT_AUTHORIZED_KEYS echo "New key added to authrozied keys file from ephemeral store"|logger -t "ec2" fi chmod 600 $ROOT_AUTHORIZED_KEYS chmod 600 $PUB_KEY_FROM_EPHEMERAL fi if [ -e /mnt/openssh_id.pub ] ; then if ! grep -q -f /mnt/openssh_id.pub /root/.ssh/authorized_keys then cat /mnt/openssh_id.pub >> /root/.ssh/authorized_keys echo "New key added to authrozied keys file from ephemeral store"|logger -t "ec2" fi chmod 600 /root/.ssh/authorized_keys fi
unmount する
# umount /mnt/ec2-fs/proc # umount -d /mnt/ec2-fs
登録用イメージ作成
aws user は、aws.amazon.com にログインしてアカウント情報見たときの右上に表示されてるやつ。ハイフンはいらない。
# ec2-bundle-image -i centos5.img -k <secret key file> -c <cert file> -u <aws user>
アップロード
S3 の backets は、無い名前を作ってくれます。S3 全体でユニークな名前にする必要があります。
# ec2-upload-bundle -b <s3 backets> -m /tmp/centos5.img.manifest.xml -a <access id> -s <secret key>
登録
ここから先は ec2 コマンド群をインストール済みの mac で作業を行いました。
$ ec2-register <s3 backets>/centos5.img.manifest.xml
自分のイメージ確認
$ ec2-describe-images -o self
秘密鍵生成
$ ec2-add-keypair vkgtest | sed -e "1d" > vkgtest.id $ chmod 400 vkgtest.id
このコマンドで、公開鍵が AWS 側に登録される。
秘密鍵は他の ssh 秘密鍵と同様に保管します。
ec2-describe-keypair で登録した鍵の一覧が見られます。
インスタンス起動
$ ec2-run-instances <image id> -k vkgtest
image id は ami で始まる文字列です。
-k オプションには使用する鍵名を渡します。
すると起動時に指定された公開鍵をセットして起動してくれます。
Firewall の port 22 を開ける
$ ec2-authorize default -p 22
これで 22 番が開きます。
もう少し細かく接続もととか指定できるみたいだけどマニュアル参照で。
ちなみに ec2-describe-group で設定した内容が見えて、ec2-revoke で削除できます。
default ってのは iptables のチェーンみたいなものかなぁ。
インスタンス状態確認
$ ec2-describe-instances
正常に起動できていたら、ec2-xxx-xxx-xxx-xxx.compute-1.amazonaws.com のようなサブドメインが割り当てられていると思います。
こんな感じでログインできます。
$ ssh -i .ssh/vkgtest.id [email protected]
起動できていてログイン出来なかったら、/usr/local/sbin/get-credentials.sh のセットアップに失敗しているかも。
インスタンスシャットダウン
$ ec2-terminate-instances <instance id>