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 (さっきと違うバケット名) (リージョン)
いじょー。