はじめまして。サーバーインフラ担当の原口です。
64bitの完全クリーンなCentOS環境のEBS-Backed AMIを作成する手順です。
Amazon公式のAMIを使えよ!って話なんですがOSって基本なのでシーズでは完全にゼロからクリーンインストールを行ったCentOSを用意して使用しています。今回はその手順を公開したいと思います。
※2013/06/10 作成したEBSをAMI化する を編集しました
※2013/06/13 CentOSのいつからかのバージョン(kernel)からfstabにてLABELでの指定を行っていると以下のようなエラーが出た後にKernel Panicとなるようになっていたので、fstabとgrubの設定を修正しました。
dracut Warning: No root device "block:/dev/disk/by-label/_\x2f" found
この手順作成にあたり、以下のブログやサイトを参考にしました。
[Amazon EC2] AMI をゼロから作る CentOS 6.2 / S3-Backed 版
SUZ-LAB謹製 CentOS AMI 6.0.0″の作り方
Amazon EBS-Backed AMI の作成 (公式)
Amazon loopback S3-Backed の作成 (公式)
Sharing AMIs Safely
事前準備
https://portal.aws.amazon.com/gp/aws/securityCredentials
・X.509証明書
→AWSに登録したら新規作成が必要。作成した証明書や秘密鍵は大切に保存。
基本的に何個も作る必要はなくて1個あればOKです。
作成したOSイメージをAMIとして登録するのに必要です。
適当なPublic AMIでインスタンス作成
RightScaleのCentOSでインスタンス作成します。
AMI: RightImage_CentOS_6.3_x64_v5.8.8 (ami-7c9e237d)
Amazon EC2 AMI Tools のインストール
起動したインスタンスへログインしてAmazon EC2 AMI Toolsをインストールします。
rubyが必要なのでまずはrubyのインストール
yum install ruby
続いてec2-ami-toolsのインストール
cd /usr/local/src
wget http://s3.amazonaws.com/ec2-downloads/ec2-ami-tools.noarch.rpm
rpm -ihv ec2-ami-tools.noarch.rpm
EBSを作成してアタッチ
20GBくらいで適当なEBSを作ってインスタンスにアタッチ。この作成した容量はそのままAMIの基本容量となるので、ここまで必要がなければ8GBくらいで作ってOKです。
/dev/sdfとして認識されるとかかれているけど実際は/dev/xvdf として認識されるので注意して下さい。
EBSをフォーマット&マウント
アタッチしたEBSをインスタンス上でフォーマットして適当なところにマウントします。
CentOS6からデフォルトでext4なのでext4でフォーマット
mkfs.ext4 /dev/xvdf
できたら適当なとこにマウント
mkdir /data
mount /dev/xvdf /data
dfでマウントできたか確認を行って下さい。
インストール用のファイルを作成
ここからはアタッチしたボリュームへのCentOSインストールの事前準備となります。
まずはデバイスファイルの作成。
cd /data
mkdir etc proc dev
vi etc/fstab
以下のように作成
/dev/xvde1 / ext4 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
mount -t proc none proc
インストール用の yum.conf を作成
今回はrikenさんのmirrorを使用したいと思います。
まずは鍵ファイルを入れておきます。
cd /data
wget -O ../RPM-GPG-KEY-CentOS-6 http://ftp.riken.jp/Linux/centos/RPM-GPG-KEY-CentOS-6
repos.confの作成
vi ../repos.conf
以下のように編集
[ami-base]
name=CentOS-6 - Base
mirrorlist=http://mirrorlist.centos.org/?release=6&arch=x86_64&repo=os
gpgcheck=1
gpgkey=file://${PWD}/../RPM-GPG-KEY-CentOS-6
<h3>released updates</h3>
[ami-updates]
name=CentOS-6 - Updates
mirrorlist=http://mirrorlist.centos.org/?release=6&arch=x86_64&repo=updates
gpgcheck=1
gpgkey=file://${PWD}/../RPM-GPG-KEY-CentOS-6
CentOS6のインストール
準備が整ったのでCentOS6のインストールを行います。
ついでにec2-ami-toolsのインストールも行っています。
この作業は時間がかかります。
cd /data
setarch x86_64 yum -y -c ../repos.conf --installroot=$PWD --disablerepo=* --enablerepo=ami-base,ami-updates groupinstall Core
setarch x86_64 yum -y -c ../repos.conf --installroot=$PWD --disablerepo=* --enablerepo=ami-base,ami-updates install kernel
setarch x86_64 yum -y -c ../repos.conf --installroot=$PWD --disablerepo=* --enablerepo=ami-base,ami-updates install ruby rsync
rpm -Uvh --root=$PWD http://s3.amazonaws.com/ec2-downloads/ec2-ami-tools.noarch.rpm
wget -O usr/bin/ec2-metadata http://s3.amazonaws.com/ec2metadata/ec2-metadata
chmod +x usr/bin/ec2-metadata
grubの設定
grubの設定
以下のようにgrubのmenu.lstを作成します
cat > boot/grub/menu.lst <<EOS
default=0
timeout=0
hiddenmenu
title CentOS6.4
root (hd0)
kernel /boot/vmlinuz-$(rpm --root=$PWD -q --queryformat "%{version}-%{release}.%{arch}\n" kernel) ro root=/dev/xvde1
initrd /boot/initramfs-$(rpm --root=$PWD -q --queryformat "%{version}-%{release}.%{arch}\n" kernel).img
EOS
ネットワーク設定
ネットワーク設定ファイルを作成します。
初回のIP取得はDHCPを使って行われます。
vi /data/etc/sysconfig/network-scripts/ifcfg-eth0
以下のように編集。
DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes
TYPE=Ethernet
USERCTL=yes
PEERDNS=yes
IPV6INIT=no
vi /data/etc/sysconfig/network
以下のように編集。
NETWORKING=yes
vi /data/etc/hosts
以下のように編集。
127.0.0.1 localhost.localdomain localhost
rc.local に ssh 公開鍵を取得する設定を追加
初回起動で公開鍵を設定できなければ、だれもログインできないインスタンスとなる為、必須作業です。
今回のスクリプトでは起動時にec2-ami-toolsの更新も行われるように作成されています。
vi /data/etc/rc.local
以下の文を追記。
#Update the Amazon EC2 AMI creation tools
rpm -Uvh http://s3.amazonaws.com/ec2-downloads/ec2-ami-tools.noarch.rpm
#Update ec2-metadata
wget -O /usr/bin/ec2-metadata http://s3.amazonaws.com/ec2metadata/ec2-metadata
chmod 755 /usr/bin/ec2-metadata
if [ -f "/root/firstrun" ] ; then
dd if=/dev/urandom count=50|md5sum|passwd --stdin root
rm -f /root/firstrun
else
echo "* Firstrun *" && touch /root/firstrun
fi
if [ ! -d /root/.ssh ] ; then
mkdir -p /root/.ssh
chmod 0700 /root/.ssh
fi
ATTEMPTS=5
FAILED=0
#Fetch public key using HTTP
while [ ! -f /root/.ssh/authorized_keys ]; do
curl -f http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key > /tmp/aws-key 2>/dev/null
if [ $? -eq 0 ]; then
cat /tmp/aws-key >> /root/.ssh/authorized_keys
chmod 0600 /root/.ssh/authorized_keys
rm -f /tmp/aws-key
echo "Successfully retrieved AWS public key from instance metadata"
else
FAILED=$(($FAILED + 1))
if [ $FAILED -ge $ATTEMPTS ]; then
echo "Failed to retrieve AWS public key after $FAILED attempts, quitting"
break
fi
echo "Could not retrieve AWS public key (attempt #$FAILED/$ATTEMPTS), retrying in 5 seconds..."
sleep 5
fi
done
各種設定
sshdの設定
perl -p -i -e 's,^#PermitRootLogin yes,PermitRootLogin without-password,' etc/ssh/sshd_config
perl -p -i -e 's,^#UseDNS yes,UseDNS no,' etc/ssh/sshd_config
perl -p -i -e 's,^PasswordAuthentication yes,PasswordAuthentication no,' etc/ssh/sshd_config
SELinuxの設定
vi /data/etc/sysconfig/selinux
SELINUX=enforcing
↓
SELINUX=disabled
作成したEBSをAMI化する
ここまででCentOSディスク(EBS)の作成は完了です。
ここからはこのEBSイメージをAMI化する作業です。
マウントしているEBSの不要ファイルを削除してアンマウント
cd /data
setarch x86_64 yum -y -c ../repos.conf --installroot=$PWD --disablerepo=* --enablerepo=ami-base,ami-updates clean all
cd ..
umount /data/proc
umount /data
アンマウントが完了したらAWSの管理画面より、このEBSのスナップショットを作成します。
EBSを選択し「Create SnapShot」を選択します。

