【OCI クラウド移行ガイド】Amazon EBSのデータファイルをOCI ブロック・ボリュームに移行する手順「Rclone編」

Amazon EBSに保存された任意のディレクトリ構造を持つデータファイルをrcloneでOCI ブロック・ボリュームに移行する手順を紹介します。

# 前提条件
AWS側：LinuxのEC2、EBSとS3の構築
OCI側：Linuxのコンピュート・インスタンス、ブロック・ボリュームとオブジェクト・ストレージの構築

# 移行したいサンプルワークロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387966/92a9953d-0ba1-8b66-c564-12f0ccf32f7b.png)

# 移行手順
1. 移行元のEBSをEC2にアタッチ
1. 任意のディレクトリ構造を持つダミデータファイルの作成
1. EC2でAWS CLIコメントを実行し、EBSのデータファイルをS3へアップロード
1. 移行先のブロック・ボリュームをコンピュート・インスタンスにアタッチ
1. コンピュート・インスタンスでrcloneを実行し、S3からデータファイルをオブジェクト・ストレージに移動
1. コンピュート・インスタンスでOCI CLIを実行し、データファイルをオブジェクト・ストレージからブロック・ボリュームにダウンロード

# 1. 移行元のEBSをEC2にアタッチ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387966/4efe03e4-96a8-15c0-8c0e-544aea7d36bb.png)

アタッチする対象のEC2を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387966/081e3778-48f8-e825-3c82-51a7c1cf0a3c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387966/86542dba-2a70-9d62-3a19-93dff7656489.png)

# 2. 任意のディレクトリ構造を含めたダミデータファイルの作成

SSHでEC2にログインし、rootユーザーで`fdisk -l`コマンドを使用して、新しいEBSが正常にアタッチされたかどうかを確認します。
ディスク`/dev/xvdg`が表示されます。

``` 
[root@ip-10-1-3-177 ec2-user]# fdisk -l
Disk /dev/xvda: 8 GiB, 8589934592 bytes, 16777216 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 44112016-36E3-4A7E-9EDC-BD3A1CE32D7B

Device       Start      End  Sectors Size Type
/dev/xvda127 22528    24575     2048   1M BIOS boot
/dev/xvda128  2048    22527    20480  10M EFI System

Partition table entries are not in disk order.

Disk /dev/xvdg: 10 GiB, 10737418240 bytes, 20971520 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes 
```

`fdisk /dev/xvdg`コマンドを使用してEBSのパーティションを作成します。`n、p、w`を入力する必要があるため、下記をご参考ください。

```
[root@ip-10-1-3-177 ec2-user]# fdisk /dev/xvdg

Welcome to fdisk (util-linux 2.37.4).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x52ad734c.

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1):
First sector (2048-20971519, default 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-20971519, default 20971519):

Created a new partition 1 of type 'Linux' and of size 10 GiB.

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
```

`fdisk -l`を実行して、パーティションしたディスクの名前を特定します。

```
[root@ip-10-1-3-177 ec2-user]# fdisk -l
省略です。

Disk /dev/xvdg: 10 GiB, 10737418240 bytes, 20971520 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x52ad734c

Device     Boot Start      End  Sectors Size Id Type
/dev/xvdg1       2048 20971519 20969472  10G 83 Linux
```
`mkfs -t ext4 /dev/xvdg1`を実行して、ファイルシステムを構築します。

```
[root@ip-10-1-3-177 ec2-user]# mkfs -t ext4 /dev/xvdg1
mke2fs 1.46.5 (30-Dec-2021)
Creating filesystem with 2621184 4k blocks and 655360 inodes
Filesystem UUID: 2ca13214-41a9-4ef6-a467-88531ace8fc8
Superblock backups stored on blocks:
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
```
また`mkdir /dev/databaseTest`でディレクトリを作成し、`mount /dev/xvdg1 /dev/databaseTest`を実行して、構築したファイルシステムをディレクトリにマウントします。

```
[root@ip-10-1-3-177 ec2-user]# mkdir /dev/databaseTest
[root@ip-10-1-3-177 ec2-user]# mount /dev/xvdg1 /dev/databaseTest
```

最後に`df -h`でマウントした結果を確認し、ダミのテストデータ`db.dump、db.csv`を作成します。

```
[root@ip-10-1-3-177 ec2-user]# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        4.0M  8.0K  4.0M   1% /dev
省略です。
/dev/xvdg1      9.8G   24K  9.3G   1% /dev/databaseTest
```

