AWS EC2インスタンスをOracle Cloudに移行

このシリーズの他の記事は、[オラクル・クラウドの個人ブログ一覧 ](https://qiita.com/letian/items/10152a4fec813c1b7d98)からご覧いただけます。

# 初めに
利用中のクラウドから、他クラウドにリソースを移行したい時、インスタンスの移行は重要なタスクになります。<font color=orange>AWS</font> EC2インスタンスを<strong>OCI</strong> (Oracle Cloud Infrastructure) に手動で移行する方法を紹介します。少しお役に立てれば幸いです。

__事前準備__
EC2インスタンス（<font color=blue>停止中</font>の状態）(この例は、"Red Hat Linux 8"を利用する。)
S3バケット （インスタンス・イメージ格納用）
S3バケットに<font color=blue>ACL</font>をアタッチ (方法はSTEP-1にある。)
<font color=blue>rclone</font>のインストールとセットアップ (AWS/OCIに接続済)

__ステップ__
[1. EC2インスタンスをS3にエクスポートする (AWS側)](#1-ec2インスタンスをs3にエクスポートする-aws側)
[2. AWS S3からOCIオブジェクト・ストレージにEC2のイメージをコピー](#2-aws-s3からociオブジェクトストレージにec2のイメージをコピー)
[3. OCIオブジェクト・ストレージからイメージをインポートする (OCI側)](#3-ociオブジェクトストレージからイメージをインポートする-oci側)
[4. インポートされたイメージでOCIインスタンスを作成 (OCI側)](#4-インポートされたイメージでociインスタンスを作成-oci側)

STEP-1は、AWS側で実施します。STEP-3とSTEP-4は、OCI側で実施します。
STEP-2の実施場所は、クラウド/On-Pか、どこでもOKです。(この例は、"OCI Cloud Shell"で実施します。)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/f393509f-3e2e-8d90-d4c7-ec71370b9ec4.png)

# 1. EC2インスタンスをS3にエクスポートする (AWS側)
インスタンスを停止してから、「AWS CLI」のコマンドを実行します。
この例では「AWS CloudShell」を使用します。 (「AWS CLI」は実装済)

エクスポートタスクは「AWS CLI」でのみ実行できます。（AWSコンソールからはできません。）

__エクスポートのコマンド例__
`aws ec2 create-instance-export-task --description 'AWS-To-OCI' --instance-id <instance_id> --target-environment vmware --export-to-s3-task DiskImageFormat=vmdk,ContainerFormat=ova,S3Bucket=aws-2-oci`

__パラメータの意味__
`--description`: 任意の内容を入力。 (最大255文字)
`--instance-id`: EC2インスタンスのID
`--target-environment`: 可能な値は、"citrix"、"vmware"および"microsoft"です。 ("<font color=blue>vmware</font>"を指定)

`DiskImageFormat`: イメージのフォーマット。(OCIでサポートされている"<font color=blue>vmdk</font>"フォーマットを指定。)
`ContainerFormat`: ディスクイメージとメタデータを組み合わせるために使用されるフォーマット。("<font color=blue>ova</font>"を指定.)
`S3Bucket`: S3バケット（イメージ格納用）

__以下のエラーが発生した場合__

```
[cloudshell-user@ip-10-0-104-80 ~]$ aws ec2 create-instance-export-task --description 'AWS-To-OCI' --instance-id <instance_id> --target-environment vmware --export-to-s3-task DiskImageFormat=vmdk,ContainerFormat=ova,S3Bucket=aws-2-oci

An error occurred (InvalidParameter) when calling the CreateInstanceExportTask operation: Access denied to the bucket aws-2-oci
[cloudshell-user@ip-10-0-104-80 ~]$ 
```

対策：アクセス制御リスト(ACL)をS3バケットにアタッチする必要があります。 

AWS S3-> Your_Bucket -> Pemissions -> Access control list (ACL) -> Edit
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/87a1f532-d3cf-4159-be0e-aebc6e1ed290.png)
以下のように読み取り/書き込みアクセスを許可します。
「Grantee」で、[AWSドキュメント](https://docs.aws.amazon.com/vm-import/latest/userguide/vmexport.html#vmexport-prerequisites)をご参照いただき、適切なリージョン固有の正規アカウントIDを指定します。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/ccfce4f4-2901-1447-d803-87c6bfbf6059.png)
ACLをS3バケットにアタッチした後、正常にエクスポートできるようになりました。

```
[cloudshell-user@ip-10-0-86-145 ~]$ aws ec2 create-instance-export-task --description 'AWS-To-OCI' --instance-id <instance_id> --target-environment vmware --export-to-s3-task DiskImageFormat=vmdk,ContainerFormat=ova,S3Bucket=aws-2-oci
{
    "ExportTask": {
        "Description": "AWS-To-OCI",
        "ExportTaskId": "export-i-07e203dc1703757fd",
        "ExportToS3Task": {
            "ContainerFormat": "ova",
            "DiskImageFormat": "vmdk",
            "S3Bucket": "aws-2-oci",
            "S3Key": "export-i-07e203dc1703757fd.ova"
        },
        "InstanceExportDetails": {
            "InstanceId": "<instance_id>",
            "TargetEnvironment": "vmware"
        },
        "State": "active"
    }
}
```

__AWSコンソールでの確認__
エクスポートタスクの開始時に、ファイル"vmimportexport_write_verification"が作成されます。
エクスポートタスクが完了すると、ファイル"<font color=blue>\<export_task_id>.ova</font>"が作成されます。
エクスポート時間は、インスタンスのサイズによって異なります。このテストは30分もかかりませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/9c141ee9-1647-6844-0b81-b5ff6f8f7d9a.png)

# 2. AWS S3からOCIオブジェクト・ストレージにEC2のイメージをコピー
コピー方法はたくさんあります。例えば、WEBコンソールか、CLI/SDKでファイルをダウンロード・アップロードします。この例では、「<font color=blue>OCI Cloud Shell</font>」にインストールされる<font color=blue>rclone</font>を利用します。rlconeのインストールとセットアップは、ここで省略します。手順がほしい方は、以下のブログをご参照ください。（インストールとAWS/CLIへの接続方法を含みます。）

https://qiita.com/liu-wei/items/937f8f6b69f7ee25d9c1

__バケット内のイメージファイルを確認__

```shell
liu_wei@cloudshell:~ (ap-tokyo-1)$ rclone listremotes
aws:
oci:
liu_wei@cloudshell:~ (ap-tokyo-1)$ rclone ls aws:aws-2-oci
1253826560 export-i-07e203dc1703757fd.ova
        0 vmimportexport_write_verification
liu_wei@cloudshell:~ (ap-tokyo-1)$ 
```

__AWSからOCIにイメージをコピー__

```sh
liu_wei@cloudshell:~ (ap-tokyo-1)$ rclone --verbose copy aws:aws-2-oci/export-i-07e203dc1703757fd.ova oci:Target_Bucket
2021/10/11 03:52:18 INFO  : export-i-07e203dc1703757fd.ova: Copied (new)
2021/10/11 03:52:18 INFO  : 
Transferred:        1.168Gi / 1.168 GiByte, 100%, 67.478 MiByte/s, ETA 0s
Transferred:            1 / 1, 100%
Elapsed time:        18.2s

liu_wei@cloudshell:~ (ap-tokyo-1)$ rclone ls oci:Target_Bucket
1253826560 export-i-07e203dc1703757fd.ova
liu_wei@cloudshell:~ (ap-tokyo-1)$ 
```

__OCIコンソールからイメージファイルを確認__
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/f9276bae-4db6-d17f-fb73-81559e487e93.png)

__ファイルサイズがなぜ違うと思ったら__
イメージファイルのサイズは、OCIコンソールで<font color=blue>GiB </font>（1 GiB = 1024³ バイト）単位で表示されます。AWSコンソールで表示される<font color=blue>GB</font>単位（1 GB = 1000³ バイト）より少し小さいです。

# 3. OCIオブジェクト・ストレージからイメージをインポートする (OCI側)
Menu -> Compute -> Custom Images -> Import image
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/eded7cb0-c297-34fa-a44e-578b714acb3d.png)
必要な情報を入力し、インポートを開始します。（「準仮想化モード(<font color=blue>Paravirtualized mode</font>)」を選択します。）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/b2fca587-81ee-50ee-fe0f-ae9986a682d2.png" width="600">
「Work requests」画面で状態を確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/94432089-a594-69b4-22a3-facaddee7891.png)
インポート・タスクには12分近くかかりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/8272c6cc-39f6-3fc5-3926-92e30cedc1e5.png)

