[僕] Amazon EC2 用に自分で CentOS 5 のイメージを用意する

僕ト云フ事

たろマークはてなブックマーク

2008年11月10日

[amazon][aws][ec2] 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 root@ec2-xxx-xxx-xxx-xxx.compute-1.amazonaws.com

起動できていてログイン出来なかったら、/usr/local/sbin/get-credentials.sh のセットアップに失敗しているかも。

インスタンスシャットダウン

$ ec2-terminate-instances <instance id>

参考にさせていただきました

blog comments powered by Disqus