EC2でCentOS6のEBS-Backed AMIをゼロから作る
はじめまして。サーバーインフラ担当の原口です。
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の設定を修正しました。
1dracut 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 の作成 (公式)
事前準備
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のインストール
1yum install ruby
続いてec2-ami-toolsのインストール
1cd /usr/local/src
2wget http://s3.amazonaws.com/ec2-downloads/ec2-ami-tools.noarch.rpm
3rpm -ihv ec2-ami-tools.noarch.rpm
EBSを作成してアタッチ
20GBくらいで適当なEBSを作ってインスタンスにアタッチ。この作成した容量はそのままAMIの基本容量となるので、ここまで必要がなければ8GBくらいで作ってOKです。
/dev/sdfとして認識されるとかかれているけど実際は/dev/xvdf として認識されるので注意して下さい。
EBSをフォーマット&マウント
アタッチしたEBSをインスタンス上でフォーマットして適当なところにマウントします。
CentOS6からデフォルトでext4なのでext4でフォーマット
1mkfs.ext4 /dev/xvdf
できたら適当なとこにマウント
1mkdir /data
2mount /dev/xvdf /data
dfでマウントできたか確認を行って下さい。
インストール用のファイルを作成
ここからはアタッチしたボリュームへのCentOSインストールの事前準備となります。
まずはデバイスファイルの作成。
1cd /data
2mkdir etc proc dev
1vi etc/fstab
以下のように作成
1/dev/xvde1 / ext4 defaults 1 1
2none /dev/pts devpts gid=5,mode=620 0 0
3none /dev/shm tmpfs defaults 0 0
4none /proc proc defaults 0 0
5none /sys sysfs defaults 0 0
1mount -t proc none proc
インストール用の yum.conf を作成
今回はrikenさんのmirrorを使用したいと思います。
まずは鍵ファイルを入れておきます。
1cd /data
2wget -O ../RPM-GPG-KEY-CentOS-6 http://ftp.riken.jp/Linux/centos/RPM-GPG-KEY-CentOS-6
repos.confの作成
1vi ../repos.conf
以下のように編集
1[ami-base]
2name=CentOS-6 - Base
3mirrorlist=http://mirrorlist.centos.org/?release=6&arch=x86_64&repo=os
4gpgcheck=1
5gpgkey=file://${PWD}/../RPM-GPG-KEY-CentOS-6
6<h3>released updates</h3>
7[ami-updates]
8name=CentOS-6 - Updates
9mirrorlist=http://mirrorlist.centos.org/?release=6&arch=x86_64&repo=updates
10gpgcheck=1
11gpgkey=file://${PWD}/../RPM-GPG-KEY-CentOS-6
CentOS6のインストール
準備が整ったのでCentOS6のインストールを行います。
ついでにec2-ami-toolsのインストールも行っています。
この作業は時間がかかります。
1cd /data
2setarch x86_64 yum -y -c ../repos.conf --installroot=$PWD --disablerepo=* --enablerepo=ami-base,ami-updates groupinstall Core
3setarch x86_64 yum -y -c ../repos.conf --installroot=$PWD --disablerepo=* --enablerepo=ami-base,ami-updates install kernel
4setarch x86_64 yum -y -c ../repos.conf --installroot=$PWD --disablerepo=* --enablerepo=ami-base,ami-updates install ruby rsync
5rpm -Uvh --root=$PWD http://s3.amazonaws.com/ec2-downloads/ec2-ami-tools.noarch.rpm
6wget -O usr/bin/ec2-metadata http://s3.amazonaws.com/ec2metadata/ec2-metadata
7chmod +x usr/bin/ec2-metadata
grubの設定
grubの設定
以下のようにgrubのmenu.lstを作成します
1cat > boot/grub/menu.lst <<EOS
2default=0
3timeout=0
4hiddenmenu
5title CentOS6.4
6root (hd0)
7kernel /boot/vmlinuz-$(rpm --root=$PWD -q --queryformat "%{version}-%{release}.%{arch}\n" kernel) ro root=/dev/xvde1
8initrd /boot/initramfs-$(rpm --root=$PWD -q --queryformat "%{version}-%{release}.%{arch}\n" kernel).img
9EOS
ネットワーク設定
ネットワーク設定ファイルを作成します。
初回のIP取得はDHCPを使って行われます。
1vi /data/etc/sysconfig/network-scripts/ifcfg-eth0
以下のように編集。
1DEVICE=eth0
2BOOTPROTO=dhcp
3ONBOOT=yes
4TYPE=Ethernet
5USERCTL=yes
6PEERDNS=yes
7IPV6INIT=no
1vi /data/etc/sysconfig/network
以下のように編集。
1NETWORKING=yes
1vi /data/etc/hosts
以下のように編集。
1127.0.0.1 localhost.localdomain localhost
rc.local に ssh 公開鍵を取得する設定を追加
初回起動で公開鍵を設定できなければ、だれもログインできないインスタンスとなる為、必須作業です。
今回のスクリプトでは起動時にec2-ami-toolsの更新も行われるように作成されています。
1vi /data/etc/rc.local
以下の文を追記。
1#Update the Amazon EC2 AMI creation tools
2rpm -Uvh http://s3.amazonaws.com/ec2-downloads/ec2-ami-tools.noarch.rpm
3#Update ec2-metadata
4wget -O /usr/bin/ec2-metadata http://s3.amazonaws.com/ec2metadata/ec2-metadata
5chmod 755 /usr/bin/ec2-metadata
6if [ -f "/root/firstrun" ] ; then
7dd if=/dev/urandom count=50|md5sum|passwd --stdin root
8rm -f /root/firstrun
9else
10echo "* Firstrun *" && touch /root/firstrun
11fi
12if [ ! -d /root/.ssh ] ; then
13mkdir -p /root/.ssh
14chmod 0700 /root/.ssh
15fi
16ATTEMPTS=5
17FAILED=0
18#Fetch public key using HTTP
19while [ ! -f /root/.ssh/authorized_keys ]; do
20curl -f http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key > /tmp/aws-key 2>/dev/null
21if [ $? -eq 0 ]; then
22cat /tmp/aws-key >> /root/.ssh/authorized_keys
23chmod 0600 /root/.ssh/authorized_keys
24rm -f /tmp/aws-key
25echo "Successfully retrieved AWS public key from instance metadata"
26else
27FAILED=$(($FAILED + 1))
28if [ $FAILED -ge $ATTEMPTS ]; then
29echo "Failed to retrieve AWS public key after $FAILED attempts, quitting"
30break
31fi
32echo "Could not retrieve AWS public key (attempt #$FAILED/$ATTEMPTS), retrying in 5 seconds..."
33sleep 5
34fi
35done
各種設定
sshdの設定
1perl -p -i -e 's,^#PermitRootLogin yes,PermitRootLogin without-password,' etc/ssh/sshd_config
2perl -p -i -e 's,^#UseDNS yes,UseDNS no,' etc/ssh/sshd_config
3perl -p -i -e 's,^PasswordAuthentication yes,PasswordAuthentication no,' etc/ssh/sshd_config
SELinuxの設定
1vi /data/etc/sysconfig/selinux
1SELINUX=enforcing
2↓
3SELINUX=disabled
作成したEBSをAMI化する
ここまででCentOSディスク(EBS)の作成は完了です。
ここからはこのEBSイメージをAMI化する作業です。
マウントしているEBSの不要ファイルを削除してアンマウント
1cd /data
2setarch x86_64 yum -y -c ../repos.conf --installroot=$PWD --disablerepo=* --enablerepo=ami-base,ami-updates clean all
3cd ..
4umount /data/proc
5umount /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」を選択します。
出てくるウィンドウで以下の内容を編集します。
1Architecture: x86_64
2Kernel ID: aki-44992845
これでAMIが作成されます。
AMIの確認
AWSの管理画面から登録したAMIの存在を確認できると思います。
このAMIを右クリックしてインスタンスを作成してみましょう。
インスタンスが作成されログインができれば完成です。
今後のAMIの作成
クリーンなCentOS-AMIの作成が完了したら自分ごのみにカスタマイズする事となるでしょう。
その後、AMIを作成したい場合の方法ですが、すごく簡単です。
カスタマイズ済のインスタンスを右クリックで[Create Image (EBS AMI)]というメニューを選ぶ事でAMI登録する事が可能です。
終わり
以上で独自EBS-Backed AMIの作成方法は終了です。
サービスを開始して数年経ちましたが未だに複雑な作業だなぁ・・・と思ってしまいます。
コンソール機能やそこからISOイメージからOSインストールできる機能が今後できるととてもうれしいですね。