*CloudBB(http://cloudbb.jp)』アマゾンクラウド技術情報発信サイト

 

Convert instance-store AMI into an EBS-booted AMI

 

概要

 インスタンスストアタイプのAMIEBSタイプのAMI変換変更する。

 

 

前提

 該当のEC2インスタンスにEC2 API及びec2-metadataがインストールされていること。ここで設定は必須ではないが該当のEC2インスタンスの中ですべての処理が完了できるメリットがある。る。

 

EC2 APIインストール

 

 インストール手順は割愛させていただく。手順についてはAmazon Cloudテクニカルガイド―EC2/S3からVPCまで徹底解析、インプレスジャパン』で詳しく説明している。また、以降の作業必須でもない(簡便になるだけである)。

 

ec2-metadataインストール

 

 EC2インスタンスの中にEC2APIec2-metadataがインストールされているとする。ec2-metadataは、EC2インスタンスの中で実行し、各種構成情報取得できる。

 

  

ec2-metadata APIの取得は次のように行う。

 

[root@domU-12-31-38-00-9E-46 ~]# wget http://s3.amazonaws.com/ec2metadata/ec2-metadata

 

 ダウンロードしたec2-metadataを確認してパーミションを変更する。

 

# ls -l

-rw-r--r-- 1 root root 10912 Oct 30  2008 ec2-metadata

#  chmod 7555 ec2-metadata

# ls -l

-rwxr-xr-x 1 root root 10912 Oct 30  2008 ec2-metadata

 

/usr/bin/ec2-metadataのように格納する。

 

root@domU-12-31-38-00-9E-46 ~]# mv ec2-metadata /usr/bin/

 

 

 

 

 タスクとしているAMIは、LAMP Web Starter (AMI Id: ami-2cb05345)である。

 

 

/etc/fstabの編集

 

 /etc/fstabをバックアップする。

# cp /etc/fstab /etc/fstab.bak

# cat /etc/fstab

/dev/sda1               /                       ext3    defaults 1 1

/dev/sda2               /mnt                    ext3    defaults 0 0

/dev/sda3               swap                    swap    defaults 0 0

/dev/sdf                /opt/ebs                ext3    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

 

 上記の/etc/fstabを次のように編集する。EBSタイプAMIのディフォールトではローカルストレージを永続化しない。

# vi /etc/fstab

/dev/sda1               /                       ext3    defaults 1 1

/dev/sda3               swap                    swap    defaults 0 0

/dev/sdf                /opt/ebs                ext3    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

 

EBSボリューム作成

 ブートイメージ格納用のEBSボリュームを作成する。

# ec2-create-volume --size 16 --availability-zone us-east-1c

VOLUME  vol-1f74c576    16              us-east-1c      creating        2010-04-23T02:26:35+0000

 

 EC2インスタンスIDを取得するec2-metadataEC2インスタンスの中から実行する。

# ec2-metadata -i

instance-id: i-e5ce738e

 

 EBSボリュームをアタッチする。

# ec2-attach-volume

 

ブートイメージファイル作成

 

 最新のAMI情報を取得する。

# ec2-describe-images

中略

IMAGE   ami-3522cc5c    734464703039/cloudbb_20100416   734464703039    available       private         i386    machine aki-f5c1219c    ari-dbc121b2            instance-store

 

 バンドルボリュームをダウンロードする。この処理は数分ぐらい時間が掛る。

# ec2-download-bundle -b awk256/myami/20100416 -a AKT0IAIT0ME8QBNFGDEA -s 4I99g8X6Z1xVlDxtIdEkb0r/dcVwD5QhnUoFB5WD -k  ~/.ec2/pk-2TGZL5EIFSN0AA7ZHUJZJIZ9XNCEIFHUJH1IH.pem -p cloudbb -d /mnt

Downloading manifest myami/20100416/cloudbb.manifest.xml from awk256 to /mnt/cloudbb.manifest.xml ...

Downloading part myami/20100416/cloudbb.part.00 to /mnt/cloudbb.part.00 ...

Downloaded cloudbb.part.00 from awk256

Downloading part myami/20100416/cloudbb.part.01 to /mnt/cloudbb.part.01 ...

Downloaded cloudbb.part.01 from awk256

Downloading part myami/20100416/cloudbb.part.02 to /mnt/cloudbb.part.02 ...

Downloaded cloudbb.part.02 from awk256

中略

 

 バンドルボリュームを1ファイルに纏める。この処理は数分ぐらい時間が掛る。