スナップショット作成が完了したらいよいよAMIの登録作業です。
登録にはX.509証明書が必要です。
事前準備にて用意した[X.509の鍵] と [X.509の証明書]をインスタンスの任意の場所に保存します。
その後、以下のコマンドにてAMI登録を行います。
ec2-register -K [X.509の鍵] -C [X.509の証明書] –region [リージョン] -a [アーキテクチャ] -d [概要] -n [名前] -s [スナップショット名]
例えば、今回は東京リージョンで64bit版なので以下のようなコマンドとなります。
ec2-register -K pk-xxxxxxxxxxxxxxxxxxx.pem -C cert-xxxxxxxxxxxxxxxxx.pem –region ap-northeast-1 -a x86_64 -d “centos6 clean install ami 2012/xx/xx” -n centos6_clean_2012 -s snap-xxxxx
※2013/06/10 編集 (以下の方法の方が簡単なので編集しました)
スナップショット一覧から作成したスナップショットを選択し、右クリックメニューから
「Create Image from EBS Snapshot」を選択します。

出てくるウィンドウで以下の内容を編集します。
Architecture: x86_64
Kernel ID: aki-44992845

これでAMIが作成されます。
AMIの確認
AWSの管理画面から登録したAMIの存在を確認できると思います。
このAMIを右クリックしてインスタンスを作成してみましょう。
インスタンスが作成されログインができれば完成です。
今後のAMIの作成
クリーンなCentOS-AMIの作成が完了したら自分ごのみにカスタマイズする事となるでしょう。
その後、AMIを作成したい場合の方法ですが、すごく簡単です。
カスタマイズ済のインスタンスを右クリックで[Create Image (EBS AMI)]というメニューを選ぶ事でAMI登録する事が可能です。

終わり
以上で独自EBS-Backed AMIの作成方法は終了です。
サービスを開始して数年経ちましたが未だに複雑な作業だなぁ・・・と思ってしまいます。
コンソール機能やそこからISOイメージからOSインストールできる機能が今後できるととてもうれしいですね。