```
[root@ip-10-1-3-177 dev]# cd /dev/databaseTest
[root@ip-10-1-3-177 databaseTest]# echo "これはダミデータのダンプデータです。" > db.dump
[root@ip-10-1-3-177 databaseTest]# echo "id,name,age" > db.csv
echo "1,山田さん,30" >> db.csv
echo "2,鈴木さん,25" >> db.csv
[root@ip-10-1-3-177 databaseTest]# ll
total 24
-rw-r--r--. 1 root root    48 Mar 11 06:29 db.csv
-rw-r--r--. 1 root root    55 Mar 11 06:28 db.dump
drwx------. 2 root root 16384 Mar 11 06:17 lost+found
```

# 3. EC2でAWS CLIコメントを実行し、EBSのデータファイルをS3にアップロード

まず、AWSコンソール上でアクセスキー（AK）とシークレットキー（SK）を取得します。
例：AKIA4PN25EIKXXXXXXXX、6tyGcTSnTaO6fhsacjutm7z45XfbsVLoXXXXXXXX

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387966/1262e757-5bb6-6705-8823-f600a5fbbe9c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387966/e318fc59-3d2e-f53f-4003-1ece0fa87901.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387966/94261f9c-7cc9-0855-6bf1-60e88cee1e64.png)

下記のコマンドを実行して、AWS CLIをEC2にインストールします。

```
[root@ip-10-1-3-177 ec2-user]# curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 57.4M  100 57.4M    0     0   123M      0 --:--:-- --:--:-- --:--:--  123M
[root@ip-10-1-3-177 ec2-user]# unzip awscliv2.zip
省略です。

[root@ip-10-1-3-177 ec2-user]# sudo ./aws/install
省略です。

```

`aws configure`を実行します。実行中に先ほど取得したアクセスキーID（AK）、シークレットアクセスキー（SK）とリージョン情報`ap-northeast-1`（東京リージョン）を入力します。

```
[ec2-user@ip-10-1-3-177 ~]$ aws configure
AWS Access Key ID [None]: AKIA4PN25EIKXXXXXXXX
AWS Secret Access Key [None]: 6tyGcTSnTaO6fhsacjutm7z45XfbsVLoXXXXXXXX
Default region name [None]: ap-northeast-1
Default output format [None]:
```

下記のコマンドを実行して、データファイルをS3にアップロードします。

```
[ec2-user@ip-10-1-3-177 ~]$ cd /dev/databaseTest/
[ec2-user@ip-10-1-3-177 databaseTest]$ ls
db.csv  db.dump  lost+found
[ec2-user@ip-10-1-3-177 databaseTest]$ aws s3 cp /dev/databaseTest/db.dump s3://sehubtest20240305/dev/databaseTest/
upload: ./db.dump to s3://sehubtest20240305/dev/databaseTest/db.dump
[ec2-user@ip-10-1-3-177 databaseTest]$ aws s3 cp /dev/databaseTest/db.csv s3://sehubtest20240305/dev/databaseTest/
upload: ./db.csv to s3://sehubtest20240305/dev/databaseTest/db.csv
[ec2-user@ip-10-1-3-177 databaseTest]$
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387966/5b0e8a9b-5b05-1c64-50d5-d9a89f120b5e.png)

# 4. 移行先のブロック・ボリュームをコンピュート・インスタンスにアタッチ

OCIコンソールにログインして、ブロック・ボリュームの設定画面を開き、コンピュート・インスタンスにアタッチします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387966/cc752a8c-70ee-8656-4c33-75380e929d47.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387966/0d853216-cd89-addf-7d34-b416a097cd86.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387966/09eb6697-87d1-92ae-fa4a-68f149c82b58.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387966/c01f3e20-8958-bb84-c44c-260b9c0fccd8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387966/526706cb-f6ec-41e5-eb79-9c2ad228b53f.png)

SSHでOCIのコンピュート・インスタンスに接続します。その後EC2と同じく、下記のコマンドを実行して、ブロック・ボリュームのファイルシステムを構築し、移行先のディレクトリ`/dev/databaseTest`にマウントします。

```
[opc@instance-20240307-1031 ~]$ sudo -s
[root@instance-20240307-1031 opc]# fdisk -l
省略です。

Disk /dev/sdc: 51 GiB, 54760833024 bytes, 106954752 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 1048576 bytes
```
```
[root@instance-20240307-1031 opc]# fdisk /dev/sdc
Welcome to fdisk (util-linux 2.32.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x838d1df5.

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1):
First sector (2048-106954751, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-106954751, default 106954751):

Created a new partition 1 of type 'Linux' and of size 51 GiB.

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
```
```
[root@instance-20240307-1031 opc]# fdisk -l
---省略---

