AWS / EC2 が仕事で必要になったので先人の知恵を借りつつ作ってみた。

以下は例。

0)事前準備
EC2上にAmazon Linux や PublicなAMIからCentOSの環境を1台起動しておく。
#多分Linuxなら何でも良いんだろうけどCent系のが良いかも。

1)器を作る
EBSボリューム作成
事前に作っておいたインスタンスにアタッチ

2)ファイルシステム作成
事前に作っておいたインスタンス上でアタッチしたボリュームに以下を実施。
sudo ls /dev/xvdf
sudo mkfs.ext4 /dev/xvdf

3)マウントとデバイスファイルを作成
EBSボリューム(/dev/xvdf)をマウントしてデバイスファイルを作成 ※/dev/sdfでマウントすると/dev/xvdfになる点に注意。
sudo mkdir /mnt/ami
sudo mount -t ext4 /dev/xvdf /mnt/ami
sudo yum install MAKEDEV
sudo /sbin/MAKEDEV -d /mnt/ami/dev -x console
sudo /sbin/MAKEDEV -d /mnt/ami/dev -x null
sudo /sbin/MAKEDEV -d /mnt/ami/dev -x zero
ls -al
合計 0
crw------- 1 root root 5, 1 6月 18 08:14 2012 console
crw-rw-rw- 1 root root 1, 3 6月 18 08:14 2012 null
crw-rw-rw- 1 root root 5, 0 6月 18 08:14 2012 tty
crw-rw-rw- 1 root root 1, 5 6月 18 08:14 2012 zero

4)/etc/fstab作成とprocファイルシステムマウント
sudo mkdir /mnt/ami/etc
sudo vim /mnt/ami/etc/fstab
---※自分の環境では「/dev/xvde1」にする必要があった。ここハマリポイント。
/dev/xvde1 / ext4 defaults 1 1
none /proc proc defaults 0 0
none /sys sysfs defaults 0 0
none /dev/pts devpts gid=5,mode=620 0 0
none /dev/shm tmpfs defaults 0 0
---

sudo mkdir /mnt/ami/proc
sudo mount -t proc none /mnt/ami/proc

5)yumでCentOS 6.2のパッケージ(Core)とカーネルをインストール
sudo mv /etc/yum.repos.d /etc/yum.repos.d.bak
sudo yum clean all

sudo vim /mnt/yum.conf
---以下のようにする
[base]
name=CentOS-6 - Base
baseurl=http://mirror.centos.org/centos/6/os/x86_64/
[updates]
name=CentOS-6 - Updates
baseurl=http://mirror.centos.org/centos/6/updates/x86_64/
---

sudo yum -c /mnt/yum.conf --installroot=/mnt/ami -y groupinstall Core
sudo cp /mnt/ami/etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 /etc/pki/rpm-gpg
sudo yum --installroot=/mnt/ami/ -y install kernel

sudo mv /etc/yum.repos.d.bak /etc/yum.repos.d

6)User Provided Kernelの設定(/boot/grub/menu.lst)
sudo vim /mnt/ami/boot/grub/menu.lst
---※各バージョン/ファイル名は/mnt/ami/boot配下を確認のこと
default=0
timeout=0
hiddenmenu
title Sumzap CentOS 6.2
root (hd0)
kernel /boot/vmlinuz-2.6.32-220.17.1.el6.x86_64 ro root=/dev/xvde1
initrd /boot/initramfs-2.6.32-220.17.1.el6.x86_64.img
---※ここでも「/dev/xvde1」とすること。これもハマりポイント。

7)各種OS設定ファイル編集
sudo vim /mnt/ami/etc/sysconfig/network
---
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=aws-cent62-template
---

sudo vim /mnt/ami/etc/sysconfig/network-scripts/ifcfg-eth0
---※DHCPにしておく
DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=on
---

sudo vim /mnt/ami/etc/hosts
---
127.0.0.1 aws-cent62-template localhost localhost.localdomain
---

sudo vim /mnt/ami/etc/sysconfig/selinux
---※SELINUXは無効
###SELINUX=enforcing
SELINUX=disabled
---

SSHの設定。起動時にAWSから公開鍵を取得し、事前に自分のアカウントで作成した秘密鍵でログインできるようにする。

sudo mkdir /mnt/ami/root/.ssh
sudo chmod 700 /mnt/ami/root/.ssh
sudo touch /mnt/ami/root/.ssh/authorized_keys
sudo chmod 600 /mnt/ami/root/.ssh/authorized_keys
sudo vim /mnt/ami/etc/ssh/sshd_config
---
PermitRootLogin without-password
UseDNS no
---

sudo vim /mnt/ami/etc/rc.local
---※以下を追記

# for AWS
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
ROOT_AUTHORIZED_KEYS=/root/.ssh/authorized_keys
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 "aws"
dd if=/dev/urandom count=50 | md5sum | passwd --stdin root
echo "The root password randomized" | logger -t "aws"
fi
chmod 600 $ROOT_AUTHORIZED_KEYS
rm -f $PUB_KEY_FROM_HTTP
fi
---

※試しにcurl http://169.254.169.254/1.0/meta-data/public-keys/0/openssh-key とするとわかると思う。

8)アンマウントとスナップショットの取得
sudo umount /mnt/ami/proc
sudo umount /mnt/ami
EBSボリュームのデタッチ
スナップショット取得

9)AMIの作成
作成したスナップショットからAMIを作成する

Name: イメージ名(ami-xxx)
Architecture: x86_64
Kernel ID: aki-44992845 ※大事
RAM Disk ID: Use Default
Root Device Name: /dev/sda1 ※大事

10)AMIからインスタンス作成
↓あたりをしっかり指定しておくと良さそう。
Kernel ID: aki-44992845 ※大事
RAM Disk ID: Use Default
Root Device Name: /dev/sda1 ※大事


自分の環境ではこれで問題なく起動しました。

かなり試行錯誤しながらだったので参考になればと思います。