# 4. インポートされたイメージでOCIインスタンスを作成 (OCI側)
Menu -> Compute -> Instances -> Create Instance -> Change image
「Image source」で、「<font color=blue>Custom images</font>」を選択してから、インポートされたイメージファイルを指定します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/f95b1757-8c4f-9e3a-9273-0d6a08ca01d4.png" width="500">
その他の必要な情報を入力し、作成を開始します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/5eb5dd75-0656-2651-f496-3c73306b7c22.png" width="600">
作成はすぐ完了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/08778210-88a3-81a1-ac8f-da7d3168faf8.png)

__SSH経由で新しいインスタンスに接続する__
ログイン・ユーザーは移行元インスタンスと同じで、デフォルトは「ec2-user」です。秘密キーは、新しいインスタンスを作成する際に使用したもので、移行元インスタンスの秘密キーと違ってもよいです。

```
[ec2-user@imported-instance-from-aws ~]$ pwd
/home/ec2-user
[ec2-user@imported-instance-from-aws ~]$ ll
total 4
-rw-rw-r--. 1 ec2-user ec2-user 4 Oct  8 07:17 this-is-EC2-instance.txt
[ec2-user@imported-instance-from-aws ~]$
```

__エクスポート/インポートの制限事項__
ここまで、インスタンス移行のタスクは完了です。[エクスポート](https://docs.aws.amazon.com/ja_jp/vm-import/latest/userguide/vmexport.html#vmexport-limits)と[インポート](https://docs.oracle.com/ja-jp/iaas/Content/Compute/Tasks/importingcustomimagelinux.htm)にはいくつかの制限がありますので、ご注意ください。(リンクをクリックし、制限事項の詳細をご参照。)

以上

----
__関連記事__
[AzureからWindows VMをOracle Cloudに移行](https://qiita.com/liu-wei/items/8759b15fc741083ad332)
[RcloneでAWS S3からOCIオブジェクト・ストレージにデータをコピー](https://qiita.com/liu-wei/items/937f8f6b69f7ee25d9c1)
[テナンシ間 OCI カスタム・イメージの移行](https://qiita.com/liu-wei/items/e3f734646952bc01becb)
[OCI Cloud Shellにrcloneをインストールする](https://qiita.com/liu-wei/items/1f472a35a9544f5d1a5a)

----
__オフィシャル・ドキュメント__
AWS - VM Import/Export を使用して VM としてインスタンスをエクスポート: [英語](https://docs.aws.amazon.com/vm-import/latest/userguide/vmexport.html) [日本語](https://docs.aws.amazon.com/ja_jp/vm-import/latest/userguide/vmexport.html)
OCI - カスタムLinuxイメージのインポート [英語](https://docs.oracle.com/en-us/iaas/Content/Compute/Tasks/importingcustomimagelinux.htm) [日本語](https://docs.oracle.com/ja-jp/iaas/Content/Compute/Tasks/importingcustomimagelinux.htm)