# ec2-unbundle -k  ~/.ec2/pk-2N5ATGZL5EZ3XNCESA7ZH6IHIFHUJZJI.pem -m /mnt/cloudbb.manifest.xml  -s /mnt -d /mnt

Unbundle complete.

 

# ls -l /mnt | head -3

total 2595420

-rw-r--r-- 1 root root 10737418240 Apr 16 15:50 cloudbb

-rw-r--r-- 1 root root       11970 Apr 23 13:56 cloudbb.manifest.xml

中略

 

EBSボリュームアタッチ

 

     EC2インスタンスのゾーンを取得する。

# ec2-metadata -z

placement: us-east-1c

 

 ブートイメージ格納用のEBSボリュームを作成する。

# ec2-create-volume --size 10 --availability-zone us-east-1c

VOLUME  vol-7362d31a    10              us-east-1c      creating        2010-04-23T04:38:24+0000

 

 EC2インスタンスIDを取得する。

# ec2-metadata -i

instance-id: i-e5ce738e

 

 EBSボリュームをアタッチする。

# ec2-attach-volume vol-7362d31a --instance i-e5ce738e --device /dev/sdh

ATTACHMENT      vol-7362d31a    i-e5ce738e      /dev/sdh        attaching       2010-04-23T04:39:43+0000

 

 

 

 ddコマンドを使ってイメージをリアルボリュームに戻す。

# dd if=/mnt/cloudbb of=/dev/sdh

20971520+0 records in

20971520+0 records out

10737418240 bytes (11 GB) copied, 1712.37 s, 6.3 MB/s

 

 この処理120以上30ぐらい掛る。

 

EBSボリュームマウント

 

 EBSボリュームをマウントする。

# mkdir -p /mnt/ebs

# mount /dev/sdh /mnt/ebs

 

/mnt/ebs/etc/fstabの編集

 

 fstabをバックアップする。ここでは、ローカルストレージ設定を排除する。

# mv /mnt/ebs/etc/fstab /mnt/ebs/etc/fstab.bak

# cat /mnt/ebs/etc/fstab.bak | grep -v mnt > /mnt/ebs/etc/fstab

# cat /mnt/ebs/etc/fstab

vi /etc/fstab

/dev/sda1               /                       ext3    defaults 1 1

/dev/sda3               swap                    swap    defaults 0 0

/dev/sdf                /opt/ebs                ext3    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

 

Shapshot作成

 

 

 次ように実行する。

 

instance-to-ebs-ami.sh

#!/bin/bash

# Fedora8で実行している。

 

# 基本的なパラメータを設定する。

EBS_DEVICE='/dev/sdh'

IMAGE_DIR='/mnt/tmp'

EBS_MOUNT_POINT='/mnt/ebs'

INSTANCE_ID=`ec2-metadata -i | awk -F' ' '{print $2}'`

AKI=`ec2-metadata -k | awk -F' ' '{print $2}'`

ARI=`ec2-metadata -r | awk -F' ' '{print $2}'`

ARCH=i386

SIZE=10

AZ=`ec2-metadata -z | awk -F' ' '{print $2}'`

NAME=ami-from-$INSTANCE_ID

DESCRIPTION="SimpleDB Instance"

 

# EBSボリュームをアタッチする。

ec2-attach-volume $VOL_ID -i $INSTANCE_ID -d $EBS_DEVICE

sleep 60

 

# EBSボリュームをマウントする。

mkdir -p $EBS_MOUNT_POINT

mkfs.ext3 ${EBS_DEVICE}

mount ${EBS_DEVICE} $EBS_MOUNT_POINT

 

# イメージファイルを作成する。

mkdir /mnt/tmp

