17 October 2009

Amazon EC2:新しい仮想マシンイメージ(AMI)を作る。CentOS編

新しい仮想マシンイメージ(AMI)の作成は、ローカル環境(手元のパソコン)またはEC2の仮想マシン内のどちらでも行うことが出来る。今回は、作成したAMIをAmazon S3にアップロードする時の転送速度が速く、課金対象とならない『EC2の仮想マシン内で』行った。

■ EC2内でのAMI作成環境の起動

AmazonがリリースしたFedora 8の次に示すイメージを使う。
『 ec2-public-images/fedora-8-i386-base-v1.10.manifest.xml 』

■ Amazon Web Services アクセス用鍵ファイルの作成とダウンロード

過去の記事 『 Amazon EC2:稼動中のOSイメージをS3にバックアップする 』 のとおり行い、アクセス用の秘密鍵と証明書を得る。

ローカル環境に鍵ファイルを得た場合は、SCP(Linuxの場合)やWinSCP(Windowsの場合)などを用いて、EC2の仮想マシンに転送しておく。

鍵ファイルの転送先は、/root/.ssh/ ディレクトリとした。

■ Amazon EC2 API Toolsのダウンロードとセットアップ

Javaランタイム ライブラリをインストールする。

過去の記事 『 (Linux) Fedora 8 に Sun の Javaをインストール 』 の通り行う。

ローカル環境(手元のパソコン)にAmazon EC2 API Toolsをインストールする。

公式ガイド Amazon Elastic Compute Cloud Getting Started Guide の、『 Getting Started with the Command Line Tools 』 に、ソフトウエアのダウンロード先や、セットアップ方法が書かれている。 かいつまんで書くと…

Developer Tools : Amazon EC2 API Tools から ec2-api-tools.zip をダウンロードする。

圧縮ファイルを適当なフォルダに解凍する。

[root@domU ~]$ cd /usr/lib [root@domU lib]$ unzip ec2-api-tools.zip [root@domU lib]$ rm ec2-api-tools.zip [root@domU lib]$ mv ec2-api-tools-1.3-42584/ ec2_tool

環境変数の設定

Linuxの場合、次のように環境変数を設定する。このようなスクリプトを作成しておくと便利。

export EC2_HOME=/usr/lib/ec2_tool export EC2_PRIVATE_KEY=$EC2_HOME/key/pk-BXCXZX5XLMCN4VL7CX5SDXSXQX3XRX2U.pem export EC2_CERT=$EC2_HOME/key/cert-BXCXZX5XLMCN4VL7CX5SDXSXQX3XRX2U.pem export JAVA_HOME=/usr/java/jre1.6.0_12 export PATH=$PATH:$EC2_HOME/bin

実行する場合は、次のように source コマンドを用いて実行する。

[root@domU ~]$ source /usr/lib/ec2_tool/envset.sh

■ Amazon EC2 AMI Toolsのインストール

ローカルマシンにJDKとrubyが必要となるので、あらかじめインストールしておく。

[root@domU ~]# yum install ruby

Amazon EC2 AMI Toolsをダウンロードし、インストールする。

[root@domU ~]# wget http://s3.amazonaws.com/ec2-downloads/ec2-ami-tools.noarch.rpm [root@domU ~]# rpm -ivh ec2-ami-tools.noarch.rpm 警告: ec2-ami-tools.noarch.rpm: ヘッダ V3 RSA/SHA1 signature: NOKEY, key ID c375432d 準備中... ########################################### [100%] 1:ec2-ami-tools ########################################### [100%]

■ 仮想ディスクファイルを作成し、フォーマットする

ここから先は、公式ガイド Amazon Elastic Compute Cloud Developer Guide の、『 Using Amazon EC2 -> Creating and Preparing AMIs -> Creating an AMI 』 に詳細に説明されている。

今回は4ギガバイトのディスク容量を確保する。(Amazon EC2の/dev/sda1の割り当てサイズが10ギガバイトのため、最大でも10ギガバイトしか許容されないはず)

[root@domU ~]# mkdir ./centos53 [root@domU ~]# cd ./centos53 [root@domU centos53]# dd if=/dev/zero of=centos.img bs=1M count=4096 [root@domU centos53]# mke2fs -F -j ./centos.img

■ OSをインストールする下準備

作成した仮想ディスクをマウントし、公式ガイドに示された下準備を行う。

[root@domU centos53]# mkdir /mnt/ec2-fs [root@domU centos53]# mount -o loop ./centos.img /mnt/ec2-fs [root@domU centos53]# mkdir /mnt/ec2-fs/proc [root@domU centos53]# mount -t proc none /mnt/ec2-fs/proc

