オリジナルAMIの作成(CentOS)

16
オリジナルAMIの作成 (CentOS) suz-lab (AWS+)

Transcript of オリジナルAMIの作成(CentOS)

Page 1: オリジナルAMIの作成(CentOS)

オリジナルAMIの作成(CentOS)suz-lab (AWS+)

Page 2: オリジナルAMIの作成(CentOS)

黒いブログ(suz-lab)、書いてます。

Page 3: オリジナルAMIの作成(CentOS)

目次

ext3の空イメージを作成イメージマウントとデバイスファイル作成fstabの作成とprocのマウントyumでCoreグループをインストールネットワークの設定ファイルを作成 再びfstab、に追記起動時にキー取得の仕込みAmazon EC2 AMI Tools のインストール登録用(S3アップロード用)イメージの作成登録用イメージをS3にアップロード AMIとして登録

Page 4: オリジナルAMIの作成(CentOS)

ext3の空イメージを作成

全データがNULL(/dev/zero)のファイル(centos.img)を作成。サイズは count(1024) x bs(1M) = 1G とする。(最小構成)

# dd if=/dev/zero of=centos.img count=1024 bs=1M

上記の空イメージに(-F)、ext3ジャーナルを持った(-j)ファイルシステムを作成。

# mke2fs -F -j centos.img

このイメージファイルがS3にアップロードされるAMIです。

Page 5: オリジナルAMIの作成(CentOS)

イメージマウントとデバイスファイル作成

ループバックデバイス(-o loop)としてイメージをマウント。※ ファイルをブロック型デバイスのように扱う機能

# mkdir fs-centos # mount -o loop centos.img fs-centos

イメージにデバイスファイル(fs-centos/dev)を作成します。でも、ループの意味とか"-x"とか、よくわかりません...

# mkdir fs-centos/dev # for i in console null zero; do # /sbin/MAKEDEV -d fs-centos/dev -x $i; # done

Page 6: オリジナルAMIの作成(CentOS)

fstabの作成とprocのマウント

イメージ中に以下のようにfstabを作成 (AMI起動時、このイメージの内容は/dev/sda1になります) # cat fs-centos/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

procファイルシステムのマウント    # mkdir fs-centos/proc # mount -t proc none fs-centos/proc

Page 7: オリジナルAMIの作成(CentOS)

yumでCoreグループをインストール

Coreグループインストール用のyum設定ファイルを準備。 # cp /etc/yum.conf yum-ami.conf # cat /etc/yum.repos.d/CentOS-Base.repo >> yum-ami.conf

しかし、設定ファイル中の$releaseverが展開されない... [base] name=CentOS-$releasever - Base ...

なので、無理やり置換 & インストール。 # sed -i 's/$releasever/5.4/g' yum-ami.conf # yum -c yum-ami.conf \ # --installroot=/mnt/fs-centos -y groupinstall Core

Page 8: オリジナルAMIの作成(CentOS)

ネットワークの設定ファイルを作成

インスタンス起動時に認識されるeth0に対してDHCPの設定。 # cat fs-centos/etc/sysconfig/network NETWORKING=yes # cat fs-centos/etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 BOOTPROTO=dhcp ONBOOT=yes TYPE=Ethernet USERCTL=yes PEERDNS=yes IPV6INIT=no

Page 9: オリジナルAMIの作成(CentOS)

再びfstab、に追記

インスタンス起動時に割り当てられる、大容量ディスク!?(/dev/sda2)とスワップ領域(/dev/sda3)に関して追記。

# cat fs-centos/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 /dev/sda2 /mnt ext3 defaults 0 0 /dev/sda3 swap swap defaults 0 0

Page 10: オリジナルAMIの作成(CentOS)

起動時にキー取得の仕込み(その1)

fs-centos/etc/rc.localに記述 -------- ここから -------- #!/bin/sh touch /var/lock/subsys/local 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 if [ ! -d /root/.ssh ] ; then mkdir -p /root/.ssh chmod 700 /root/.ssh fi

Page 11: オリジナルAMIの作成(CentOS)

起動時にキー取得の仕込み(その2)

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 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

Page 12: オリジナルAMIの作成(CentOS)

起動時にキー取得の仕込み(その3)

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 -------- ここまで --------

上記処理をすることで、sshにて、事前に登録したキーを使ったrootでのログインが可能になります。

curlを利用しているので、別途インストール(yum)の必要あり。

Coreグループには含まれていない

Page 13: オリジナルAMIの作成(CentOS)

Amazon EC2 AMI Tools のインストール

その前に依存しているrsyncとrubyをインストール # yum install rsync # yum install ruby

RPMの取得 & インストール# curl -OL http://s3.amazonaws.com/ec2-downloads/ec2-ami-tools.noarch.rpm

# rpm -Uvh ec2-ami-tools.noarch.rpm

Page 14: オリジナルAMIの作成(CentOS)

登録用(S3アップロード用)イメージの作成

まず、fs-centosをアンマウント。 # umount fs-centos

作成したイメージファイル(centos.img)を指定してアップロード用のファイルセットを作成。

# ec2-bundle-image -i centos.img \ # -k pk-XXXXXXXX.pem \ # -c cert-XXXXXXX.pem \ # -u 000000000000

-k : 鍵ファイル(Access Identifiers ページ!?から取得可能)-c : 証明書ファイル(Access Identifiers ページ!?から取得可能)-u : Account Number (ハイフンをとったもの)

Page 15: オリジナルAMIの作成(CentOS)

登録用イメージをS3にアップロード

ec2-bundle-imageで以下のファイルの作成を確認。 centos.img.manifest.xml centos.img.part.00 ...

S3のBucket(-b)とmanifest.xml(-m)を指定してアップロード。 # ec2-upload-bundle -b ami.suz-lab.com \ # -m centos.img.manifest.xml \ # -a XXXXXXXX \ # -s XXXXXXXXXXXXXXXX

-a : アクセスキー(文字列) (Access Identifiers ページに)-s : シークレットキー(文字列) (Access Identifiers ページに)

Page 16: オリジナルAMIの作成(CentOS)

AMIとして登録

いろいろ方法があります。コマンドライン(EC2 API Tools)AWS Management Console Elasticfox (Firefoxのアドオン)

"Images"タブにて、"Machine Images"の領域で右クリックし、「Register a new AMI」を選択することで登録できます。

選択時には、下記のようにBucket名からのXMLファイルを指定することになります。ami.suz-lab.com/centos.img.manifest.xml