SEEDS Creator's Blog

読者です 読者をやめる 読者になる 読者になる

EC2でCentOS6のEBS-Backed AMIをゼロから作る

AWS EC2 インフラ クラウド

はじめまして。サーバーインフラ担当の原口です。

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&amp;arch=x86_64&amp;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 &gt; boot/grub/menu.lst &lt;&lt;EOS
default=0
timeout=0
hiddenmenu
title CentOS6.4
        root (hd0)
        kernel /boot/vmlinuz-$(rpm --root=$PWD -q --queryformat &quot;%{version}-%{release}.%{arch}\n&quot; kernel) ro root=/dev/xvde1
        initrd /boot/initramfs-$(rpm --root=$PWD -q --queryformat &quot;%{version}-%{release}.%{arch}\n&quot; 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 *" &amp;&amp; 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 &gt; /tmp/aws-key 2&gt;/dev/null
if [ $? -eq 0 ]; then
cat /tmp/aws-key &gt;&gt; /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インストールできる機能が今後できるととてもうれしいですね。