2012年5月9日水曜日

create an Amazon Machine Image (AMI)

※this text from livedoor blog 2011/9/14

Amazon EC2 のインスタンスのAMIイメージを作成します
install JAVA
# yum install java-1.6.0-openjdk

install ec2-api-tools
ec2-ami-tools.zipをダウンロードして解凍
# mkdir /usr/local/ec2-api-tools
# cd /usr/local/ec2-api-tools
# wget http://s3.amazonaws.com/ec2-downloads/ec2-api-tools.zip
# unzip ec2-api-tools.zip
# wget http://s3.amazonaws.com/ec2-downloads/ec2-ami-tools.zip
# unzip ec2-ami-tools.zip
.bashrcを編集
# cd
# emacs .bashrc
# Java for AWS
export JAVA_HOME=/usr

# AWS ami-tools
export EC2_HOME=/usr/local/ec2-api-tools/ec2-api-tools-1.4.4.2
export EC2_AMITOOL_HOME=/usr/local/ec2-api-tools/ec2-ami-tools-1.4.0.1
export PATH=$PATH:${EC2_AMITOOL_HOME:-EC2_HOME}/bin
# bash

ruby 1.9を使用している場合
String#each を each_line に変更する必要がある
Please specify a value for arch [x86_64]: 
Copying / into the image file /mnt/ami/image...
Excluding: 
         /proc
         /sys
         /dev/pts
         /proc/sys/fs/binfmt_misc
         /dev
         /media
         /mnt
         /proc
         /sys
         /mnt/ami/image
         /mnt/img-mnt
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.001476 seconds, 710 MB/s
mke2fs 1.39 (29-May-2006)
/etc/fstab:
ERROR: undefined method `each' for #
上記のように、エラーとなってしまう image.rbを編集して対応する
$ diff -c ec2-ami-tools-1.4.0.1/lib/ec2/platform/linux/image.rb.org ec2-ami-tools-1.4.0.1/lib/ec2/platform/linux/image.rb
*** ec2-ami-tools-1.4.0.1/lib/ec2/platform/linux/image.rb.org   2011-10-19 17:45:16.000000000 +0900
--- ec2-ami-tools-1.4.0.1/lib/ec2/platform/linux/image.rb       2011-10-19 17:45:55.000000000 +0900
***************
*** 276,282 ****
              fstab_content = make_fstab
              File.open( fstab, 'w' ) { |f| f.write( fstab_content ) }
              puts "/etc/fstab:" 
!             fstab_content.each do |s|
                puts "\t #{s}" 
              end
            end
--- 276,282 ----
              fstab_content = make_fstab
              File.open( fstab, 'w' ) { |f| f.write( fstab_content ) }
              puts "/etc/fstab:" 
!             fstab_content.each_line do |s|
                puts "\t #{s}" 
              end
            end

API用の証明書ファイルの設定
証明書をダウンロード https://aws-portal.amazon.com/ ↓ アカウント ↓ セキュリティ証明書 cert-xxxxx.pemとpk-xxxxx.pemを用意 /mnt/以下に証明書を設置
/mnt/pk-xxxxx.pem
/mnt/cert-xxxxx.pem
口座番号の値を確認しておく https://aws-portal.amazon.com/ ↓ アカウント ↓ 口座番号 xxxx-xxxx-xxxx
AMI作成
# ec2-bundle-vol -d /mnt --privatekey /mnt/pk-xxxxx.pem --cert /mnt/cert-xxxxx.pem --user [口座番号] --fstab /etc/fstab

Please specify a value for arch [x86_64]: 
Copying / into the image file /mnt/image...
Excluding: 
         /sys
         /proc
         /dev/pts
         /proc/sys/fs/binfmt_misc
         /dev
         /media
         /mnt
         /proc
         /sys
         /mnt/image
         /mnt/img-mnt
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.001659 seconds, 632 MB/s
mke2fs 1.39 (29-May-2006)
/etc/fstab:
         /dev/sda1  /         ext3    defaults        0  0  
         /dev/sdb   /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  
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
~~~~~~~
Generating digests for each part...
Digests generated.
Unable to read instance meta-data for ancestor-ami-ids
Unable to read instance meta-data for product-codes
Creating bundle manifest...
ec2-bundle-vol complete.

AMI確認
# cd /mnt
# ls -al

AMIを保存するS3のバケットを作成
http://aws.amazon.com/console/ ↓ Amazon Simple Storage Service (S3) ↓ Create Bucket ↓ バケット名とリュージョンを指定(ここではTokyoを指定する) ↓ Create
AMIをS3へアップロード
https://aws-portal.amazon.com/ アカウント ↓ セキュリティ証明書 ↓ 「アクセスキー ID」と「シークレットアクセスキー」を確認
# ec2-upload-bundle --bucket バケット名 --manifest image.manifest.xml --access-key アクセスキーID --secret-key シークレットアクセスキー

Uploading bundled image parts to the S3 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
~~~~~~~
Uploading manifest ...
Uploaded manifest.
Bundle upload completed.

AMI 登録
# ec2-register --region ap-northeast-1 -K /mnt/pk-xxxxx.pem -C /mnt/cert-xxxxx.pem バケット名/image.manifest.xml
IMAGE   ami-xxxxxxxx
※--regionにS3のリュージョンを指定する Tokyoの場合はap-northeast-1
登録されたAMIを確認
# ec2-describe-images -o self --region ap-northeast-1 -K /mnt/pk-xxxxx.pem -C /mnt/cert-xxxxx.pem
IMAGE   ami-xxxxxxxx    バケット名/image.manifest.xml    111111111111    available       private         x86_64  xxxxxxxxx-22222222     xxx-33333333            instance-store
http://aws.amazon.com/console/ ↓ Amazon Elastic Compute Cloud (EC2) ↓ Region指定 ↓ Launch Instance ↓ My AMIs ↓ Viewing: Privete Images