15 October 2009

Amazon EC2:稼動中のOSイメージをS3にバックアップする

ディザスタリカバリに必ず必要になる、安定稼動中のOSパーティションのバックアップが、Amazon EC2ではとても簡単に出来る。
(通常のサーバでは、サーバを停止させて、1本数千円するLTOやDLTテープにバックアップするわけだが、時間も金も掛かる)

仮想マシン(AMI)の起動・停止を、ブラウザ上で行うAWS Management Consoleを用いている場合は、コマンドラインツール(Amazon EC2 API Tools)を用いる必要がある。そのセットアップをまず行う。

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

20091015-ec2-createkey.png

ブラウザでAmazon Web Servicesにログインして、Security Credentials -> Access Credentials -> X.509 Certificates とメニューを辿って、X509公開鍵ペアを作成し、画面上でダウンロード可能なプライベート・キーと証明書の2つのファイルをダウンロードする。

今回ダウンロードしたのは次の2つのファイル
pk-BXCXZX5XLMCN4VL7CX5SDXSXQX3XRX2U.pem
cert-BXCXZX5XLMCN4VL7CX5SDXSXQX3XRX2U.pem

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

ローカル環境(手元のパソコン)に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 をダウンロードする。

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

環境変数の設定

Windowsの場合、次のように環境変数を設定する。このようなバッチファイルを作成しておくと便利。


set EC2_HOME=d:\pbin\ec2
set EC2_PRIVATE_KEY=d:\pbin\ec2\key\pk-BXCXZX5XLMCN4VL7CX5SDXSXQX3XRX2U.pem
set EC2_CERT=d:\pbin\ec2\key\cert-BXCXZX5XLMCN4VL7CX5SDXSXQX3XRX2U.pem
set PATH=%PATH%;%EC2_HOME%\bin
set JAVA_HOME=H:\Program Files\Java\jre6

■ ローカル環境でのテスト(稼動中のインスタンス一覧の取得)

ec2-describe-instancesコマンドを用いる。コマンド自体の説明は API Command Line Tools Reference に詳しく書かれている。


F:\>ec2-describe-instances
RESERVATION r-e684688e 193727025378 http_ssh_server
INSTANCE i-92b90ffa ami-48aa4921 ec2-174-129-61-217.compute-1.amazonaws.com domU-12-31-39-03-21-D4.compute-1.internal running r271-635 0 m1.small 2009-10-15T14:20:17+0000 us-east-1c aki-6eaa4907 ari-42b95a2b monitoring-disabled 174.129.61.217 10.249.34.34

■ Amazon Web Services アクセス用鍵の対象仮想サーバへのアップロード

バックアップを行う仮想サーバでコマンド操作を行う必要があるため、事前に、アクセス用鍵をアップロードしておく。アップロードするのは秘密鍵と証明書。

今回アップロードしたのは次の2つのファイル
pk-BXCXZX5XLMCN4VL7CX5SDXSXQX3XRX2U.pem
cert-BXCXZX5XLMCN4VL7CX5SDXSXQX3XRX2U.pem

今回は、テスト環境を用いているため、仮想サーバにFTPなどがまだインストールされていない。WinSCPを利用してファイルをアップロードした。アップロード先は任意のディレクトリでよいが、今回は/mnt にアップロードした。

20091015-ec2-copykey.png

■ 稼動中の仮想サーバの起動ディスクのイメージファイル化

仮想サーバにSSHでログオンしてec2-bundle-vol コマンドを用いて、起動ディスク(/dev/sda1)を/mntにイメージファイル化して保存する。

この方法は、公式ガイド Amazon Elastic Compute Cloud Getting Started Guide の、『 Getting Started with the Command Line Tools -> Running an Instance -> Linux and UNIX -> Bundling an AMI 』 に詳細に書かれている。


[root@ip-10-244-147-132 ~]# ec2-bundle-vol -d /mnt --privatekey /mnt/pk-BXCXZX5XLMCN4VL7CX5SDXSXQX3XRX2U.pem --cert /mnt/cert-BXCXZX5XLMCN4VL7CX5SDXSXQX3XRX2U.pem --user 1234-5678-1234 -r i386 -p fedora8img

Copying / into the image file /mnt/fedora8img...
Excluding:
/sys
/proc
/sys/fs/fuse/connections
/dev/pts
/proc/sys/fs/binfmt_misc
/dev
/media
/mnt
/proc
/sys
/mnt/fedora8img
/mnt/img-mnt
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.001716 s, 611 MB/s
mke2fs 1.40.4 (31-Dec-2007)
NOTE: rsync with preservation of extended file attributes failed. Retrying rsync
without attempting to preserve extended file attributes...
NOTE: rsync seemed successful but exited with error code 23. This probably means
that your version of rsync was built against a kernel with HAVE_LUTIMES defined,
although the current kernel was not built with this option enabled. The bundling
process will thus ignore the error and continue bundling. If bundling completes
successfully, your image should be perfectly usable. We, however, recommend that
you install a version of rsync that handles this situation more elegantly.
Bundling image file...
Splitting /mnt/fedora8img.tar.gz.enc...
Created fedora8img.part.00
Created fedora8img.part.01
Created fedora8img.part.02
Created fedora8img.part.03
Created fedora8img.part.04

