みなさんこんにちは!インフラエンジニアの柳瀬です。 毎日暑いので、データセンターに行くのも嫌になってしまいますね。
あ、すいません。データセンターに行くのは暑くなくても嫌でした。インフラエンジニア失格ですね(笑) さて、『全てのサーバーをクラウドに移行する事が出来たら、データセンターに行く事もなくなる!』と夢見ておりますが、シンガポールにあるAWSのデータセンターがオープンして3カ月程度たちました。 先日、US WestにあるEBSタイプインスタンスをAsia Pacificに移行したという事もあり、今回のエントリーではEBSタイプのインスタンスを他のリージョンへ移行する手順について書きたいと思います。 必要な前提条件は以下の通りです
- 移行するインスタンスにはec2-api-toolsがインストールされている事
- 移行するインスタンスにはec2-ami-toolsがインストールされている事
- 移行するインスタンスにはec2-metadataがインストールされている事
- 今回はUS WestからAsia Pacificへの移動する
移行手順の概要は以下の通りです
- EBSタイプのインスタンス上でイメージファイルを作成してAsia PacificのS3バケットにアップロード
- Asia Pacificデータセンターで起動出来るインスタンスストアタイプのAMIを作成して起動
- インスタンスストアタイプのインスタンスからEBSタイプのAMIを作成
※ec2-api-toolsとec2-ami-toolsのインストールは割愛してあります
準備
ec2-metadataのインストール
# wget http://s3.amazonaws.com/ec2metadata/ec2-metadata
# chmod 755 ec2-metadata
# mv ec2-metadata /usr/bin/
fstabの状態を確認
# vi /etc/fstab
/dev/sda1 / ext3 defaults 1 1
/dev/sda3 swap swap defaults 0 0
/dev/sdc /mnt 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
イメージファイルを作成しAsia PacificのS3へアップ
ec2-bundle-volを実行してインスタンスのイメージファイルを作成
# ec2-bundle-vol -k 秘密鍵 -c X.509証明書 -u アカウントナンバー
Asia-PacificのS3バケットを作成後、S3へイメージファイルをアップロード
# ec2-upload-bundle -b 作成したS3バケット名/ -m image.manifest.xml -a アクセスキーID -s シークレットアクセスキー
S3のイメージファイルからinstance-storeタイプのAMIを作成し、起動
S3へアップロードしたイメージファイルからAMIを登録する
$ ec2-register 作成したS3バケット名/image.manifest.xml --url https://ec2.ap-southeast-1.amazonaws.com
作成したAMIからインスタンスを起動します(AWS Management Consoleからでも実行出来ます)
$ ec2-run-instances AMI-ID -k 起動する秘密鍵 --group セキュリティグループ --url https://ec2.ap-southeast-1.amazonaws.com
起動したインスタンスからイメージを作成してEBSに展開、設定変更
起動したインスタンスへログイン後、ec2-bundle-volを実行してインスタンスのイメージファイルを作成
# cd /mnt
# ec2-bundle-vol -d /mnt -k 秘密鍵 -c X.509証明書 -u アカウントナンバー
バンドルボリュームを一つのファイルにまとめる
# ec2-unbundle -k 秘密鍵 -m /mnt/image.manifest.xml -s /mnt/ -d /mnt/
Unbundle complete.
# ls -l /mnt | head -3
合計 2194968
-rw-r--r-- 1 root root 10737418240 8月 16 16:26 image
-rw-r--r-- 1 root root 9406 8月 16 16:35 image.manifest.xml
EC2インスタンスのゾーンを取得する。
# ec2-metadata -z
placement: ap-southeast-1a
ブートイメージ格納用のEBSボリュームを作成する(EBSボリュームIDをメモ)
# ec2-create-volume --size 10 --availability-zone ap-southeast-1a
作成したEBSボリュームをアタッチする
# ec2-attach-volume EBSボリュームID --instance インスタンスID --device /dev/sdh
イメージをEBSボリュームに戻す
# dd if=/mnt/image of=/dev/sdh
20971520+0 records in
20971520+0 records out
10737418240 bytes (11 GB) copied, 1254.23 seconds, 8.6 MB/s
EBSボリュームをマウントする
# mkdir /mnt/ebs
# mount /dev/sdh /mnt/ebs
# df -h
Filesystem サイズ 使用 残り 使用% マウント位置
/dev/sda1 9.9G 1.7G 7.7G 18% /
/dev/sdc 147G 2.3G 138G 2% /mnt
none 851M 0 851M 0% /dev/shm
/dev/sdh 9.9G 1.7G 7.7G 18% /mnt/ebs
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
/dev/sda1 / ext3 defaults 1 1
/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
EBSボリュームをアンマウントする
# umount /mnt/ebs
# df -h
Filesystem サイズ 使用 残り 使用% マウント位置
/dev/sda1 9.9G 1.7G 7.7G 18% /
/dev/sdc 147G 2.3G 138G 2% /mnt
none 851M 0 851M 0% /dev/shm
スナップショットを取得してAMIを作成
EBSボリュームのスナップショットを取得する(スナップショットのIDをメモ)
# ec2-create-snapshot EBSボリュームID --description hogehoge
カーネルIDを取得(カーネルIDをメモ)
# ec2-metadata -k
kernel-id: not available
RAMディスクIDを取得(RAMディスクIDをメモ)
# ec2-metadata -r
ramdisk-id: not available
スナップショットからAMIを登録する
# ec2-register --snapshot スナップショットのID
--description="hogehoge"
--architecture i386
--root-device-name /dev/sda1
EBSタイプのインスタンスを起動、各種設定
EC2インスタンスを起動する
# ec2-run-instances AMIのID
--kernel カーネルID
--ramdisk RAMディスクID
--block-device-mapping /dev/sdc=ephemeral0
--availability-zone ap-southeast-1a
--group セキュリティグループ
--instance-initiated-shutdown-behavior stop
--key 秘密鍵
-t m1.small
インスタンス起動後にローカルストレージのマウントとfstabの編集
# df -h
Filesystem サイズ 使用 残り 使用% マウント位置
/dev/sda1 9.9G 1.7G 7.7G 18% /
none 851M 0 851M 0% /dev/shm
# fdisk -l
Disk /dev/sdc: 160.1 GB, 160104972288 bytes
255 heads, 63 sectors/track, 19464 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes
ディスク /dev/sdc は正常な領域テーブルを含んでいません
# mount /dev/sdc /mnt
# df -h
Filesystem サイズ 使用 残り 使用% マウント位置
/dev/sda1 9.9G 1.7G 7.7G 18% /
none 851M 0 851M 0% /dev/shm
/dev/sdc 147G 188M 140G 1% /mnt
# vi /etc/fstab
1 /dev/sda1 / ext3 defaults 1 1
2 /dev/sda3 swap swap defaults 0 0
3 /dev/sdc /mnt ext3 defaults 0 0
4 none /dev/pts devpts gid=5,mode=620 0 0
5 none /dev/shm tmpfs defaults 0 0
6 none /proc proc defaults 0 0
7 none /sys sysfs defaults 0 0
おわり
もう少し簡単なやり方があるかもしれません。
環境によってはfstabの設定などで手順が変わる場合があるかもしれませんが、ひとまず移行出来たので一安心です。
参考にさせて頂いたサイト
今回のエントリではこちらのサイトを参考にさせて頂きました。
ありがとうございましたー! http://cloudbb.jp/research1/ConvertEBS-bootedAMI.htm