AWSでAMIの取得・登録で試行錯誤

やりたいこと

稼働しているインスタンスのAMIを登録しておいていつでもサーバの複製ができるようにしておきたい。

うまくいったやり方

前提として、AWSの利用時に必要なCertificatesは環境変数として定義してある。

  • AMIイメージの作成(バンドル)

インスタンス上での作業。

# ec2-bundle-vol --cert ${EC2_CERT} --privatekey ${EC2_PRIVATE_KEY} --user ${AWS_ACCOUNT} \
--destination /mnt --arch (アーキテクチャ) \
--exclude (除外したいディレクトリ)[,...] \
--prefix (イメージ名)
Uploading bundled image parts to the S3 bucket fulsat9-images ...
Uploaded (イメージ名).part.00
…
Uploading manifest ...
Uploaded manifest.
Bundle upload completed.

これで/mnt 以下に(イメージ名).part.(番号) が複数と、1つのマニフェストファイル((イメージ名).manifest.xml) が作成される。

  • S3 へのアップロード
# ec2-upload-bundle -r (リージョン) -b (バケット) -m /mnt/(イメージ名).manifest.xml -a ${AWS_ACCESS_KEY_ID} -s ${AWS_SECRET_ACCESS_KEY}
Uploading bundled image parts to the S3 bucket (バケット) ...
Uploaded (イメージ名).part.00
…
Uploading manifest ...
Uploaded manifest.
Bundle upload completed.

これでS3上にファイルがアップされた。(FireFox ユーザなら、S3Fox Organizer などで確認できる。)

  • AMIの登録
# ec2-register (バケット名)/(イメージ名).manifest.xml
IMAGE   ami-xxxxxx

これで、AWS Management Console の「Images > AMIs」で、上記のID(ami-xxxxxx) が確認できる。

あとはインスタンスが必要になった際に、AMIの選択画面で作成したAMIを選択すればよし。

エラーいろいろ

途中でひっかかったものを備忘録としてメモメモ。

AMIの登録時その1
  • 操作とエラーメッセージ
# ec2-register (バケット名)/(イメージ名).manifest.xml -n (名前)
Client.InvalidManifest: HTTP 301 (Moved Permanently) response for URL http://(バケット名).s3.amazonaws.com:80/(イメージ名).manifest.xml: check your manifest path is correct and in the correct region.
  • 問題

利用しようとしている(${EC2_URL} などで指定している)リージョンと、バケットのリージョンが異なる(バケットのリージョンは確認の仕方がわかりませんでした。。)

  • 対処

利用しようとしているリージョンを指定してバンドルし直す。

 # ec2-upload-bundle -r (リージョン) -b (バケット) -m (イメージ名).manifest.xml  -a ${AWS_ACCESS_KEY_ID} -s ${AWS_SECRET_ACCESS_KEY}
    • ちなみにec2-migrate-bundle を使うやり方もあるみたいだが、location にap-southeast-1 が指定できなかったり、転送中に下記のようなエラーが出たりしてうまくいかなかったので、結局バンドルし直した。
Failed to copy "(イメージ名).part.32": Curl.Error(): SSL read: error:00000000:lib(0):func(0):reason(0), errno 104.
ERROR: Failed to copy "(イメージ名).part.32": Curl.Error(): SSL read: error:00000000:lib(0):func(0):reason(0), errno 104.
AMIの登録時その2
  • 操作とエラーメッセージ
# ec2-register -r (リージョン) (バケット名)/(イメージ名).manifest.xml -n (名前)
Client.InvalidManifest: HTTP 404 (Not Found) response for URL http://(バケット名).s3.amazonaws.com:80/(イメージ名).manifest.xml: check your manifest path is correct and in the correct region.
  • 問題

バケット名、あるいはマニフェストファイル名が間違っている。

  • 対処

バケット名やマニフェストファイルを確認する。

# s3cmd listbuckets
(S3Fox Organizer を使ったり。)
バケットの作成時
  • 操作とエラーメッセージ
# s3cmd createbucket (バケット名) (リージョン)
S3 command failed:
create_bucket <CreateBucketConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01"><LocationConstraint>(リージョン)</LocationConstraint></CreateBucketConfiguration>
With result 409 Conflict
  • 問題

過去に同じ名前のバケットを作成していて、削除したつもりでも名前が使用されてしまっている状態。

  • 対処

バケット名を変える。

 # s3cmd createbucket (さっきと違うバケット名) (リージョン)

いじょー。