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

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

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

# 移行したいサンプルワークロード
![Picture1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387966/c2d39fa0-517d-6cb5-d928-e4cca1daa2b1.png)

# 移行手順
1. 移行元のEBSをEC2にアタッチ
1. 任意のディレクトリ構造を持つダミーデータファイルの作成
1. 移行先のブロック・ボリュームをコンピュート・インスタンスにアタッチ
1. コンピュート・インスタンスでrsyncを実行し、データファイルをEBSからブロック・ボリュームに移行

# 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. 移行先のブロック・ボリュームをコンピュート・インスタンスにアタッチ

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
```

# 4. コンピュート・インスタンスでrsyncを実行し、データファイルをEBSからブロック・ボリュームに移行

rsyncをインストールします。多くのLinuxにはデフォルトでrsyncコマンドがインストールされていますが、インストールされていない場合は以下のコマンドでインストールできます。

```
[root@instance-20240307-1031 opc]# yum install rsync -y
This system is receiving updates from OSMS server.
Last metadata expiration check: 0:12:04 ago on Wed 27 Mar 2024 07:14:07 AM GMT.
Package rsync-3.1.3-19.el8_7.1.x86_64 is already installed.
Dependencies resolved.
Nothing to do.
Complete!
```

OCIコンピュート・インスタンスで下記の`rsync`コマンドを実行して、AWS EBSにあるデータファイル`/dev/databaseTest/db.csv`、`/dev/databaseTest/db.dump`を`/dev/awsEbs`にコピーします。

`/tmp/aws.pem`はAWS EC2にアクセスするSSHクライアントのキーです。
`-avzPR`はオプションのグループで、具体的な意味は以下の通りです：
`-a`：アーカイブモードで同期を行い、すべてのファイル属性を保持します。
`-v`：詳細な出力を表示し、実行中の操作を示します。
`-z`：伝送時にデータを圧縮し、伝送速度を向上させます。
`-P`：`--partial`と`--progress`オプションの組み合わせで、伝送の進捗を表示し、伝送に失敗したファイルの成功部分を保存して、再開の伝送をより速く終わらせます。
`-R`：相対パスを使用します。移行元のフィアルディレクトリがそのまま移行先で自動的に作成されます。
`-e "ssh -i /tmp/aws.pem"`：`rsync`が使用するSSHクライアントを設定します。EC2にアクセスするSSHクライアントの秘密キーファイル`/tmp/aws.pem`で認証を行います。
`ec2-user@57.181.39.193`：EC2のユーザ名`ec2-user`とIPアドレス`13.230.82.88`です。
`:/dev/databaseTest/db*`：EBSのファイルパスです。ここでは、`db`で始まるすべてのファイルを指定します。
`/dev/awsEbs/`：これはOCIコンピュート・インスタンスにアタッチしたブロック・ボリュームのディレクトリです。同期後のファイルをここに保存します。

Rsyncの参考ドキュメント：
https://rsync.samba.org/documentation.html

```
[root@instance-20240307-1031 awsEbs]# rsync -avzPR -e "ssh -i /tmp/aws.pem" ec2-user@13.230.82.88:/dev/databaseTest/db* /dev/awsEbs/
receiving incremental file list
dev/
dev/databaseTest/
dev/databaseTest/db.csv
             48 100%   46.88kB/s    0:00:00 (xfr#1, to-chk=1/4)
dev/databaseTest/db.dump
             55 100%   53.71kB/s    0:00:00 (xfr#2, to-chk=0/4)

sent 74 bytes  received 320 bytes  262.67 bytes/sec
total size is 103  speedup is 0.26
```

最後に、ダウンロードした結果を確認します。AWSからのデータファイルのディレクトリ情報にもそのまま保持します。
```
[root@instance-20240307-1031 opc]# ls -Rl /dev/awsEbs/
/dev/awsEbs/:
total 20
drwxr-xr-x. 3 root root  4096 Mar 27 06:36 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 11 06:29 databaseTest

/dev/awsEbs/dev/databaseTest:
total 8
-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

/dev/awsEbs/lost+found:
total 0
```
# まとめ
`rsync`で任意のディレクトリ構造を持つデータファイルをAmazon EBSからOCIオブジェクト・ストレージに移行する手順を紹介しました。
`rclone`での移行より、AWS S3とOCIオブジェクトストレージを必要とせず、EC2からCompute VMへ直接データの移行を行うことができます。
データ移行の要件がある場合にご参考ください。