hyoromoのブログ

最近はVRSNS向けに作ったものについて書いています

EC2 での AMI 作成手順

前々回は、インスタンスの起動・停止・確認まで進みました。そして、今回は AMI の作成を行いたいます。
作成理由は、EC2 をシャットダウンするとディスクに保存した内容が失われてしまうのですが。AMI を作成することにより、作成した時点のディスク内容でインススタンス起動できます。*1
今回も CodeZine に沿った形で作業を進めて行きます。今回の内容は2ページ分ですね。

事前情報

  • AMI は S3 に転送して保存する
  • EC2 から S3 への転送料は課金対象外
  • イメージ化されるディレクトリは「/dev/sda1」のみ

インスタンス

前々回の方法で、インスタンス起動まで進めます。

ssh 接続

今回は『AWS Management Console』を利用した手軽な接続方法を解説します。

  1. AWS Management Console/EC2 から、左メニューの [Instances] をクリック
  2. [Connect] ボタンをクリック
    ssh 接続その1
  3. [Connect Help - Secure Shell (SSH)]というタイトルのウィンドウが表示される
  4. ウィンドウ下に、ssh 接続するためのコマンドが添付されているので copy and paste
    ssh 接続その2
  5. ターミナルで、以前に作成したインスタンスキーが保管されているディレクトリでコマンド実行*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 を使って起動してみたいと思います。

  1. 左メニューにある [AMIs] をクリック
  2. 左側のコンボボックスで、「Private Images」を選択
  3. 発行した AMI の ID が一覧上に並ぶので、選択して [Launch] ボタンをクリック
    EC2

これで起動します。

確認

root@ip-10-251-211-144:~# ls
test

きちんと前に作成した「test」ファイルが存在することが確認できました。
以上で、今回の検証は終わります。

まとめ

まず、起動した仮想マシン上での作業がとにかく遅い。単にファイル作成するだけでもモッサリしててイラっと来る場合があります。このレスポンスの遅さは、国内にサーバーが置かれたら改善されるかもしれませんが、それ意外の方法でも何か対策が取れないか模索すべきです(既にある?)。
また、AMI の保存という作業が予想以上にメンドクサイです。どこがメンドウかと言うと、/mnt ディレクトリ情報が保存できないため、再度 AMI を保存したいときは一から作業しないとダメなところです。この辺は別の仕組みで保存できるらしいので、その方法しだいでは改善できるのかもしれません。

*1:別の方法でもディスク内容は保存可能

*2:以前に作成したインスタンスキー名称は ec2_instance_key.id でしたが、コピー元に合わせて ec2_instance_key.pem と拡張子を変更しました

*3:AWS サイトの [Account Activity] ページに Account Number とある番号のこと