RcloneでAWS S3からOCIオブジェクト・ストレージにデータをコピー

本ブログは、[オラクル・クラウドの個人ブログ](https://qiita.com/letian/items/10152a4fec813c1b7d98)の1つです。

# 初めに
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/776c2a42-48b9-afc2-e830-63ebc6305333.png", width="600">
AWS S3またはAzure Blobから、Orale Cloudのオブジェクト・ストレージにデータをコピーできますか？答えは<font color="blue">できます。</font>このタスクを完了するには多くの方法がありますが、<font color="blue">Rclone</font>を利用すれば、簡単に実現できます。

[Rclone](https://rclone.org/) は、クラウド・ストレージ上のファイルを管理するコマンドライン・プログラムです。OCI Object Storage、AWS S3、Azure Blob、Google Cloud Storageなど、多くのクラウドベンダーがサポートされています。On-Pからクラウドの間、あるいは異なるクラウド・ストレージ間でデータを簡単に転送できます。複数のクラウド・ベンダーを利用している場合、rcloneを利用すれば、データ転送が楽になります。

では、AWS S3からOCIオブジェクト・ストレージにデータをコピーする方法をご紹介します。

__ステップ__

[1. Rcloneのインストール](#1-rcloneのインストール)
[2. OCI接続用情報の収集 (コピー先)](#2-oci接続用情報の収集-コピー先)
[3. AWS接続用情報の収集 (コピー元)](#3-aws接続用情報の収集-コピー元)
[4. OCI接続の設定 (コピー先)](#4-oci接続の設定-コピー先)
[5. AWS接続の設定 (コピー元)](#5-aws接続の設定-コピー元)
[6. データコピーの実施](#6-データコピーの実施)
[追記：OCIへの接続方法のアップデート](#追記ociへの接続方法のアップデート)

__事前準備__

1. <font color="blue">OCI</font>(Oracle Cloud Infrastructure)およびAWSのクラウドアカウント。
2. Rclone実行用クライアント。 (Linux/Mac/Windowsがサポートされています。ここではLinux7を使用しています。)　HTTPSを使用し、クライアントからソース/ターゲット・クラウドに接続できることを確保してください。物理サーバ/VMか、On-P/Cloudか、構いません。（この例は、OCIにあるComputeインスタンスを利用します。）

# 1. Rcloneのインストール
非常に簡単で、一行のコマンドを実行すればOKです。
詳細なガイドについては、[こちら](https://rclone.org/install/)を確認してください。(他のOSにインストールしたい場合。)

<strong>コマンド</strong>
`curl https://rclone.org/install.sh | sudo bash`

```ruby
[opc@linux7 ~]$ curl https://rclone.org/install.sh | sudo bash
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  4497  100  4497    0     0   4794      0 --:--:-- --:--:-- --:--:--  4794
Archive:  rclone-current-linux-amd64.zip
......
rclone v1.56.0 has successfully installed.
Now run "rclone config" for setup. Check https://rclone.org/docs/ for more details.

[opc@linux7 ~]$
```

# 2. OCI接続用情報の収集 (コピー先)
接続を構成するには、OCIコンソールから下記の情報を収集する必要があります。
アクセス・キー(<font color="blue">Access Key</font>)と秘密キー(<font color="blue">Secret Key</font>)
リージョン識別子(<font color="blue">Region Identifier</font>)
オブジェクト・ストレージ・ネームスペース(<font color="blue">Object Storage Namespace</font>)
APIエンドポイント(<font color="blue">API Endpoint</font>)

<strong>アクセス・キーと秘密キー</strong>
OCIから収集方法に関するドキュメント・リンクは[こちら](https://docs.cloud.oracle.com/ja-jp/iaas/Content/Identity/Tasks/managingcredentials.htm#To4)です。

MENU->Identity & Secruity->Identity->Users->User Details->Customer Secret Keys
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/a8343b96-dd0e-3ae1-9cdb-ef5d5a2dfe16.png" width="600">

名前を入力し、「秘密キーの作成」ボタンをクリックします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/9b85c9a6-fcb2-6a43-11dd-a32128a31949.png" width="500">

「コピー」をクリックして保存します。 （秘密キーは二度と表示されないので、ご注意ください。）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/428dfc0b-005a-5623-34b6-163aaef6bfe0.png" width="500">

作成後、「アクセス・キー」は以下のように表示され、いつでもコピーできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/d46ed12c-2ddd-960e-617e-438ec4262dc1.png)

<strong>リージョン識別子</strong>
メニューバーのリージョン名をクリックし、「リージョンの管理」を選択すると、リージョン識別子が表示されます。この例は東京リージョン(<font color="blue">ap-tokyo-1</font>)を使用しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/3ee31281-020b-91ef-fa41-af05632a1028.png)

<strong>オブジェクト・ストレージ・ネームスペース</strong>
<font color=orange>AWS</font>は初クラウドの方は、特にこれをご注意ください。なぜかと言いますと、AWS S3のバケット名は、グローバル一意で、ネームスペースという概念がないわけです。

MENU->Governance & Administration->Account Management->Tenancy Details
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/d93aac37-86f1-b439-3d3f-b0feee51281b.png)

OCI CLIが既にインストールと設定済なら、`oci os ns get`のコマンドでも簡単にネームスペースを確認できます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/e757ec36-a07b-f13c-42f2-b323c01a1ad6.png", width="400">


<strong>APIエンドポイント</strong>
"Object_Storage_Namespace"と"Region_Identifier"の文字列を収集したものに置き換えて、以下のようにAPIエンドポイントの文字列を作成します。
<font color="blue">https://</font>\<Object_Storage_Namespace><font color="blue">.compat.objectstorage.</font>\<Region_Identifier><font color="blue">.oraclecloud.com</font>

# 3. AWS接続用情報の収集 (コピー元)
<strong>アクセス・キー(Access Key IDとSecret Access Key)</strong>
AWSから収集方法に関するドキュメント・リンクは[こちら](https://docs.aws.amazon.com/ja_jp/general/latest/gr/aws-sec-cred-types.html#access-keys-and-secret-access-keys)です。

My Security Credentials->Access keys (access key ID and secret access key)->Create New Access Key
作成後、キーをコピーして安全な場所に保管してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/50adf1f0-3aa7-f249-2f1a-6f3296f46457.png)


# 4. OCI接続の設定 (コピー先)

<strong>コマンド</strong>: <font color="blue">rclone config</font>

以下の情報を入力します。
1. 「<font color="blue">n</font>」を入力、接続を新規作成します。
2. 接続名を入力します。（例：「<font color="blue">oci</font>」)
3. 「<font color="blue">4</font>」を選択します。(S3準拠のストレージ・プロバイダー)
4. 「<font color="blue">14</font>」を選択します。(他のS3互換プロバイダー)

```ruby
[opc@linux7 ~]$ rclone config
2021/09/10 12:30:23 NOTICE: Config file "/home/opc/.config/rclone/rclone.conf" not found - using defaults
No remotes found - make a new one
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
name> oci
Type of storage to configure.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value
......
 4 / Amazon S3 Compliant Storage Providers including AWS, Alibaba, Ceph, Digital Ocean, Dreamhost, IBM COS, Minio, SeaweedFS, and Tencent COS
   \ "s3"
......
Storage> 4
Choose your S3 provider.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value
......
14 / Any other S3 compatible provider
   \ "Other"
provider> 14
```
以下の情報を入力します。
5. 「<font color="blue">1</font>」を入力します（次のステップでクレデンシャルを入力することを意味します）。
6. 「<font color="blue">アクセス・キー</font>」を入力します（OCIコンソールから作成された）。
7. 「<font color="blue">秘密キー</font>」を入力します（OCIコンソールから作成された）。
8. リージョン識別子を入力します。（例：「<font color="blue">ap-tokyo-1</font>」)
9. 「<font color="blue">APIエンドポイント</font>」を入力します。

```ruby
Get AWS credentials from runtime (environment variables or EC2/ECS meta data if no env vars).
Only applies if access_key_id and secret_access_key is blank.
Enter a boolean value (true or false). Press Enter for the default ("false").
Choose a number from below, or type in your own value
 1 / Enter AWS credentials in the next step
   \ "false"
 2 / Get AWS credentials from the environment (env vars or IAM)
   \ "true"
env_auth> 1
AWS Access Key ID.
Leave blank for anonymous access or runtime credentials.
Enter a string value. Press Enter for the default ("").
access_key_id> Your_Access_Key
AWS Secret Access Key (password)
Leave blank for anonymous access or runtime credentials.
Enter a string value. Press Enter for the default ("").
secret_access_key> Your_Secret_Key
Region to connect to.
Leave blank if you are using an S3 clone and you don't have a region.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value
 1 / Use this if unsure. Will use v4 signatures and an empty region.
   \ ""
 2 / Use this only if v4 signatures don't work, e.g. pre Jewel/v10 CEPH.
   \ "other-v2-signature"
region> ap-tokyo-1
Endpoint for S3 API.
Required when using an S3 clone.
Enter a string value. Press Enter for the default ("").
endpoint> https://your_namespace.compat.objectstorage.ap-tokyo-1.oraclecloud.com
```

以下の情報を入力し、設定を完了します。
10. 「location_constraint」のプロンプトが表示されたら、<font color="blue">Enterキー</font>を押します。 (デフォルト)
11. ACLに<font color="blue">「1」(プライベート)</font>を入力します。(デフォルト)
12. もっと詳細な設定が必要ない場合は、「n」を入力します。(デフォルト)
13. 「y」を入力して確認します。(デフォルト)

```ruby
Location constraint - must be set to match the Region.
Leave blank if not sure. Used when creating buckets only.
Enter a string value. Press Enter for the default ("").
location_constraint>
Canned ACL used when creating buckets and storing or copying objects.
......
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value
 1 / Owner gets FULL_CONTROL. No one else has access rights (default).
   \ "private"
......
acl> 1
Edit advanced config?
y) Yes
n) No (default)
y/n> n
--------------------
[oci]
type = s3
provider = Other
access_key_id = Your_Access_Key
secret_access_key = Your_Secret_Key
region = ap-tokyo-1
endpoint = https://your_namespace.compat.objectstorage.ap-tokyo-1.oraclecloud.com
acl = private
--------------------
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d> y
Current remotes:

Name                 Type
====                 ====
oci                  s3
```

ここまで、OCI接続の設定は完了です。接続可否を確認します。
<strong>OCI接続の確認</strong>
すべてのバケットを一覧表示します。
<strong>コマンド</strong>: <font color="blue">rclone lsd \<remote:></font>
リモート名の末尾に<font color="blue">":"</font>があることに注意してください。

```
[opc@linux7 ~]$ rclone lsd oci:
          -1 2021-09-10 14:47:45        -1 Target_Bucket
[opc@linux7 ~]$
```

# 5. AWS接続の設定 (コピー元)

<strong>コマンド</strong>: <font color="blue">rclone config</font>

以下の情報を入力します。
1. 「<font color="blue">n</font>」を入力、接続を新規作成します。
2. 接続名を入力します。（例：「<font color="blue">aws</font>」)
3. 「<font color="blue">4</font>」を選択します。(S3準拠のストレージ・プロバイダー)
4. 「<font color="blue">1</font>」を選択します。(AWS S3)

```ruby
[opc@linux7 ~]$ rclone config
Current remotes:

Name                 Type
====                 ====
oci                  s3

e) Edit existing remote
n) New remote
d) Delete remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
e/n/d/r/c/s/q> n
name> aws
Type of storage to configure.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value
......
 4 / Amazon S3 Compliant Storage Providers including AWS, Alibaba, Ceph, Digital Ocean, Dreamhost, IBM COS, Minio, SeaweedFS, and Tencent COS
   \ "s3"
......
Storage> 4
Choose your S3 provider.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value
 1 / Amazon Web Services (AWS) S3
   \ "AWS"
......
provider> 1
```

以下の情報を入力します。
5. 「<font color="blue">1</font>」を入力します（次のステップでクレデンシャルを入力することを意味します）。
6. 「<font color="blue">アクセス・キー</font>」を入力します（AWSコンソールから作成された）。
7. 「<font color="blue">秘密キー</font>」を入力します（AWSコンソールから作成された）。
8. リージョンを選択します。（東京リージョンの場合、「<font color="blue">ap-northeast-1</font>」となります。)

```ruby
Get AWS credentials from runtime (environment variables or EC2/ECS meta data if no env vars).
Only applies if access_key_id and secret_access_key is blank.
Enter a boolean value (true or false). Press Enter for the default ("false").
Choose a number from below, or type in your own value
 1 / Enter AWS credentials in the next step
   \ "false"
 2 / Get AWS credentials from the environment (env vars or IAM)
   \ "true"
env_auth> 1
AWS Access Key ID.
Leave blank for anonymous access or runtime credentials.
Enter a string value. Press Enter for the default ("").
access_key_id> Your_Access_Key
AWS Secret Access Key (password)
Leave blank for anonymous access or runtime credentials.
Enter a string value. Press Enter for the default ("").
secret_access_key> Your_Secret_Key
Region to connect to.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value
......
   / Asia Pacific (Tokyo) Region
14 | Needs location constraint ap-northeast-1.
   \ "ap-northeast-1"
......
region> ap-northeast-1
```

他の設定にはデフォルトのオプション（<font color="blue">Enterキー</font>を押す）を使用しますが、ここでは省略します。
設定の最後は、次のようになります。

```ruby
Edit advanced config?
y) Yes
n) No (default)
y/n> n
--------------------
[aws]
type = s3
provider = AWS
access_key_id = Your_Access_Key
secret_access_key = Your_Secret_Key
region = ap-northeast-1
--------------------
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d> y
Current remotes:

Name                 Type
====                 ====
aws                  s3
oci                  s3
```

これで、ソース/ターゲット・クラウドへの接続が正常に構成されました。以下のコマンドで接続を確認できます。

<strong>AWS接続の確認</strong>
<strong>Command</strong>:
<font color="blue">rclone listremotes</font>  -  設定ファイルから利用可能なすべてのリモートを一覧表示します。
<font color="blue">rclone lsd \<remote:></font> -  バケット一覧を表示します。 (":"を忘れずに)
<font color="blue">rclone ls \<remote:path></font> -  指定されたバケット内のすべてのオブジェクトを一覧表示します。

```ruby
[opc@linux7 ~]$ rclone listremotes
aws:
oci:
[opc@linux7 ~]$ rclone lsd aws:
          -1 2021-09-10 15:02:49        -1 mysourcebucket001
[opc@linux7 ~]$ rclone ls aws:mysourcebucket001
      747 tmp1.txt
      257 tmp2.txt
     3346 tmp3.txt
    10509 tmp4.txt
     1572 tmp5.txt
      933 tmp6.txt
     1080 tmp7.txt
     1232 tmp8.txt
     1233 tmp9.txt
[opc@linux7 ~]$
```

接続情報は、rclone.confという設定ファイルに保存されます。
__rclone.confの格納先__
Windowsの場合：`%APPDATA%/rclone/rclone.conf`
その以外：`~/.config/rclone/rclone.conf`

# 6. データコピーの実施

__コピー前:__
現在、ターゲットバケットには何もない状態です。

```
[opc@linux7 ~]$ rclone ls oci:Target_Bucket
[opc@linux7 ~]$
```

__コピー用コマンド:__
<font color="blue">rclone copy source:sourcepath dest:destpath</font>

必要に応じてフラグ（オプション）を追加できます。
--verbose  - 出力結果に多くのメッセージを出すように。
--dry-run  - 何もコピーせずにテストだけをする。
-P/--progress - リアルタイムの転送統計を表示するフラグ。
--max-age 24h - 最近変更された（24時間）すべてのファイルをコピーする

"rclone copy"コマンドの詳細を知りたい方は、こちらの[マニュアル](
https://rclone.org/commands/rclone_copy/) をご確認ください。

__コマンドの出力結果:__

```ruby
[opc@linux7 ~]$ rclone --verbose copy aws:mysourcebucket001 oci:Target_Bucket
2021/09/12 12:51:09 INFO  : tmp2.txt: Copied (new)
2021/09/12 12:51:09 INFO  : tmp1.txt: Copied (new)
2021/09/12 12:51:09 INFO  : tmp6.txt: Copied (new)
2021/09/12 12:51:09 INFO  : tmp4.txt: Copied (new)
2021/09/12 12:51:09 INFO  : tmp5.txt: Copied (new)
2021/09/12 12:51:09 INFO  : tmp3.txt: Copied (new)
2021/09/12 12:51:09 INFO  : tmp7.txt: Copied (new)
2021/09/12 12:51:09 INFO  : tmp8.txt: Copied (new)
2021/09/12 12:51:09 INFO  : tmp9.txt: Copied (new)
2021/09/12 12:51:09 INFO  :
Transferred:       20.419Ki / 20.419 KiByte, 100%, 0 Byte/s, ETA -
Transferred:            9 / 9, 100%
Elapsed time:         0.4s

[opc@linux7 ~]$
```

__コピー後:__
これで、ソースバケットのデータがコピーされました。

```ruby
[opc@linux7 ~]$ rclone ls oci:Target_Bucket
      747 tmp1.txt
      257 tmp2.txt
     3346 tmp3.txt
    10509 tmp4.txt
     1572 tmp5.txt
      933 tmp6.txt
     1080 tmp7.txt
     1232 tmp8.txt
     1233 tmp9.txt
[opc@linux7 ~]$
```
以上です。

# 追記：OCIへの接続方法のアップデート
追記日： 2023/4/21

OCIへの接続を立てる時、従来の「S3準拠のストレージ・プロバイダー」以外、OCI Nativeの設定方法も可能になりました。

<strong>ストレージのタイプ</strong>を選択する時、次のように、「<font color=blue>34</font>」(OCI Object Storage)を指定してください。
```ruby
[opc@linux8 ~]$ rclone config
2023/04/21 13:49:27 NOTICE: Config file "/home/opc/.config/rclone/rclone.conf" not found - using defaults
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n

Enter name for new remote.
name> oci

Option Storage.
Type of storage to configure.
Choose a number from below, or type in your own value.
......
34 / Oracle Cloud Infrastructure Object Storage
   \ (oracleobjectstorage)
......
Storage> 34
```

認証方法は、次のようにいくつかを指定できます。今回は「<font color=blue>2</font>」(<strong>config</strong>ファイルを利用)を例にして説明します(このconfigファイルは、<strong>OCI CLI</strong>にも利用できます)。
```ruby
Option provider.
Choose your Auth Provider
Choose a number from below, or type in your own string value.
Press Enter for the default (env_auth).
 1 / automatically pickup the credentials from runtime(env), first one to provide auth wins
   \ (env_auth)
   / use an OCI user and an API key for authentication.
 2 | you'll need to put in a config file your tenancy OCID, user OCID, region, the path, fingerprint to an API key.
   | https://docs.oracle.com/en-us/iaas/Content/API/Concepts/sdkconfig.htm
   \ (user_principal_auth)
   / use instance principals to authorize an instance to make API calls.
 3 | each instance has its own identity, and authenticates using the certificates that are read from instance metadata.
   | https://docs.oracle.com/en-us/iaas/Content/Identity/Tasks/callingservicesfrominstances.htm
   \ (instance_principal_auth)
 4 / use resource principals to make API calls
   \ (resource_principal_auth)
 5 / no credentials needed, this is typically for reading public buckets
   \ (no_auth)
provider> 2
```

必要な情報を入力します。
- オブジェクト・ストレージ・ネームスペース：[STEP-2](#2-oci接続用情報の収集-コピー先)で取得したもの
- Compartment OCID: バケットの置き場所
- リージョン識別子：[STEP-2](#2-oci接続用情報の収集-コピー先)で取得したもの
- APIエンドポイント：デフォルトでよい
- configファイルの場所：デフォルトでよい (~/.oci/config)
- プロファイル：デフォルトでよい

```ruby
Option namespace.
Object storage namespace
Enter a value.
namespace> <Your_Object_Storage_Namespace>

Option compartment.
Object storage compartment OCID
Enter a value.
compartment> <Your_CompartmentOcid>

Option region.
Object storage Region
Enter a value.
region> <Your_Region_ID>

Option endpoint.
Endpoint for Object storage API.
Leave blank to use the default endpoint for the region.
Enter a value. Press Enter to leave empty.
endpoint>

Option config_file.
Path to OCI config file
Choose a number from below, or type in your own string value.
Press Enter for the default (~/.oci/config).
 1 / oci configuration file location
   \ (~/.oci/config)
config_file>

Option config_profile.
Profile name inside the oci config file
Choose a number from below, or type in your own string value.
Press Enter for the default (Default).
 1 / Use the default profile
   \ (Default)
config_profile>

Edit advanced config?
y) Yes
n) No (default)
y/n> n
```

設定内容を確認した上、保存します。
```ruby
Configuration complete.
Options:
- type: oracleobjectstorage
- provider: user_principal_auth
- namespace: <Your_Object_Storage_Namespace>
- compartment: <Your_CompartmentOcid>
- region: <Your_Region_ID>
Keep this "oci" remote?
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d> y
```

__OCI構成ファイル__
configファイルを用意して、`~/.oci/config`に保存します。
ファイル作成方法の詳細は、次の記事をご参照ください。
[「OCIカスタム・メトリックでディスク使用率を監視」](https://qiita.com/liu-wei/items/3f5593eab06c5885a83a)の事前準備

<strong>OCI接続の確認</strong>
すべてのバケットを一覧表示します。
<strong>コマンド</strong>: <font color="blue">rclone lsd \<remote:></font>

```
[opc@linux8 ~]$ rclone lsd oci:
          -1 2021-09-10 14:47:45        -1 Target_Bucket
[opc@linux8 ~]$
```

----
__改訂歴__
2021年9月：初版作成
2023年4月：OCIへの接続方法のアップデート

----
__関連記事__
[オラクル・クラウドの個人ブログ一覧](https://qiita.com/liu-wei/items/10152a4fec813c1b7d98)
[AWS S3からOracle DBにデータを導入する](https://qiita.com/liu-wei/items/2ed58265519531d09e97)
[RcloneでAzure BlobからOCIオブジェクト・ストレージにデータをコピー](https://qiita.com/liu-wei/items/4c781712e989d34aced7)
[OCI Cloud Shellにrcloneをインストールする](https://qiita.com/liu-wei/items/1f472a35a9544f5d1a5a)