fstabファイルを作成する。

[root@domU centos53]# mkdir /mnt/ec2-fs/etc [root@domU centos53]# vi /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

または、実行中の仮想マシン(Fedora8)のものをコピーして編集するのが手っ取り早い。

[root@domU centos53]# cp /etc/fstab /mnt/ec2-fs/etc/

デバイスファイルを作る

[root@domU centos53]# mkdir /mnt/ec2-fs/etc [root@domU centos53]# /sbin/MAKEDEV -d /mnt/ec2-fs/dev -x console [root@domU centos53]# /sbin/MAKEDEV -d /mnt/ec2-fs/dev -x null [root@domU centos53]# /sbin/MAKEDEV -d /mnt/ec2-fs/dev -x zero

仮想ディスクにCentOSをインストールするための、yumの設定ファイルを作成する

[root@domU centos53]# vi ./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.3 - Base mirrorlist=http://mirrorlist.centos.org/?release=5.3&arch=i386&repo=os enabled=1 [updates-released] name=CentOS 5.3 - Released Updates mirrorlist=http://mirrorlist.centos.org/?release=5.3&arch=i386&repo=updates

■ CentOSのインストール

Coreグループと、Baseグループをインストールします。Baseグループも不必要という場合は、それを省いても、必要な個々のパッケージをインストールしていけば問題ないんじゃないでしょうか。

[root@domU centos53]# yum -c ./yum-xen.conf --installroot=/mnt/ec2-fs -y groupinstall Core 〜yumのインストール画面がひたすら流れ去ります〜 [root@domU centos53]# yum -c ./yum-xen.conf --installroot=/mnt/ec2-fs -y groupinstall Base 〜yumのインストール画面がひたすら流れ去ります〜

■ さらに仮想ディスク内の設定ファイルを編集していく

ネットワークインターフェースの設定。これも実行中の仮想マシン(Fedora8)のものを丸ごとコピーするほうが手っ取り早い。編集作成する場合は次の通り。

[root@domU centos53]# vi /mnt/ec2-fs/etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 BOOTPROTO=dhcp ONBOOT=yes TYPE=Ethernet USERCTL=yes PEERDNS=yes IPV6INIT=no [root@domU centos53]# vi /mnt/ec2-fs/etc/sysconfig/network NETWORKING=yes

/etc/fstab に、マウント設定を追加する。これも実行中の仮想マシン(Fedora8)のものをコピーするのが手っ取り早い。編集作成する場合は次の通り。

[root@domU centos53]# vi /mnt/ec2-fs/etc/fstab /dev/sda1 / ext3 defaults 1 1 /dev/sda2 /mnt ext3 defaults 0 0 /dev/sda3 swap swap defaults 0 0 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

SELinuxを利用しないなら、次のように無効化しておく。(enabledとなっているのを、disabledに変更)

/mnt/ec2-fs/etc/sysconfig/selinux
SELINUX=disabled

不必要そうなサービスを、ここで無効化しておく。稼動中の仮想マシン(Fedora8)での初期設定を参考に必要・不必要を仕分けすることもできる。

[root@domU centos53]# chroot /mnt/ec2-fs /bin/sh sh-3.2# chkconfig --list NetworkManager 0:off 1:off 2:off 3:off 4:off 5:off 6:off 〜サービスの一覧が表示される〜 yum-updatesd 0:off 1:off 2:on 3:on 4:on 5:on 6:off sh-3.2# chkconfig acpid off sh-3.2# chkconfig apmd off sh-3.2# chkconfig autofs off sh-3.2# chkconfig avahi-daemon off sh-3.2# chkconfig bluetooth off sh-3.2# chkconfig cpuspeed off sh-3.2# chkconfig cups off sh-3.2# chkconfig gpm off sh-3.2# chkconfig hidd off sh-3.2# chkconfig irqbalance off sh-3.2# chkconfig lvm2-monitor off sh-3.2# chkconfig mcstrans off sh-3.2# chkconfig mdmonitor off sh-3.2# chkconfig netfs off sh-3.2# chkconfig nfslock off sh-3.2# chkconfig pcscd off sh-3.2# chkconfig portmap off sh-3.2# chkconfig readahead_early off sh-3.2# chkconfig readahead_later off sh-3.2# chkconfig restorecond off sh-3.2# chkconfig rpcidmapd off sh-3.2# chkconfig rpcgssd off sh-3.2# chkconfig smartd off sh-3.2# chkconfig yum-updatesd off sh-3.2# chkconfig iptables off ← SSHがはじかれる懸念があるため sh-3.2# chkconfig ip6tables off ← SSHがはじかれる懸念があるため sh-3.2# exit

