ローカルの CentOS 6.x の VM を AWS の EC2 にもっていく

# はじめに
ローカルにあるCenOS 6.x の VMWare の VM を AWS の EC2 にもっていく。
レガシーなローカル環境というか、サーバがぼろいので AWS に上げようという話。

AWSCLIを利用してコマンドラインでローカルにある VM を移動する。

# 大まかながれ

1. VMWare の VM をエクスポート (OVF形式)
2. エクスポートした(OVF形式)ファイルを S3 へコピー
3. S3 から EC2 へコピーするロールを作成しポリシーを割り当てる
4. S3へコピーしたファイルを AMI にインポート
5. AMI から EC2 へ登録


# 準備

* AWSCLI が利用できるようになっていること
* S3でバケットが作れること
* AWSCLI でロール作成とポリシー割り当てができるようになっていること
    *  IAM でアクセスID、アクセスキーでアクセスするユーザーにロール作成とポリシー割り当てができるようになっていること



# 手順

## VMWare の VM をエクスポート (OVF形式)
VM を停止させてから行う必要がある。
「ファイル」メニューの「OVFへエクスポート(E)」を選択してファイルを出力する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304109/fd8a4243-39b5-8faa-4282-45f6c9a6e0ff.png)

これを実行すると、以下の3つのファイルが出力される。

* test.mf
* test.ovf
* test.vmdk

## エクスポートした(OVF形式)ファイルを S3 へコピー

### S3 でバケットを作成

「バケットを作成する」をクリック

<img width="400" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304109/29d2e704-4684-9686-f666-15fe9e24081f.png">

バケット名を入力して「次へ」

<img width="400" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304109/5618e246-1171-db4a-d7aa-20a99b0be6e9.png">

特に何もないので、何もしないで「次へ」

<img width="400" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304109/729663fe-0297-ab53-de3e-4c36b2336bb8.png">



移行したらすぐ消すのでパブリックアクセスにしてバケットを作成

<img width="400" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304109/12a2816f-6488-f35f-a229-6362f86419a6.png">


<img width="400" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304109/177d8a14-53df-8471-3277-4b16b0e4f5d0.png">


### バケットへ OVF形式ファイルをコピー

バケットを選択

<img width="400" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304109/9eec5f8b-02b2-0c39-e4e9-ad501a301fda.png">

「アップロード」をクリックして、エクスポートした VM の3つのファイルをアップロードする。

<img width="400" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304109/5eb7ab59-4116-be78-40da-bc24c562afeb.png">

* test.mf
* test.ovf
* test.vmdk

# S3 から EC2 へコピーするロールを作成しポリシーを割り当てる

## ロールの作成

以下の JSONファイルを用意する
```json
{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Effect": "Allow",
         "Principal": { "Service": "vmie.amazonaws.com" },
         "Action": "sts:AssumeRole",
         "Condition": {
            "StringEquals":{
               "sts:Externalid": "vmimport"
            }
         }
      }
   ]
}

上記のJSONファイルを利用し、以下のコマンドを実行する。

```bash
/root/.local/bin/aws iam create-role --role-name vmimport --assume-role-policy-document "file:///tmp/trust-policy.json"
```

もしロールを作成できる権限がなければ以下のようなエラーになる

```bash
An error occurred (AccessDenied) when calling the PutRolePolicy operation: User: arn:aws:iam::105252861779:user/cliadmin is not authorized to perform:
```

コマンド実行が正常に終われば以下のようなものが表示される

```bash
ROLE    arn:aws:iam::105252861779:role/vmimport 2020-07-15T10:36:22Z    /       AROARRAMPG5J2MR35GNQ3   vmimport
ASSUMEROLEPOLICYDOCUMENT        2012-10-17
STATEMENT       sts:AssumeRole  Allow
STRINGEQUALS    vmimport
PRINCIPAL       vmie.amazonaws.com
```

## ポリシーの割り当て

以下のJSONファイルを用意する。「バケット名」に作成したバケット名を記載する。

```json
{
   "Version":"2012-10-17",
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "s3:GetBucketLocation",
            "s3:GetObject",
            "s3:ListBucket"
         ],
         "Resource":[
            "arn:aws:s3:::バケット名",
            "arn:aws:s3:::バケット名/*"
         ]
      },
      {
         "Effect":"Allow",
         "Action":[
            "ec2:ModifySnapshotAttribute",
            "ec2:CopySnapshot",
            "ec2:RegisterImage",
            "ec2:Describe*"
         ],
         "Resource":"*"
      }
   ]
}
```

上記のJSONファイルを利用して以下のコマンドを実行してロールにポリシーを割り当てる。

```bash
 /root/.local/bin/aws iam put-role-policy --role-name vmimport --policy-name vmimport --policy-document "file:///tmp/role-policy.json"
```

もしロールを作成できる権限がなければ以下のようなエラーになる

```bash
An error occurred (AccessDenied) when calling the PutRolePolicy operation: User: arn:aws:iam::105252861779:user/cliadmin is not authorized to perform:
```

# S3へコピーしたファイルを AMI にインポート

以下のJSONファイルを用意する。

```bash
[
  {
    "Description": "First disk",
    "Format": "vmdk",
    "UserBucket": {
        "S3Bucket": "バケット名",
        "S3Key": "フォルダ名/インポート対象VMDK(test.vmdk)"
    }
  }
]
```

上記で用意したJSONファイルを利用し以下のコマンドを実行する

```bash
/root/.local/bin/aws ec2 import-image --description "vmec2mig" --disk-containers "file:///tmp/containers.json"
```

ロールがない、ロールにポリシーが割り当たっていないと以下のエラーになる

```bash
An error occurred (InvalidParameter) when calling the ImportImage operation: The service role vmimport provided does not exist or does not have sufficient permissions
```

実行できるとインポートが始まるのでしばらく待つ

```bash
/root/.local/bin/aws ec2 import-image --description "vmec2mig" --disk-containers "file:///tmp/containers.json"
vmec2mig        import-ami-0746702dcd8ae0ba4    1       active  pending
SNAPSHOTDETAILS First disk      0.0     VMDK
USERBUCKET      testlink-vm     TestLink_CentOS6.6_extl0104ce6-disk1.vmdk
```

```bash
/root/.local/bin/aws ec2 describe-import-image-tasks --import-task-ids import-ami-0746702dcd8ae0ba4
IMPORTIMAGETASKS        vmec2mig        import-ami-0746702dcd8ae0ba4    4       active  validated
```

```bash
# /root/.local/bin/aws ec2 describe-import-image-tasks --import-task-ids import-ami-0746702dcd8ae0ba4
IMPORTIMAGETASKS        x86_64  vmec2mig        ami-019afc5f9ae98ab03   import-ami-0746702dcd8ae0ba4    BYOL    Linux   completed
```

ステータスが completed になれば AMI に使いされている



# AMI から EC2 へ登録

登録した AMI を選択し「アクション」で「起動」をクリックすると EC2 で起動する。