VM-Importのやり方まとめ【For Cloud Beginner】

# はじめに
今度使用するソフトウェアをみんなでつっついて検証したい。そんな時に便利なVM-Import/ExportについてIT初学者向けに解説します。
私自身初めて持つ専門領域としてクラウド領域を扱っており、初学者の視点でみなさんのAWSライフを少しでも快適なものにできればと思っています！

# VM-Importの下準備
必要なものは下記になります！
<dl>
    <dt>①S3に入ったVMDKファイル</dt>
        <dd>VM Importしたい仮想マシンのイメージをS3に格納して用意しましょう</dd>
    <dt>②VM Importが使うためのIAMロール</dt>
        <dd>VM Importに権限を渡してあげます！</dd>
    <dt>③VMDKファイルのディスク構成を記述したJSONファイル</dt>
        <dd>JSONファイルで場所の所在とディスク構成を書いてあげます。</dd>
<dl>

# VM-Import実践編
### ①CLIを使えるようにする
下記URLからAWS CLIをダウンロードしましょう！
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html

その後
```
aws configure
```
を入力すると下記のようなログイン情報を求められます。
```
AWS Access Key ID [****************D/jt]:
AWS Secret Access Key [****************D/jt]:
Default region name [ap-northeast-1]:
Default output format [None]:
```
Access Key IDなどはIAMユーザを作成した時にしか表示されないので注意してくださいー！
ログイン情報が正しく入力できたか確認したい時は下記コマンドを実行しましょう！
```
aws sts get-caller-identity
```
正しくログイン出来ていれば"UserID","Account","Arn"が出てくるはずです！

### ②VM Importに渡すIAMロールを作成する
ここではCLIからIAMロールを作成してみます！
```json
{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Effect": "Allow",
         "Principal": { "Service": "vmie.amazonaws.com" },
         "Action": "sts:AssumeRole",
         "Condition": {
            "StringEquals":{
               "sts:ExternalId": "vmimport"
            }
         }
      }
   ]
}
```
上記JSONファイルを作成します。ファイル名は"trust-policy.json"にしました。

ファイルを作成したら下記コマンドを実行してください！
```json
aws iam create-role --role-name [vmimportrole] --assume-role-policy-document file://[trust-policy.jsonのパス]
```
これで、VM ImportはこのIAMロール使ってもいいよ！って引き渡す準備が出来ました。
ちなみに"vmimportrole"は任意の名前を付けてくださいね！これがIAMロール名になります！
次は、実際にどのような権限を持たせるかです！

具体的には下のJSONファイルを用意します！
```
{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Effect": "Allow",
         "Action": [
            "s3:ListBucket",
            "s3:GetBucketLocation"
         ],
         "Resource": [
            "arn:aws:s3:::[VMイメージを格納したS3バケット名]"
         ]
      },
      {
         "Effect": "Allow",
         "Action": [
            "s3:GetObject"
         ],
         "Resource": [
            "arn:aws:s3:::[VMイメージを格納したS3バケット名/*"
         ]
      },
      {
         "Effect": "Allow",
         "Action":[
            "ec2:ModifySnapshotAttribute",
            "ec2:CopySnapshot",
            "ec2:RegisterImage",
            "ec2:Describe*"
         ],
         "Resource": "*"
      }
   ]
}
```
私はこのJSONファイルに"vmrolepolicy.json"の名前を付けました！
```
aws iam put-role-policy --role-name [vmimportrole] --policy-name [vmrolepolicy] --policy-document file://[vmrolepolicy.jsonのパス]
```

お疲れ様でした！ここまででIAMロールの作成は完了です！マネジメントコンソールから作成してももちろん大丈夫ですが、CLIからやると自信つく気がしています(最初出来たとき私はすごく喜びました。IAMロール作っただけなのに...笑)

### ③VM Importを実行！
まずは、実行に先立ってファイルの場所をVMImportに教えるためのJSONを書きます

```[
  {
    "Description": "[任意の名前]",
    "Format": "vmdk",
    "UserBucket": {
        "S3Bucket": "[vmdkファイルを格納したバケット名]",
        "S3Key": "[VMDKファイル名].vmdk"
    }
  }
]
```

書き終えたらいよいよ最後のコマンド実行です！
```
aws ec2 import-image --description "[ひとつ前のJSONファイルの任意の名前]" --disk-containers file://[JSONファイルの場所] --role-name [vmimport用のIAMロール名(vmimportrole)]
```
実行が正常であれば、下記レスポンスが返ってくるはずです！
```
{
    "Status": "active",
    "Description": "任意の名前",
    "Progress": "2",
    "SnapshotDetails": [
        {
            "UserBucket": {
                "S3Bucket": "VMDKファイルを保存したS3の名前",
                "S3Key": "今回のイメージファイル.vmdk"
            },
            "DiskImageSize": 0.0,
            "Format": "VMDK"
        }
    ],
    "StatusMessage": "pending",
    "ImportTaskId": "import-ami-fgzp52v0"
}
```

Progressの所は何％進行しているかを表しています
せっかちな人は下のコマンドを入力してください(笑)進捗が確認できますよ！
```
aws ec2 describe-import-image-tasks --import-task-ids [ImportTaskIdで任意に与えられるID]
```

Importが完了すると、新しいAMIが作成されていつでもEC2から実行できるようになります！

# おわりに
本当はAMIからEC2を立てて、セキュリティグループが...パブリックIPが...とか色々この後残っているかと思いますが、ここまで出来ればあとはそれほど難しくないはずです！
いかがだったでしょうか。特に初学者の方だとCLIから操作することに抵抗がある方もいらっしゃると思います。私自身、初学者の頃に初めてこの一連の流れをCLIから実行出来た時はすごく嬉しかったですし、自信につながった記憶があります！ぜひ一度試されてはいかがでしょうか。
今日はここまで！
～今後ともみなさま良いクラウドライフをお過ごしください～