OCIオブジェクトストレージのファイルを他テナンシにコピーする方法

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

__構成図__
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/5b6931bb-61ba-b04b-a862-4e02484e3cd3.png", width="450">

__目次__
- [方法１- OCI内部でオブジェクトをコピーする](#方法１--oci内部でオブジェクトをコピーする)
  - [1-1. IAMポリシーの作成](#1-1-iamポリシーの作成)
  - [1-2. 宛先テナンシのネームスペースを取得する](#1-2-宛先テナンシのネームスペースを取得する)
  - [1-3. OCIコンソールでオブジェクトをコピーする方法](#1-3-ociコンソールでオブジェクトをコピーする方法)
  - [1-4. OCI-CLIでオブジェクトをコピーする方法](#1-4-oci-cliでオブジェクトをコピーする方法)
- [方法２- サードパーティー・ツールの利用](#方法２--サードパーティーツールの利用)
  - [コマンドラインツール - Rclone](#コマンドラインツール---rclone)

# 方法１- OCI内部でオブジェクトをコピーする
## 1-1. IAMポリシーの作成
__1-1-1. ソース・テナンシ側__
__a) オブジェクト・ストレージ・サービスをコピー対象を操作するため__
テナンシレベルで指定する場合：（ルート・コンパートメントの下に作成する）
```
Allow service objectstorage-ap-tokyo-1 to manage object-family in tenancy
```

コンパートメントレベルで指定する場合：
```
Allow service objectstorage-ap-tokyo-1 to manage object-family in compartment <Compartment_Name>
```
もしこのポリシーが漏れますと、オブジェクトのコピー画面に、IAMポリシーがチェックされた結果は、次のように表示されます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/08561690-810f-040f-1b62-55b12f548ebb.png", width="500">

__b) 宛先テナンシのオブジェクト・ストレージにアクセスするため__
作成場所：<strong>ルート</strong>・コンパートメント
任意のテナンシ内のすべてのオブジェクト・ストレージ・リソースに対してすべての操作を実行することを承認する例：
```
Endorse group StorageAdmins to manage object-family in any-tenancy 
```

宛先テナンシのみのオブジェクト・ストレージ・リソースを管理することを承認する例：
```
Define tenancy DestinationTenancy as ocid1.tenancy.oc1..<unique_ID>
Endorse group StorageAdmins to manage object-family in tenancy DestinationTenancy
```

__1-1-2. 宛先テナンシ側__
作成場所：<strong>ルート</strong>・コンパートメント
ソース・テナンシのIAMグループ`StorageAdmins`がユーザーのテナンシ内のすべてのオブジェクト・ストレージ・リソースに対してすべての操作を実行することを承認する例：
```
Define tenancy SourceTenancy as ocid1.tenancy.oc1..<unique_ID>
Define group StorageAdmins as ocid1.group.oc1..<unique_ID>
Admit group StorageAdmins of tenancy SourceTenancy to manage object-family in tenancy 
```
テナンシ全体ではなく、コンパートメントを限定したい場合、上記最後の行の`in tenancy`を`in compartment <Compartment_Name>`に変更してください。

## 1-2. 宛先テナンシのネームスペースを取得する
__OCIコンソールで取得する方法__
プロファイル・アイコン(右上) → テナンシ
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/e3913071-9e83-80d8-4fe7-8c22206c555b.png", width="350">  
※、一部の古いテナンシでは、ネームスペースとテナンシ名は同じですけど、そもそも別物なので、間違いようにご注意ください。

__OCI-CLIコマンドで取得する方法__
コマンド：`oci os ns get` (パラメータなし)

## 1-3. OCIコンソールでオブジェクトをコピーする方法
<strong>ソース</strong>・テナンシのバケットに入って、オブジェクトのメニューから、コピーをクリックします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/a0aeb0ad-42b4-be02-96c9-6aff4d6e980c.png", width="550">

宛先の情報を入力して、コピーを実施します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/fca241fe-fdf9-b2ef-c90e-b0fafdf4af92.png", width="550">

コピー完了を確認します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/15a687f6-7de6-edca-e872-db6a89ab3762.png", width="400">

宛先テナンシでコピーされたオブジェクトを確認してください（画面を省略）。
## 1-4. OCI-CLIでオブジェクトをコピーする方法
__事前準備__
- [STEP 1-1](#1-1-iamポリシーの作成)と[STEP 1-2](#1-2-宛先テナンシのネームスペースを取得する)は実施済
- OCI-CLIがソース・テナンシに接続している（Cloud Shellの場合はセットアップ済）。

__コピーコマンド__
```bash
$ oci os object copy --bucket-name SourceBucket --source-object-name teraterm-5.0.zip --destination-namespace <Replace_with_dest_namespace> --destination-region ap-tokyo-1 --destination-bucket DestBucket
{
  "opc-work-request-id": "37c6c973-8517-4093-a890-528e3ac9d608"
}
$
```
作業リクエストIDが返されます。リクエストの詳細を確認するために、次のコマンドを実施してください（結果を省略）。
```bash
oci os work-request get --work-request-id 37c6c973-8517-4093-a890-528e3ac9d608
```

# 方法２- サードパーティー・ツールの利用
## コマンドラインツール - Rclone
[Rclone](https://rclone.org/) は、クラウド・ストレージ上のファイルを管理するコマンドライン・プログラムです。OCIを含め、たくさんのクラウドベンダーを対応しています。

__Rclone のダウンロード__
ダウンロードURL: https://rclone.org/downloads/
この例では、Windows版 (Intel/AMD - 64 Bit)を使います。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/489f0687-8b4d-183f-70c1-a69d6d8f76de.png", width="500">

__Rclone のインストール__
Zipファイルを解凍した後、rclone configを実行し、OCIへの接続（ソースと宛先テナンシ両方）をセットアップします。
```bat
C:\rclone-v1.65.0-windows-amd64>rclone config
2023/12/30 15:20:28 NOTICE: Config file "C:\\Users\\opc\\AppData\\Roaming\\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-source

Option Storage.
Type of storage to configure.
Choose a number from below, or type in your own value.
...<中略>...
37 / Oracle Cloud Infrastructure Object Storage
   \ (oracleobjectstorage)
...<中略>...
Storage> 37
```
※、セットアップの詳細は、[こちら](https://qiita.com/liu-wei/items/937f8f6b69f7ee25d9c1#%E8%BF%BD%E8%A8%98oci%E3%81%B8%E3%81%AE%E6%8E%A5%E7%B6%9A%E6%96%B9%E6%B3%95%E3%81%AE%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88)をご参照ください。

__ソースと宛先バケットの確認__
```bat
C:\rclone-v1.65.0-windows-amd64>rclone lsd oci-source:
          -1 2023-12-29 10:06:48        -1 SourceBucket

C:\rclone-v1.65.0-windows-amd64>rclone lsd oci-dest:
          -1 2023-12-29 10:08:05        -1 DestBucket

C:\rclone-v1.65.0-windows-amd64>rclone ls oci-source:SourceBucket
 11188316 teraterm-5.0.zip
 
C:\rclone-v1.65.0-windows-amd64>
```
__オブジェクトをコピーする__
バケット全体をコピーする：
```bat
rclone --verbose copy oci-source:SourceBucket oci-dest:DestBucket
```
指定オブジェクトのみをコピーする：
```bat
rclone --verbose copy oci-source:SourceBucket/teraterm-5.0.zip oci-dest:DestBucket
```
※、`--verbose`を付けると、コピー処理の詳細情報が表示されます。

以上です。

----
__関連記事__
[テナンシ間 OCI カスタム・イメージの移行](https://qiita.com/liu-wei/items/e3f734646952bc01becb)
[OCIテナンシを跨いでプライベート・インスタンスに接続する (Part 4 - 差異比較)](https://qiita.com/liu-wei/items/315e48001b4521c471e3)
[OCIオブジェクト・ストレージへのファイル転送方法のまとめ](https://qiita.com/liu-wei/items/4d955d10aeae4d61eea8)

----
__参考ドキュメント__
テナンシをまたがったオブジェクト・ストレージ・リソースへのアクセス: [英語](https://docs.oracle.com/en-us/iaas/Content/Object/Concepts/accessingresourcesacrosstenancies.htm) [日本語](https://docs.oracle.com/ja-jp/iaas/Content/Object/Concepts/accessingresourcesacrosstenancies.htm)
[OCI Object Storage - Copy Objects from One Tenancy to Another (Doc ID 2915331.1)](https://support.oracle.com/knowledge/Oracle%20Cloud/2915331_1.html)
[OCI-CLI Docs » os » object » copy](https://docs.oracle.com/en-us/iaas/tools/oci-cli/3.37.1/oci_cli_docs/cmdref/os/object/copy.html)
[OCI-CLI Docs » os » work-request » get](https://docs.oracle.com/en-us/iaas/tools/oci-cli/3.37.1/oci_cli_docs/cmdref/os/work-request/get.html)