前々回は、インスタンスの起動・停止・確認まで進みました。そして、今回は AMI の作成を行いたいます。
作成理由は、EC2 をシャットダウンするとディスクに保存した内容が失われてしまうのですが。AMI を作成することにより、作成した時点のディスク内容でインススタンス起動できます。*1
今回も CodeZine に沿った形で作業を進めて行きます。今回の内容は2ページ分ですね。
事前情報
- AMI は S3 に転送して保存する
- EC2 から S3 への転送料は課金対象外
- イメージ化されるディレクトリは「/dev/sda1」のみ
ssh 接続
今回は『AWS Management Console』を利用した手軽な接続方法を解説します。
- AWS Management Console/EC2 から、左メニューの [Instances] をクリック
- [Connect] ボタンをクリック
- [Connect Help - Secure Shell (SSH)]というタイトルのウィンドウが表示される
- ウィンドウ下に、ssh 接続するためのコマンドが添付されているので copy and paste
- ターミナルで、以前に作成したインスタンスキーが保管されているディレクトリでコマンド実行*2
適当なファイル作成
そのまま AMI 作成しても、元の AMI と違いが無いので、何かしらファイルを作成しておきます。
root@domU-12-31-39-00-5E-33:/root# ls test
AMI 作成
「X.509証明書」転送
前々回に取得しておいた「X.509証明書」を AMI 側へ転送させます。
$ scp -i ec2_instance_key.pem *.pem root@ec2-75-101-180-145.compute-1.amazonaws.com:/mnt cert-xxxxx.pem 100% 916 0.9KB/s 00:00 ec2_instance_key.pem 100% 1675 1.6KB/s 00:00 pk-xxxxx.pem 100% 926 0.9KB/s 00:00
ssh 接続して転送されたことを確認
/mnt にファイルが存在するかをチェックします。
# cd /mnt # ls cert-xxxxx.pem ec2_instance_key.pem lost+found pk-xxxxx.pem
おぉ、ちゃんと転送されていましたね。
AMI 作成
はい、ようやく作成できます。
コマンドで、user の後にはアカウント名*3を指定してください。
途中で確認を求められますが。インスタンスタイプが「m1.small」なら、そのまま Enter を押せばよいです。
# ec2-bundle-vol -d /mnt --privatekey pk-xxxxx.pem --cert cert-xxxxx.pem --user xxxx-xxxx-xxxx --fstab /etc/fstab Please specify a value for arch [i386]: Copying / into the image file /mnt/image... Excluding: /sys /proc /dev/pts /dev /media /mnt /proc /sys /etc/udev/rules.d/70-persistent-net.rules /etc/udev/rules.d/z25_persistent-net.rules /mnt/image /mnt/img-mnt 1+0 records in 1+0 records out 1048576 bytes (1.0 MB) copied, 0.002536 s, 413 MB/s mke2fs 1.41.4 (27-Jan-2009) /etc/fstab: # Legacy /etc/fstab # Supplied by: ec2-ami-tools-1.3-30748 /dev/sda1 / ext3 defaults 1 1 /dev/sda2 /mnt ext3 defaults 0 0 /dev/sda3 swap swap defaults 0 0 none /proc proc defaults 0 0 none /sys sysfs defaults 0 0 Bundling image file... Splitting /mnt/image.tar.gz.enc... Created image.part.00 Created image.part.01 Created image.part.02 Created image.part.03 Created image.part.04 Created image.part.05 Created image.part.06 Created image.part.07 Created image.part.08 Created image.part.09 Created image.part.10 Created image.part.11 Created image.part.12 Generating digests for each part... Digests generated. Unable to read instance meta-data for product-codes Creating bundle manifest... ec2-bundle-vol complete.
ほぼ初期状態にも関わらず、作成には2・3分もかかりました。
作成した AMI を S3 へアップロード(仮)
作成されたデータは、EC2 側の /mnt ディレクトリにありますので、これを S3 へアップロードしてみます。
と、ここで重要なことに気づきました。
S3 の環境構築をしていない
ここ以降から構築について書いても良いのですが、読み難くなるので分けて書きます。
Amazon S3 を使ってみたよ
作成した AMI を S3 へアップロード(真)
${...} は、それぞれ指定して実行してください。
# ec2-upload-bundle --bucket ${アップ先のバケット名} --manifest image.manifest.xml --access-key ${Access Key ID} --secret-key ${Secret Access Key} bucket ${アップ先のバケット名} ... Uploaded image.part.00 Uploaded image.part.01 Uploaded image.part.02 Uploaded image.part.03 Uploaded image.part.04 Uploaded image.part.05 Uploaded image.part.06 Uploaded image.part.07 Uploaded image.part.08 Uploaded image.part.09 Uploaded image.part.10 Uploaded image.part.11 Uploaded image.part.12 Uploading manifest ... Uploaded manifest. Bundle upload completed.
前述した通り、この転送料は課金されません。
AMI 登録
インスタンス起動できるよう AMI の ID を発行します。そのため、ログアウト(インスタンス起動停止)してから作業してください。
$ ec2-register ${アップ先のバケット名}/image.manifest.xml IMAGE ami-0558bf6c
現在登録中の AMI を確認してみましょう。
$ ec2-describe-images -o self MAGE ami-0558bf6c aws-kawakami/image.manifest.xml 443600062368 available private i386 machine aki-a71cf9ce ari-a51cf9cc
AMI の ID が「ami-0558bf6c」だと分かります。
また、デフォルトでは private となっていますが、これを public にすることも可能です。
AMI 起動
AWS Management Console を使って起動してみたいと思います。
- 左メニューにある [AMIs] をクリック
- 左側のコンボボックスで、「Private Images」を選択
- 発行した AMI の ID が一覧上に並ぶので、選択して [Launch] ボタンをクリック
これで起動します。
確認
root@ip-10-251-211-144:~# ls test
きちんと前に作成した「test」ファイルが存在することが確認できました。
以上で、今回の検証は終わります。
まとめ
まず、起動した仮想マシン上での作業がとにかく遅い。単にファイル作成するだけでもモッサリしててイラっと来る場合があります。このレスポンスの遅さは、国内にサーバーが置かれたら改善されるかもしれませんが、それ意外の方法でも何か対策が取れないか模索すべきです(既にある?)。
また、AMI の保存という作業が予想以上にメンドクサイです。どこがメンドウかと言うと、/mnt ディレクトリ情報が保存できないため、再度 AMI を保存したいときは一から作業しないとダメなところです。この辺は別の仕組みで保存できるらしいので、その方法しだいでは改善できるのかもしれません。