ステップ 3: イメージとして VM をインポートする - VM Import/Export」に基づいて OVA ファイルをアップロードして AMI にする手順をまとめた。

S3 バケットの作成

OVA ファイルをいったん S3 バケットにアップロードする必要があるため、バケットを作成する。

① 名前とリージョンで以下の指定を実施

  • 「バケット名」に任意の文字列を入力
  • 「リージョン」に適切なリージョン(通常は「アジアパシフィック(東京)」を指定
  • 「次へ」ボタンを押下

② プロパティの設定

  • 必要に応じて設定
  • 「次へ」ボタンを押下

③ アクセス許可の設定

  • (「パブリックアクセス許可を管理」を開き「認証済みの AWS ユーザー」の「読み込み」をチェック)
  • 「次へ」ボタンを押下

④ 確認

  • 「バケットを作成」ボタンを押下

awscli のインストール

brew install awscli
aws configure

今回は Mac で作業したので Homebrew でインストール。環境に応じて適宜対応。

サービスロールの作成

ポリシーの作成

cat << "_EOF_" > trust-policy.json
{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Effect": "Allow",
         "Principal": { "Service": "vmie.amazonaws.com" },
         "Action": "sts:AssumeRole",
         "Condition": {
            "StringEquals":{
               "sts:Externalid": "vmimport"
            }
         }
      }
   ]
}
_EOF_
aws iam create-role --role-name vmimport --assume-role-policy-document file://trust-policy.json

create-role コマンドで vmimport というロールを作成する。

ロールへのポリシーのアタッチ

cat << "_EOF_" > role-policy.json
{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Effect": "Allow",
         "Action": [
            "s3:ListBucket",
            "s3:GetBucketLocation"
         ],
         "Resource": [
            "arn:aws:s3:::disk-image-file-bucket"
         ]
      },
      {
         "Effect": "Allow",
         "Action": [
            "s3:GetObject"
         ],
         "Resource": [
            "arn:aws:s3:::disk-image-file-bucket/*"
         ]
      },
      {
         "Effect": "Allow",
         "Action":[
            "ec2:ModifySnapshotAttribute",
            "ec2:CopySnapshot",
            "ec2:RegisterImage",
            "ec2:Describe*"
         ],
         "Resource": "*"
      }
   ]
}
_EOF_
aws iam put-role-policy --role-name vmimport --policy-name vmimport --policy-document file://role-policy.json

disk-image-file-bucket (2箇所) は適宜変更のこと。
put-role-policy コマンドで上記で作成したロールにポリシーをアタッチする。

OVA ファイルのアップロード

aws s3 cp disk-image-file.ova s3://disk-image-file-bucket/

カレントディレクトリーにある disk-image-file.ova ファイルを disk-image-file-bucket バケットにアップロードする。

OVA ファイルのインポート

cat << "_EOF_" > containers.json
[
  {
    "Description": "OVA Disk Image",
    "Format": "ova",
    "UserBucket": {
        "S3Bucket": "disk-image-file-bucket",
        "S3Key": "disk-image-file.ova"
    }
  }
]
_EOF_
aws ec2 import-image --description "OVA Disk Image" --disk-containers file://containers.json

JSON ファイル内に "Description": があるが、オプションでも --description を指定しないと以下のエラーが出る。

A client error (InvalidParameter) occurred when calling the ImportImage operation: The service role <vmimport> does not exist or does not have sufficient permissions for the service to continue

ステータスの確認

aws ec2 describe-import-image-tasks --import-task-ids import-ami-XXXXXXXX
IMPORTIMAGETASKS    OVA Disk Image  import-ami-XXXXXXXX 2   active  pending
SNAPSHOTDETAILS 0.0 OVA
USERBUCKET  disk-image-file-bucket  disk-image-file.ova
IMPORTIMAGETASKS    OVA Disk Image  import-ami-XXXXXXXX 28  active  converting
SNAPSHOTDETAILS 771973632.0 VMDK
USERBUCKET  disk-image-file-bucket  disk-image-file.ova
IMPORTIMAGETASKS    OVA Disk Image  import-ami-XXXXXXXX 30  active  updating
SNAPSHOTDETAILS 771973632.0 VMDK
USERBUCKET  disk-image-file-bucket  disk-image-file.ova
IMPORTIMAGETASKS    OVA Disk Image  import-ami-XXXXXXXX 37  active  updating
SNAPSHOTDETAILS 771973632.0 VMDK
USERBUCKET  disk-image-file-bucket  disk-image-file.ova
IMPORTIMAGETASKS    x86_64  OVA Disk Image  import-ami-XXXXXXXX BYOL    Linux   59  active  booting
SNAPSHOTDETAILS /dev/sda1   771973632.0 VMDK
USERBUCKET  disk-image-file-bucket  disk-image-file.ova
IMPORTIMAGETASKS    x86_64  OVA Disk Image  ami-XXXXXXXX    import-ami-XXXXXXXX BYOL    Linux   completed
SNAPSHOTDETAILS /dev/sda1   771973632.0 VMDK    snap-XXXXXXXXXXXXXXXXX
USERBUCKET  disk-image-file-bucket  disk-image-file.ova

watch コマンドを使ってもいいかもしれない。