[OCI]goofysを利用してAWS S3からOCIのオブジェクト・ストレージに直接ファイルをコピーしてデータ移行してみた

# はじめに
オブジェクト・ストレージをファイルシステムとしてマウントできる[goofys](https://github.com/kahing/goofys)を利用して、AWSのS3バケットからOCIオブジェクト・ストレージに直接データを移行してみました。

この方法であれば、S3バケット内のファイルを一度どこかにダウンロードしてからアップロードする必要がないため、中間ストレージが不要になります。

安定した環境が必要な場合は、S3側に[AWS Storage Gateway](https://docs.aws.amazon.com/ja_jp/storagegateway/latest/userguide/WhatIsStorageGateway.html)、OCIオブジェクト・ストレージ側に[Oracle Cloud Infrastructure Storage Gateway](https://docs.cloud.oracle.com/ja-jp/iaas/Content/StorageGateway/Concepts/storagegatewayoverview.htm)を使用することをお勧めします。


# 事前準備
AWS側（データ移行元）
・S3バケット（ここでは**from-aws-bucket**という名前です）
・S3バケットにアクセスできるユーザのアクセスキーとシークレットキー
OCI（データ移行先）
・オブジェクト・ストレージ・バケット（ここでは**oci**という名前です）
・オブジェクト・ストレージ・バケットにアクセスできるユーザの顧客秘密キー（アクセス・キーと秘密キー）
・インターネットアクセスが可能なコンピュート・インスタンス（今回はOSとしてOracle Linux 7.9を使用）

# 1. goofysのインストールと設定
SSHクライアントからコンピュート・インスタンスにopcユーザでログインします。

goofysはGo、fuseを使用するので、事前にインストールします。

```
sudo yum install -y golang fuse
```

goofysのバイナリをダウンロードします。

```
wget https://github.com/kahing/goofys/releases/latest/download/goofys
```
goofysをパスが通っているディレクトリに移動します。

```
sudo cp goofys /usr/local/bin
```
オーナーをrootに変更し、パーミッションを変更します。

```
sudo chown root:root /usr/local/bin/goofys
sudo chmod 775 /usr/local/bin/goofys
```
goofysが使用する認証情報の設定ファイルを作成します。

```
sudo mkdir -p /root/.aws
sudo vi /root/.aws/credentials
```
```/root/.aws/credentials
[oci]
aws_access_key_id = AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA <- OCIユーザのアクセスキー
aws_secret_access_key = BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB <- OCIユーザの秘密キー

[aws]
aws_access_key_id = CCCCCCCCCCCCCCCCCCCC <- AWSユーザのアクセスキー
aws_secret_access_key = DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD <= AWSユーザのシークレットキー

```
以上でgoofysを使用する準備が整いました。
# 2. goofysによるS3バケットとオブジェクト・ストレージ・バケットのマウント
マウントポイントを作成します。
・**/mnt_o**：OCI オブジェクト・ストレージ・バケット（**oci**）用のマウントポイント
・**/mnt_a**：AWS S3バケット（**from_aws_bucket**）用のマウントポイント

```
sudo mkdir -p /mnt_o
sudo chmod -R 777 /mnt_o
sudo mkdir -p /mnt_a
sudo chmod -R 777 /mnt_a
```
/etc/fstabを編集します。

```
sudo vi /etc/fstab
```
以下の2行をファイルの末尾に追加します。

```/etc/fstab
goofys#oci /mnt_o fuse _netdev,allow_other,--dir-mode=0755,--file-mode=0666,--uid=1000,--gid=1000,--endpoint=https://<ネームスペース>.compat.objectstorage.<OCIリージョン識別子>.oraclecloud.com,--region=<OCIリージョン識別子>,--profile=oci 0 0
goofys#from-aws-bucket /mnt_a fuse _netdev,allow_other,--region=<AWSリージョン識別子>,--profile=aws 0 0
```
mount -aでfstabの内容を反映し、OCIのオブジェクト・ストレージ・バケット **oci** を**/mnt_o**に、AWSのS3バケット **from_aws_bucket** を**/mnt_a**にマウントします。

```
sudo mount -a
```
# 3. S3バケットからオブジェクト・ストレージ・バケットへのデータコピー
AWSのコンソールから、S3バケット **from_aws_bucket** の内容を確認します。
![スクリーンショット 2020-11-17 23.47.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/de3e2981-a3d6-1c14-5d05-873b8338f821.png)
テスト用のPDFファイルが30個入っています。

S3バケット **from_aws_bucket** をマウントした **/mnt_a** の内容を確認します。

```
[opc@iptest /]$ cd /mnt_a
[opc@iptest mnt_a]$ ls -l
total 63990
-rw-r--r--. 1 root root 2183884 Nov 17 14:36 50544 10.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:36 50544 11.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:36 50544 12.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:36 50544 13.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:36 50544 14.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:36 50544 15.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:36 50544 16.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:36 50544 17.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:36 50544 18.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:36 50544 19.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:36 50544 1.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:36 50544 20.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:36 50544 21.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:36 50544 22.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:36 50544 23.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:36 50544 24.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:36 50544 25.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:36 50544 26.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:36 50544 27.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:36 50544 28.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:36 50544 29.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:36 50544 2.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:36 50544 30.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:36 50544 3.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:36 50544 4.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:36 50544 5.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:36 50544 6.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:36 50544 7.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:36 50544 8.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:36 50544 9.pdf
```
S3バケット **from_aws_bucket** の内容が表示されることを確認できました。

では、cpコマンドで **/mnt_a** 内のファイルを **/mnt_o** にコピーしてみます。

```
cp /mnt_a/* /mnt_o
```
コピーが完了したら、オブジェクト・ストレージ・バケット **oci** をマウントした **/mnt_o** の内容を確認します。

```
[opc@iptest mnt_a]$ cd /mnt_o
[opc@iptest mnt_o]$ ls -l
total 63990
-rw-r--r--. 1 root root 2183884 Nov 17 14:39 50544 10.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:39 50544 11.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:39 50544 12.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:39 50544 13.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:39 50544 14.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:39 50544 15.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:39 50544 16.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:39 50544 17.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:39 50544 18.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:39 50544 19.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:39 50544 1.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:39 50544 20.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:39 50544 21.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:39 50544 22.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:40 50544 23.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:40 50544 24.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:40 50544 25.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:40 50544 26.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:40 50544 27.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:40 50544 28.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:40 50544 29.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:40 50544 2.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:40 50544 30.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:40 50544 3.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:40 50544 4.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:40 50544 5.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:40 50544 6.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:40 50544 7.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:40 50544 8.pdf
-rw-r--r--. 1 root root 2183884 Nov 17 14:40 50544 9.pdf
```
**/mnt_a**（＝S3バケット **from_aws_bucket** ）の内容が **/mnt_o** にコピーされました。

OCIのコンソールから、オブジェクト・ストレージ・バケット **oci** の内容を確認します。
![スクリーンショット 2020-11-17 23.45.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/69cfe6bb-d11c-cc48-75bc-2ff030a3c231.png)
S3バケット **from_aws_bucket** の内容がオブジェクト・ストレージ・バケット **oci**にコピーされていることが確認できました。

# まとめ

goofysを使用することで、AWSのS3バケットの内容を一度ダウンロードすることなく、OCIのオブジェクト・ストレージ・バケットに直接コピーしてデータを移行することができました。めでたし、めでたし。

ファイル数やファイルサイズによるパフォーマンスの変化についても、後日確認してみたいと思います。

# 参考情報
・[goofys](https://github.com/kahing/goofys)
・[Amazon S3互換API（OCIオブジェクト・ストレージ）](https://docs.cloud.oracle.com/ja-jp/iaas/Content/Object/Tasks/s3compatibleapi.htm)