iptablesは仮想マシン起動後に、iptablesルールを適切に設定して、サービスを再有効化すること!

■ SSH接続用鍵の受渡し自動化スクリプトを作成

公式ガイドに掲載されていないが、公式サポート掲示板でこのスクリプトが実行されていないと、SSH用の鍵の受渡しがされないとなっている。

これも実行中の仮想マシン(Fedora8)からコピーするのが手っ取り早く安全。編集入力する場合は、次のように行う。

[root@domU centos53]# vi /mnt/ec2-fs/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 [root@domU centos53]# chmod +x /mnt/ec2-fs/usr/local/sbin/get-credentials.sh [root@domU centos53]# vi /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 # Get your chosen keypair credentials /usr/local/sbin/get-credentials.sh

■ SSHDの設定ファイルを書き換える

標準のままでは、rootのアクセスや、鍵ファイルによる認証が行われない(可能性がある)。書き換え後のファイルの要点は次のようになる。これも、実行中の仮想マシン(Fedora8)を参考にしながら行うが、ファイルを丸ごとコピーしないこと。

/mnt/ec2-fs/etc/ssh/sshd_config
#LoginGraceTime 2m PermitRootLogin without-password StrictModes yes #MaxAuthTries 6 RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys # For this to work you will also need host keys in /etc/ssh/ssh_known_hosts RhostsRSAAuthentication no # similar for protocol version 2 HostbasedAuthentication no # To disable tunneled clear text passwords, change to no here! PasswordAuthentication no PermitEmptyPasswords no #PasswordAuthentication yes # Change to no to disable s/key passwords #ChallengeResponseAuthentication yes ChallengeResponseAuthentication no X11Forwarding yes #X11DisplayOffset 10 #X11UseLocalhost yes #PrintMotd yes #PrintLastLog yes TCPKeepAlive yes #UseLogin no UsePrivilegeSeparation yes #PermitUserEnvironment no #Compression delayed #ClientAliveInterval 0 #ClientAliveCountMax 3 ShowPatchLevel no UseDNS no # override default of no subsystems Subsystem sftp /usr/libexec/openssh/sftp-server AllowUsers root

■ 仮想ディスクをアンマウント

仮想ディスク内の設定ファイルの編集はここまでで終了したので、仮想ディスクをアンマウントする。

[root@domU centos53]# umount /mnt/ec2-fs/proc [root@domU centos53]# umount /mnt/ec2-fs

■ ディスクイメージをEC2用イメージに変換

公式ガイド Amazon Elastic Compute Cloud Getting Started Guide の、Getting Started with the Command Line Tools -> Running an Instance -> Linux and UNIX -> Bundling an AMI の通りに行う。

[root@domU centos53]# ec2-bundle-image -i ./centos.img --privatekey /mnt/pk-BXCXZX5XLMCN4VL7CX5SDXSXQX3XRX2U.pem --cert /mnt/cert-BXCXZX5XLMCN4VL7CX5SDXSXQX3XRX2U.pem --user 1234-5678-3210 -r i386 -d /mnt/centos53 -p centos53

■ イメージファイルを Amazon S3にアップロードする

過去の記事 『 Amazon EC2:稼動中のOSイメージをS3にバックアップする 』 に既に書いたとおりの方法で行う。

[root@domU centos53]# ec2-upload-bundle --bucket amicentos53 --manifest /mnt/centos53.manifest.xml --access-key 0123X456X789X321X2 --secret-key sywHyjesGTWxwuUKSYjcguwkbswkSSWk

■ Amazon S3のイメージファイル(AMI)をEC2に登録する

[root@domU centos53]# ec2-register amicentos53/centos53.manifest.xml

登録後、手元のマシンのブラウザでAWS Management Consoleを表示すると、次のように登録されているはず。

20091017-makeami-regist.png


■ Amazonのクラウド サービスに関する他の記事

Amazon EC2:稼動中のOSイメージをS3にバックアップする
Amazon EC2を使ってWikipediaをEPWINGデータに変換
Amazon EC2:1分で構築するWebサーバ
LinuxサーバからAmazon S3を用いる (2/2)
(Perl) LinuxサーバからAmazon S3を用いる (1/2)


■ 参考にしたホームページ

・公式ガイド Amazon Elastic Compute Cloud Getting Started Guide
・公式ガイド Amazon Elastic Compute Cloud Developer Guide

Amazon EC2用Centos5イメージを作って、EC2上で動作させてみる
Amazon EC2 用に自分で CentOS 5 のイメージを用意する