Disk /dev/sdc: 51 GiB, 54760833024 bytes, 106954752 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 1048576 bytes
Disklabel type: dos
Disk identifier: 0x838d1df5

Device     Boot Start       End   Sectors Size Id Type
/dev/sdc1        2048 106954751 106952704  51G 83 Linux
```
```
[root@instance-20240307-1031 opc]# mkfs -t ext4 /dev/sdc1
mke2fs 1.46.2 (28-Feb-2021)
Discarding device blocks: done
Creating filesystem with 13369088 4k blocks and 3342336 inodes
Filesystem UUID: c9215b47-2632-4191-a81f-f6369fdedffd
Superblock backups stored on blocks:
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
	4096000, 7962624, 11239424

Allocating group tables: done
Writing inode tables: done
Creating journal (65536 blocks): done
Writing superblocks and filesystem accounting information: done
```
```
[root@instance-20240307-1031 opc]# mkdir /dev/awsEbs
[root@instance-20240307-1031 opc]# mount /dev/sdc1 /dev/awsEbs
[root@instance-20240307-1031 awsEbs]# df -h
Filesystem                  Size  Used Avail Use% Mounted on
---省略---

/dev/sdc1                    50G   24K   48G   1% /dev/awsEbs
```
# 5. コンピュート・インスタンスで`rclone`を実行し、S3からデータファイルをオブジェクト・ストレージに移動
下記のコマンドで`rclone`をインストールします。

```
[root@instance-20240307-1031 opc]# curl https://rclone.org/install.sh | sudo bash
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  4734  100  4734    0     0   5683      0 --:--:-- --:--:-- --:--:--  5683
Archive:  rclone-current-linux-amd64.zip
省略です。

rclone v1.66.0 has successfully installed.
Now run "rclone config" for setup. Check https://rclone.org/docs/ for more details.
```
`/root/.config/rclone`ディレクトリに`rclone.conf`を作成します。
設定にはOCIとAWSのアクセスキーIDとシークレットアクセスキー情報が必要となり、OCIの`access_key_id`と`secret_access_key`は、OCIコンソールで新しく作成するか、既存のものを使用してください。
AWSに関しては、前の手順で既に生成しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387966/6c72cf6a-75f8-0db8-6df4-72ce2cd45dea.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387966/8012b2d2-3857-222c-3510-9cadf5d3256b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387966/d5bcc0ce-7e6e-afa8-6e3d-471317ec73fb.png)

`secret_access_key`です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387966/c14d5830-94bc-fb8d-454c-2fbc41f29de6.png)

`access_key_id`です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387966/c852c329-f731-0045-6661-f5b045b2a153.png)

`rclone.conf`設定ファイルは以下の通りです。`endpoint`の作成方法について、下記のリンクをご参考ください。

OCIオブジェクト・ストレージ専用エンドポイント
https://docs.oracle.com/ja-jp/iaas/Content/Object/Concepts/dedicatedendpoints.htm
```
#########aws##############
[aws]
type = s3
provider = AWS
access_key_id = XXXXXXXX
secret_access_key = XXXXXXXX
region = ap-northeast-1

#############oci################
[oci]
type = s3
provider = Other
access_key_id = XXXXXXXX
secret_access_key = XXXXXXXX
region = ap-tokyo-1
endpoint = https://sehubjapacprod.compat.objectstorage.ap-tokyo-1.oraclecloud.com
※今回はS3からのデータ移行のため、APIタイプ S3互換を選択しています。
```

`rclone`コマンドを実行して、S3のデータをOCIのオブジェクト・ストレージに同期します。

```
[root@instance-20240307-1031 opc]# rclone copy aws:sehubtest20240305/dev/databaseTest/db.csv oci:sehubapac-test/dev/databaseTest -P --transfers=16
Transferred:   	         48 B / 48 B, 100%, 0 B/s, ETA -
Transferred:            1 / 1, 100%
Elapsed time:         0.2s
[root@instance-20240307-1031 opc]# rclone copy aws:sehubtest20240305/dev/databaseTest/db.dump oci:sehubapac-test/dev/databaseTest -P --transfers=16
Transferred:   	         55 B / 55 B, 100%, 0 B/s, ETA -
Transferred:            1 / 1, 100%
Elapsed time:         0.2s
[root@instance-20240307-1031 opc]#
```
オブジェクト・ストレージの画面で階層付きの同期結果を確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387966/5689de41-f7c1-4cc0-e24b-cd55399e225d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387966/aaf8f2ac-7826-1eee-a066-9a92b013273c.png)

# 6. コンピュート・インスタンスでOCI CLIを実行し、データファイルをオブジェクト・ストレージからブロック・ボリュームにダウンロード

OCIコンピュート・インスタンスに`OCI CLI`をインストールします。
```
[root@instance-20240307-1031 opc]# dnf -y install oraclelinux-developer-release-el8
This system is receiving updates from OSMS server.
Waiting for process with pid 13268 to finish.
---省略---