rsync --stats -av --exclude /root/.bash_history --exclude /home/*/.bash_history --exclude /etc/ssh/ssh_host_* --exclude /etc/ssh/moduli --exclude /etc/udev/rules.d/*persistent-net.rules --exclude /var/lib/ec2/* --exclude=/mnt/* --exclude=/proc/* --exclude=/tmp/* / $IMAGE_DIR

 

# AMI初期スクリプトが起動できるようにする。

chmod u+x $IMAGE_DIR/etc/init.d/ec2-init-user-data

 

# ログファイルを削除する。

cd $IMAGE_DIR/var/log

for i in `ls ./**/*`; do

echo $i && echo -n> $i

done

 

# EBSボリュームにイメージファイルを配置する。

cd $IMAGE_DIR

tar -cSf - -C ./ . | tar xvf - -C $EBS_MOUNT_POINT

# 上記のrsync 直接、EBS_MOUNT_POINTに置くこともできる。

 

 

# EBSボリュームをデタッチする。

ec2-detach-volume $VOL_ID

 

# ブートAMIが格納されているEBSDボリュームのスナップショットを作成する。

SNAP=`ec2-create-snapshot $VOL_ID|cut -f2|grep snap`

#echo $SNAP

 

leep 60

 

# スナップショットからAMIを登録する。

ec2-register --snapshot $SNAP --kernel $AKI --ramdisk $ARI --description="$DESCRIPTION" --name="$NAME" --architecture $ARCH --root-device-name /dev/sda1

 EBSボリュームをデタッチする。

# umount /mnt/ebs

# ec2-detach-volume vol-7362d31a

 

 ブートAMIが格納されているEBSボリュームのスナップショットを作成する。この処理10ぐらい20分ぐらい掛る。

# ec2-create-snapshot vol-7362d31a --description coludbb_sys_vol-7362d31a_20100423

SNAPSHOT        snap-70865a18   vol-7362d31a    pending 2010-04-23T05:53:42+0000                734464703039    10      coludbb_sys_vol-7362d31a_20100423

 

 AWS管理コンソールから進捗を見る。

 

 既存のカーネルIDとRAMでリスクIDを取得する。

# ec2-metadata -k

kernel-id: aki-f5c1219c

 

# ec2-metadata -r

ramdisk-id: ari-dbc121b2

 

 スナップショットからAMIを登録する。

# ec2-register --snapshot snap-70865a18 --kernel aki-f5c1219c --ramdisk ari-dbc121b2 --description="CloudBB Instance" --name="cloudbb_sys_vol-7362d31a_20100423" --architecture i386 --root-device-name /dev/sda1

IMAGE   ami-3d6a8454

 

 

 instance-to-ebs-ami.shを実行する。

# instance-to-ebs-ami.sh

IMAGE   ami-d31ff1ba

 

 実行途中、次のようなメッセージが表示されるが、「y」を選択する。

vol-8f9721e6

ATTACHMENT      vol-8f9721e6    i-9f107af4      /dev/sdh        attaching       2010-04-21T08:27:22+0000

mke2fs 1.40.4 (31-Dec-2007)

/dev/sdh is entire device, not just one partition!

Proceed anyway? (y,n) y

 

 EC2インスタンスを起動する。

# ec2-run-instances ami-3d6a8454ami-d31ff1ba --block-device-mapping /dev/sdc=ephemeral0 \

--availability-zone us-east-1dc --group testgrp webgrp \

--instance-initiated-shutdown-behavior stop --key clr256 awk256 -t m1.small

RESERVATION     r-c25143aa      734464703039    webgrp

INSTANCE        i-e5addb8e      ami-3d6a8454                    pending awk256  0               m1.small        2010-04-23T06:14:33+0000        us-east-1c      aki-f5c1219c     ari-dbc121b2            monitoring-disabled

 

 次のようにEBSタイプとインスタンスストアタイプのEC2インスタンスが並んでいるが、中身は同じである。

 

 

 TeratermEC2インスタンスに接続してみよう。る。

 

 

 

         __|  __|_  )  Fedora 8

         _|  (     /    32-bit

        ___|\___|___|

 

 Welcome to an EC2 Public Image

                       :-)

 

    Base

 

 --[ see /etc/ec2/release-notes ]--

 

[root@ip-10-244-162-198 ~]#

 

 ローカルストレージをマウントする。EBSタイプのディフォルトではマウントされていない。

# fdisk -l

 

Disk /dev/sda1: 10.7 GB, 10737418240 bytes

255 heads, 63 sectors/track, 1305 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

Disk identifier: 0x00000000

 

Disk /dev/sda1 doesn't contain a valid partition table

 

Disk /dev/sdc: 160.1 GB, 160104972288 bytes

255 heads, 63 sectors/track, 19464 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

Disk identifier: 0x00000000

 

Disk /dev/sdc doesn't contain a valid partition table

 

Disk /dev/sda3: 939 MB, 939524096 bytes

255 heads, 63 sectors/track, 114 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

Disk identifier: 0x00000000

 

Disk /dev/sda3 doesn't contain a valid partition table

 

[root@domU-12-31-39-0C-C4-24 ~]# mount /dev/sdc /mnt

 [root@domU-12-31-39-0C-C4-24 ~]# df -m

Filesystem           1M-blocks      Used Available Use% Mounted on

/dev/sda1                10080      1967      7601  21% /

none                       851         0       851   0% /dev/shm

/dev/sdc                150293       188    142471   1% /mnt