~ 略 ~

Created fedora8img.part.50
Created fedora8img.part.51
Created fedora8img.part.52
Created fedora8img.part.53
Generating digests for each part...
Digests generated.
Unable to read instance meta-data for product-codes
Creating bundle manifest...
ec2-bundle-vol complete.

このプロセスは10~15分程度掛かります。イメージ化されたファイルは次のような感じ


[root@ip-10-244-147-132 ~]# ls -la /mnt

total 2335284
drwxr-xr-x 4 root root 4096 Oct 16 08:26 .
drwxr-xr-x 22 root root 4096 Oct 16 06:56 ..
-rw-r--r-- 1 root root 916 Oct 15 09:34 cert-BXCXZX5XLMCN4VL7CX5SDXSXQX3XRX2U.pem
-rw-r--r-- 1 root root 10737418240 Oct 16 08:15 fedora8img
-rw-r--r-- 1 root root 10393 Oct 16 08:26 fedora8img.manifest.xml
-rw-r--r-- 1 root root 10485760 Oct 16 08:26 fedora8img.part.00
-rw-r--r-- 1 root root 10485760 Oct 16 08:26 fedora8img.part.01
-rw-r--r-- 1 root root 10485760 Oct 16 08:26 fedora8img.part.02

~ 略 ~

-rw-r--r-- 1 root root 10485760 Oct 16 08:26 fedora8img.part.51
-rw-r--r-- 1 root root 10485760 Oct 16 08:26 fedora8img.part.52
-rw-r--r-- 1 root root 3739200 Oct 16 08:26 fedora8img.part.53
drwxr-xr-x 2 root root 4096 Oct 16 08:15 img-mnt
drwx------ 2 root root 16384 Jun 16 15:37 lost+found
-rw-r--r-- 1 root root 926 Oct 15 09:34 pk-BXCXZX5XLMCN4VL7CX5SDXSXQX3XRX2U.pem

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

仮想サーバにSSHでログオンしたまま、ec2-upload-bundle コマンドを用いる。アップロード先の受け皿となるバケット(ディレクトリのようなもの)は、Amazon S3上にあらかじめ作っておく。(今回は、amifedora8 という新しいバケットを作成した)


[root@ip-10-244-147-132 ~]# ec2-upload-bundle --bucket amifedora8 --manifest /mnt/fedora8immg.manifest.xml --access-key 0123X456X789X321X2 --secret-key sywHyjesGTWxwuUKSYjcguwkbswkSSWk

Uploading bundled image parts to the S3 bucket amifedora8 ...
Uploaded fedora8img.part.00
Uploaded fedora8img.part.01
Uploaded fedora8img.part.02

~ 略 ~

Uploaded fedora8img.part.51
Uploaded fedora8img.part.52
Uploaded fedora8img.part.53
Uploading manifest ...
Uploaded manifest.
Bundle upload completed.

このプロセスは数分で完了します。

10メガバイトのファイルが53個あって、合計容量550メガバイト程度となっている。Amazon S3の料金体系は『 0.15ドル/ギガバイト/月 』なので、このイメージを1ヶ月保管しても0.08ドル(8円?)程度しか料金がかからない。 また、EC2とS3の間の転送料金は無料なので、必要なときにバックアップを取って、ディザスタリカバリに備えても、ほとんどコストがかからないということになる。

ここまで作業が終われば、SSHからログオフして、仮想マシンを終了(Terminate)してかまわない。

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

ローカルのシェル(今回はWindowsのコマンドプロンプト)を起動して、ec2-registerコマンドを用いて登録を行う。 登録後は、ec2-describe-imagesコマンドで登録されたかどうか確認を念のために行う。


F:\>ec2-register amifedora8/fedora8img.manifest.xml

IMAGE ami-45d1322c

F:\>ec2-describe-images -o self
IMAGE ami-45d1322c amifedora8/fedora8img.manifest.xml 193727025378
available private i386 machine aki-6eaa4907 ari-42b95a2b


※ 過去に書いた関連記事
Amazon EC2:1分で構築するWebサーバ
Amazon EC2を使ってWikipediaをEPWINGデータに変換
LinuxサーバからAmazon S3を用いる (2/2)

※ 参考にした第三者のホームページ
Amazon EC2のイメージファイルをS3に保存する
EC2 での AMI 作成手順