Complete!
[root@instance-20240307-1031 opc]# dnf install python36-oci-cli
This system is receiving updates from OSMS server.
Last metadata expiration check: 0:02:33 ago on Tue 12 Mar 2024 02:59:39 AM GMT.
---省略---

Complete!
```

OCI CLI環境を設定し、OCIコンソール上でAPIキーを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387966/180dc033-c1d6-3460-a9fc-ba969232ee50.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387966/dadaecd6-c729-9ea5-0790-b826a71ab14a.png)

秘密キーをローカルにダウンロードし、「追加」ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387966/b18d6b7b-f094-2a7c-86af-1e54730e151f.png)

追加したAPIキーの「構成ファイルの表示」を選択し、その中の設定内容をOCIコンピュート・インスタンスの`/root/.oci/config`にコピーします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387966/57ff9025-96da-26d3-a8d3-ba71f29bfaf6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387966/c14e9bc5-ed3b-2b77-cd4b-78805f08c524.png)

上記の設定内容にある`key_file`のパスを指定するため、下記のコマンドでローカルにダウンロードした秘密キーをコンピュート・インスタンスにアップロードして、キーファイルの所有者と権限を設定します。

```
% scp -i ssh-key-2022-08-29.key key.pem  opc@150.230.197.23:/home/opc
key.pem     100% 1734    20.8KB/s   00:00
% ssh -i ssh-key-2022-08-29.key opc@150.230.197.23
Activate the web console with: systemctl enable --now cockpit.socket
Last login: Tue Mar 12 05:23:27 2024 from 202.45.129.202
[opc@instance-20240307-1031 ~]$ sudo -s
[root@instance-20240307-1031 opc]# chown root:root key.pem
[root@instance-20240307-1031 opc]# chmod 400 key.pem
[root@instance-20240307-1031 opc]# ll
-r--------. 1 root root 1734 Mar 12 05:24 key.pem
```

設定完了のファイルは下記となります。

```
[root@instance-20240307-1031 .oci]# pwd
/root/.oci
[root@instance-20240307-1031 .oci]# cat config
[DEFAULT]
user=ocid1.user.oc1..aa
fingerprint=c8:77:88:9e:a6:b8:50:97:be:5
tenancy=ocid1.tenancy.oc1..aaaaaaaa
region=ap-tokyo-1
key_file=/home/opc/key.pem
```

下記のコマンドを実行し、オブジェクト・ストレージからデータファイルをコンピュート・インスタンスにダウンロードします。
パラメータの利用方法について、下記をご参考ください。

https://docs.oracle.com/ja-jp/iaas/compute-cloud-at-customer/topics/object/performing-a-bulk-download.htm

```
[root@instance-20240307-1031 awsEbs]# oci os object bulk-download -ns sehubjapacprod -bn sehubapac-test --download-dir / --prefix dev --dest-dir /dev/awsEbs
Downloaded dev/databaseTest/db.dump  [####################################]  100%
Downloaded dev/databaseTest/db.csv  [####################################]  100%

{
  "download-failures": {},
  "downloaded-objects": [
    "dev/databaseTest/db.dump",
    "dev/databaseTest/db.csv"
  ],
  "skipped-objects": []
}
```

ダウンロードした結果を確認します。AWSからのデータファイルの階層情報にもそのまま保持します。

```
[root@instance-20240307-1031 databaseTest]# ls -Rl /dev/awsEbs/
/dev/awsEbs/:
total 20
drwxr-xr-x. 3 root root  4096 Mar 12 06:43 dev
drwx------. 2 root root 16384 Mar 11 09:23 lost+found

/dev/awsEbs/dev:
total 4
drwxr-xr-x. 2 root root 4096 Mar 12 06:43 databaseTest

/dev/awsEbs/dev/databaseTest:
total 8
-rw-r--r--. 1 root root 48 Mar 12 06:43 db.csv
-rw-r--r--. 1 root root 55 Mar 12 06:43 db.dump

/dev/awsEbs/lost+found:
total 0
```

# まとめ
`rclone`で任意のディレクトリ構造を持つデータファイルをAmazon EBSからOCIオブジェクト・ストレージに移行する手順を紹介しました。
rcloneの移行では、データを一度オブジェクトストレージに格納することで、セキュアかつ安全にデータ移行することができます。
データ移行の要件がある場合にご参考ください。