S3 Backed AMI移行トラブルシュート

S3 Backed AMIをリージョン間移行する際にハマりやすいポイントをまとめてみた
EBS Backed AMIの移行方法については、以前の記事を参照
これ以外にうまく行かないケースがあったら、twitter @j3tm0t0にmention/ #jawsug につぶやくか、AWSの日本語フォーラムEC2カテゴリに投稿してみて下さい。
※必ず最新版のEC2 API Toolsにアップデートして下さい!

*追記*
EC2 AMI Toolsへのパッチがあります。AWSからリリースされるまではこちらを使ってみましょう。

スムーズにいく場合

$ ec2-migrate-image --bucket j3tm0t0-us-west --manifest centos-5.img.manifest.xml --destination-bucket j3tm0t0-ami-tokyo -o ACCESS_KEY -w SECRET_KEY
Downloading manifest centos-5.img.manifest.xml from j3tm0t0-us-west... OK
Copying 'centos-5.img.part.00' to 'j3tm0t0-ami-tokyo/centos-5.img.part.00'... OK
Copying 'centos-5.img.part.01' to 'j3tm0t0-ami-tokyo/centos-5.img.part.01'... OK
                                   :
Copying 'centos-5.img.part.38' to 'j3tm0t0-ami-tokyo/centos-5.img.part.38'... OK
Your new bundle is in S3 at the following location: j3tm0t0-ami-tokyo/centos-5.img.manifest.xml
$ ec2-register -n centos-5 j3tm0t0-ami-tokyo/centos-5.img.manifest.xml
IMAGE   ami-xxxxxxxx

ec2-registetrでAMIが登録できたが、起動時に403エラーと出て起動しない/Pending後すぐにterminateされる

S3上のファイルのパーミッションが正しくない場合には、インスタンス起動に失敗します。

に対して、Bucket自体とファイル全部(manifest.xmlと.imgファイルすべて)にREAD権限を付ける必要があります。

ec2-migrate-imageが失敗する

Bucketの作成に失敗する

Unexpected error:
java.lang.RuntimeException: Unexpected status code: 400
        at com.amazon.aes.service.impl.S3ConnectionImpl.translateStatusCode(S3ConnectionImpl.java:276)
        at com.amazon.aes.service.impl.S3ConnectionImpl.createBucket(S3ConnectionImpl.java:210)
        at com.amazon.aes.webservices.client.cmd.MigrateBundle.invokeOnline(MigrateBundle.java:230)
        at com.amazon.aes.webservices.client.cmd.BaseCmd.invoke(BaseCmd.java:767)
        at com.amazon.aes.webservices.client.cmd.MigrateBundle.main(MigrateBundle.java:673)

→あらかじめBucketをTokyoリージョンに作成して下さい。


●manifestのダウンロードに失敗する
移行元AMIが以下の条件を同時に満たす場合に起こります

  • us-east-1以外のリージョンからの移行
  • AMIがBucket直下ではなく、階層付き(例:j3tm0t0-us-west/centos5/centos-5.img.manifest.xml)で保存されている
Downloading manifest centos-5.img.manifest.xml from j3tm0t0-us-west/centos5...Unexpected error:
java.lang.RuntimeException: Unexpected status code: 301
        at com.amazon.aes.service.impl.S3ConnectionImpl.get(S3ConnectionImpl.java:90)
        at com.amazon.aes.webservices.client.cmd.MigrateBundle.downloadManifest(MigrateBundle.java:430)
        at com.amazon.aes.webservices.client.cmd.MigrateBundle.invokeOnline(MigrateBundle.java:196)
        at com.amazon.aes.webservices.client.cmd.BaseCmd.invoke(BaseCmd.java:800)
        at com.amazon.aes.webservices.client.cmd.MigrateBundle.main(MigrateBundle.java:673)

→手動でファイルコピー(パーミッションに注意)をして、ec2-registerする(AKI/ARIを指定している際には自分で適切な物を探して--kernel/--ramdiskで指定)


●移行先に階層が指定できない
ec2-migrate-imageでは移行先bucketに階層を指定する事ができません

Unexpecteted status com.amazon.aes.service.impl.S3ConnectionImpl$2@d3ade7 for destination bucket: j3tm0t0-jp/centos5 

→以下の対応策が考えられます
1)階層構造をやめ、bucket直下に保存する
2)元のimageファイルがあれば、そこから直接Tokyoのbucketへec2-upload-bundleする