VMware Cloud on AWS 上の仮想マシンをVM Import/Export で AWS にプライベート移行してみる

## はじめに
VMware vSphere 環境から Amazon EC2 への移行は AWS Application Migration Service (MGN) が現在広く使われているかと思います。

これまで EC2 から VMware Cloud on AWS についての移行について投稿してきました（[関連記事](#関連記事)）が、VMware Cloud on AWS から EC2 への移行についても記事にしていこうと思います！

VMware Cloud on AWS 上の仮想マシンについても MGN を使用して検証されている有用な記事が既に複数あり参考になりますので是非参照下さい。

https://dev.classmethod.jp/articles/vmware-cloud-on-aws-mgn-via-private-network/

https://qiita.com/sanjushi003/items/88b220a4763f3ca79765

今回は、あえて VM Import/Export を使用して VMware Cloud on AWS 上の仮想マシンを EC2 に移行してみたいと思います。

## 構成図
今回の構成図です。Connected VPC 上に予め EC2 インスタンス（以降 Jump host と記載）を一つ用意し、そこから vSphere Client で vCenter Server にアクセスする事でプライベートでの移行を行ってみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441095/a3cb20ac-7ecd-1eb2-8599-baf67f08c096.png)



## やってみる

### 移行対象の仮想マシン
今回はこの2つの仮想マシンを移行してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441095/5ce92c4e-848d-2c7f-7303-7760069cee32.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441095/df9e878f-9f9d-b2b5-ee97-7c418323704c.png)

### 1. vCenter Server FQDN をプライベート IP アドレスに変更
OVF テンプレートをプライベートでダウンロードするために、vCenter Server の FQDN をプライベート IP アドレスに変更します。この変更は VMC コンソールから変更できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441095/091376b1-bd64-fabe-60e8-42d5a4f65c1d.png)



### 2. OVF テンプレートのエクスポート
vCenter Server の FQDN をプライベート IP アドレスに変更しましたので、プライベートで接続できるサーバーから vCenter Server に vSphere Client でアクセスをします。
今回の場合、Connected VPC 上に作成した EC2 インスタンスからアクセスしています。（構成図の Jump host と書いたインスタンスです）

vSphere Clientでアクセス後、仮想マシンの OVF テンプレートのエクスポートを行います。
仮想マシンをシャットダウンした後、[テンプレート] -> [OVF テンプレートのエクスポート] を行います。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441095/c36303e5-919d-ae06-9262-596cb7edb973.png" width="500" />

:::note warn
OVF テンプレートは vSphere Client でアクセスしているインスタンスのローカルディスクにダウンロードされます（今回の場合、Jump host のローカルディスク）。

この為、エクスポートする仮想ディスク分の容量をそのインスタンスで確保する必要があります。
:::

### 3. VMDK ファイルを S3 にアップロード
2 のステップで OVF テンプレートのエクスポートを行うと、VMDK ファイルがダウンロードされます。その VMDK を S3 にアップロードします。

今回は jump host に [AWS CLI](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html) をインストールし、S3 に VMDK をアップロードしています。
```
C:\Users\Administrator>aws s3 cp C:\Users\Administrator\Downloads\linux001-1.vmdk s3://vmimportexport-xxxxxxxxxxxxxx/
```

### 4. 必要な IAM ロールの作成
VM Import/Export には、ユーザーに代わって特定のオペレーションを実行するロールが必要です。
ロールの作成については、以下 VM Import/Export のユーザーガイドの"必要なサービスロール" の部分の手順に従い作成を行いました。

https://docs.aws.amazon.com/ja_jp/vm-import/latest/userguide/required-permissions.html

### 5. イメージのインポート
AWS CLI コマンドの[```import-image```](https://docs.aws.amazon.com/cli/latest/reference/ec2/import-image.html)を使用してイメージをインポートしていきます。

その際にインポートする各種パラメータを定義した```containers.json```というファイルを作成します。

```json
[
    {
      "Description": "Amazon Linux 2",
      "Format": "vmdk",
      "UserBucket": {
          "S3Bucket": "vmimportexport-xxxxxxxxxxxxxx",
          "S3Key": "linux001-1.vmdk"
      }
    }
  ]
```

|Key|Value|
|---|---|
|Description|任意のDescriptionを入力|
|Format|vmdk|
|S3Bucket|vmdkをアップロードしたバケットを指定|
|S3Key|vmdkのファイル名を指定|

containers.jsonを準備後、```import-image```コマンドを使用してインポートを実施します。
```
aws ec2 import-image --description "Amazon Linux 2" --disk-containers file://containers.json
```

Status が completed になるまで待ちます。
```
aws ec2 describe-import-image-tasks
{
    "ImportImageTasks": [
        {
            "Architecture": "x86_64",
            "Description": "Amazon Linux 2",
            "ImageId": "ami-0exxxxxxxxxxxxx",
            "ImportTaskId": "import-ami-0xxxxxxxxxxxxx",
            "LicenseType": "BYOL",
            "Platform": "Linux",
            "SnapshotDetails": [
                {
                    "Description": "Amazonn Linux 2",
                    "DeviceName": "/dev/sda1",
                    "DiskImageSize": 1507321344.0,
                    "Format": "VMDK",
                    "SnapshotId": "snap-07xxxxxxxxxxxxx",
                    "Status": "completed",
                    "UserBucket": {
                        "S3Bucket": "vmimportexport-xxxxxxxxxxxxx",
                        "S3Key": "linux001-1.vmdk"
                    }
                }
            ],
            "Status": "completed",
            "Tags": []
        }
    ]
}
```

インポートが完了すると、AMI が作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441095/5ed247e6-1f02-4401-8ed9-610440e954bc.png)

あとはその AMI からインスタンスを起動するのみです！
Amazon Linux 2、Windows Server 2019 とも問題なく起動でき、セッションマネージャー、Fleet Manager でアクセスできました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441095/d8836d00-3980-a1b8-9cb8-094e16ec93ec.png)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441095/49c4b279-8c5e-ddfc-069f-c1097eab7087.png" width="500" />

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441095/b1a16e5d-6b2d-3081-15ce-dafb194120f4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441095/c3b30dfd-f0ca-2cb3-4ef9-54c36c50ab5b.png)

## まとめ

今回は VM Import/Export を使用して VMware Cloud on AWS 上の仮想マシンを EC2 に移行してみました。
手順自体は、一度 IAM ロールを作成してしまえばシンプルでした。

仮想マシンをシャットダウンしてから、OVF テンプレートのエクスポート -> S3 にアップロード -> インポート処理 -> AMI から EC2 インスタンスを起動という流れになりますので、ダウンタイムが許容される場合は、これも取り得るアプローチになるかもしれません。

## 参考文献

- [AWS VM Import/Export ユーザーガイド](https://docs.aws.amazon.com/ja_jp/vm-import/latest/userguide/what-is-vmimport.html)
 - [VMware Docs: OVF テンプレートのエクスポート](https://docs.vmware.com/jp/VMware-vSphere/7.0/com.vmware.vsphere.vm_admin.doc/GUID-B05A4E9F-DD21-4397-95A1-00125AFDA9C8.html)

## 関連記事

https://qiita.com/mtoyoda/items/a2a0c96196c58d86e14a

https://qiita.com/mtoyoda/items/10e788729af6564b03a7

https://qiita.com/mtoyoda/items/f219a53cac8bb080b44f