OVAファイルをAMIとして取り込む

「[ステップ 3: イメージとして VM をインポートする - VM Import/Export](http://docs.aws.amazon.com/ja_jp/vm-import/latest/userguide/import-vm-image.html)」に基づいて OVA ファイルをアップロードして AMI にする手順をまとめた。

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

* https://console.aws.amazon.com/s3/ にアクセス
* 「バケットを作成する」ボタンを押下

### ① 名前とリージョンで以下の指定を実施
* 「バケット名」に任意の文字列を入力
* 「リージョン」に適切なリージョン（通常は「アジアパシフィック（東京）」を指定
* 「次へ」ボタンを押下

### ② プロパティの設定
* 必要に応じて設定
* 「次へ」ボタンを押下

### ③ アクセス許可の設定
* （「パブリックアクセス許可を管理」を開き「認証済みの AWS ユーザー」の「読み込み」をチェック）
* 「次へ」ボタンを押下

### ④ 確認
* 「バケットを作成」ボタンを押下

## awscli のインストール
```
brew install awscli
aws configure
```
今回は Mac で作業したので Homebrew でインストール。環境に応じて適宜対応。

## サービスロールの作成
### ポリシーの作成
```bash
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](http://docs.aws.amazon.com/cli/latest/reference/iam/create-role.html) コマンドで `vmimport` というロールを作成する。

### ロールへのポリシーのアタッチ
```bash
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](http://docs.aws.amazon.com/cli/latest/reference/iam/put-role-policy.html) コマンドで上記で作成したロールにポリシーをアタッチする。

## OVA ファイルのアップロード
```bash
aws s3 cp disk-image-file.ova s3://disk-image-file-bucket/
```

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

## OVA ファイルのインポート
```bash
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
```

### ステータスの確認
```bash
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` コマンドを使ってもいいかもしれない。