テナント間でのOCI Compute と block volumeの移行してみた。 

# はじめに
新しいテナントに既存テナントからお引越しする必要がある時に、
Computeリソースはカスタムイメージ化して、新テナント側でimportすれば環境の移行が可能です。
ただ、追加でアタッチしたblock volumeはカスタムイメージに含まれないので、別途対応が必要になります。
追加アタッチしたboot volumeやblockボリュームのテナント間の移行についてはクロステナンシーポリシーを設定して実施ができるということなので、早速実施してみました。


## compute bootイメージの移行
### 作業の流れ
1. 【既存テナント側】 : 既存テナントのcomputeのカスタムイメージ作成
1. 【既存テナント側】1.で作成したカスタムイメージのエクスポート (既存テナントのobject storage上)
1. 【既存テナント側】object storageの事前定義済みURL発行
1. 【新テナント側】カスタムイメージのインポート

こちらは既に記事がありますので詳細は割愛します。

* [OCI] コンピュートのテナント間の移行を試してみる
https://qiita.com/cocotaro0202/items/cc2762acb077d30dfaa5

カスタムイメージのサイズが400GB以内であればこちらの手順で比較的簡単に移行ができます。

今回のメインはカスタムイメージに含まれない追加でアタッチしたblock storageのテナント間の移行をやってみたいと思います。

## computeに追加でアタッチしたblock volumeの移行
### 作業の流れ
作業のイメージはマニュアルのプレイブックにあります。
https://docs.oracle.com/ja/solutions/migrate-data-across-tenancies/index.html#GUID-7B93779F-54DA-4CF5-ADFB-85F8DDF20893

新しいテナント側でテナント間のボリュームの操作を許可するグループを作成し、
そのグループに対してクロステナントポリシーを定義し、oci cli でボリュームのクローンや、バックアップからのリストアを実行します。


* クロステナントポリシーについてのわかりやすい説明はこちらの記事を参照してください。
    * OCIのクロステナンシ・ポリシーを設定してみる
     https://qiita.com/tkonishi/items/3b8848b65bec4f99afef
     


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607565/605c4e23-de84-4075-04d5-8dfc5b842c7f.png)


1. 【新テナント側】 クロステナントの操作を実行を許可するグループ(NewTenancyIdentityGroup)、ユーザの作成
1. 【CLI実行端末】NewTenancyIdentityGroupに属するユーザのCLI構成
1. 【既存テナント側】 クロステナントポリシーの設定(rootコンパートメント)
1. 【新規テナント側】 クロステナントポリシーの設定(rootコンパートメント)
1. 【CLI実行端末】CLIコマンド実行




### (手順1,2)ユーザの作成、作業する端末で、oci cliの構成
 * リージョン間のblock volumeのレプリケーションなどはOCI consoleから簡単にできますが、テナント間は追加のポリシー設定が必要なのと、実行もCLIでしかサポートされていないため、oci cliを利用したことがない方は作業する端末でまず設定をしましょう
 * 設定については以下を参考にしてください
     * OCI チュートリアル： コマンドライン(CLI)でOCIを操作する
https://oracle-japan.github.io/ocitutorials/intermediates/using-cli/

### 3.【既存テナント側】 クロステナントポリシーの設定(rootコンパートメント)
 * 手順1,2ができたら既存テナント側でクロステナントポリシーをrootコンパートメントに対して設定します。
新規テナントのOCIDを**NewTenancy**として定義し、***NewTenancyIdentityGroup***グループに対して許可ポリシー(Admin)を設定します。

 ```: クローンに関するポリシー設定
 Define tenancy NewTenancy as ocid1.tenancy.oc1..(新テナントのOCID) 
Define group NewTenancyIdentityGroup as ocid1.group.oc1.. (新テナントで作成したNewTenancyIdentityGroupのOCID)
Admit group NewTenancyIdentityGroup of tenancy NewTenancy to use volumes in tenancy where ANY { request.operation='CreateVolume', request.operation='GetVolume', request.operation='CreateBootVolume', request.operation='GetBootVolume' }
```

 ```: バックアップからのリストアに関するポリシー設定
Define tenancy NewTenancy as ocid1.tenancy.oc1..(新テナントのOCID) 
Define group NewTenancyIdentityGroup asocid1.group.oc1.. (新テナントで作成したNewTenancyIdentityGroupのOCID)Admit group NewTenancyIdentityGroup of tenancy NewTenancy to read boot-volume-backups in tenancy
Admit group NewTenancyIdentityGroup of tenancy NewTenancy to read volume-backups in tenancy 
Admit group NewTenancyIdentityGroup of tenancy NewTenancy to inspect volumes in tenancy
```

##### 既存テナント側での設定例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607565/4ff06778-a477-7336-6c18-e2533aba2b3e.png)



### 4.【新規テナント側】 クロステナントポリシーの設定(rootコンパートメント)
続いて、新規テナント側で既存テナントのOCIDを**OldTenancy** として定義し、***NewTenancyIdentityGroup***グループに対して承認ポリシー(Endorse)を設定します。

 ```: クローンに関するポリシー設定
Define tenancy OldTenancy as　ocid1.tenancy.oc1..(既存ナントのOCID) 
Endorse group NewTenancyIdentityGroup to use volumes in tenancy OldTenancy where ANY { request.operation = 'CreateVolume', request.operation='GetVolume', request.operation='CreateBootVolume', request.operation='GetBootVolume' }
```


 ```: バックアップからのリストアに関するポリシー設定
Define tenancy OldTenancy as　ocid1.tenancy.oc1..(既存ナントのOCID) 
Endorse group NewTenancyIdentityGroup to read boot-volume-backups in tenancy OldTenancy
Endorse group NewTenancyIdentityGroup to read volume-backups in tenancy OldTenancy
Endorse group NewTenancyIdentityGroup to inspect volumes in tenancy OldTenancy
```

##### 既存テナント側での設定例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607565/07e9c8eb-0201-6e8a-d0de-6d564c7e47ee.png)


### 5.【CLI実行端末】CLIコマンド実行
 ```: ブロックボリュームのクローン実行コマンド
C:\Users\xxxxx\.oci> 
oci bv volume create --region=ap-tokyo-1 --source-volume-id=ocid1.volume.oc1.ap-tokyo-1.(クローン元のブロックボリュームのOCID) --compartment-id=ocid1.tenancy.(クローン先の新テナントのコンパートメントOCID)
```

##### ブロックボリュームのクローン実行結果
```
{
  "data": {
    "auto-tuned-vpus-per-gb": null,
    "autotune-policies": [],
    "availability-domain": "Uqfm:AP-TOKYO-1-AD-1",
    "block-volume-replicas": null,
    "compartment-id": "ocid1.tenancy.oc1..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "defined-tags": {
      "Oracle-Tags": {
        "CreatedBy": "oracleidentitycloudservice/xxxxxxxx",
        "CreatedOn": "2024-04-05T04:18:19.542Z"
      }
    },
    "display-name": "abxhiljr22wkh2me4qdusrvxwidrosb6vc4m3f24kgu4vgci5w5is5wqsvra",
    "freeform-tags": {},
    "id": "ocid1.volume.oc1.ap-tokyo-1.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "is-auto-tune-enabled": false,
    "is-hydrated": false,
    "kms-key-id": null,
    "lifecycle-state": "PROVISIONING",
    "size-in-gbs": 50,
    "size-in-mbs": 51200,
    "source-details": {
      "id": "ocid1.volume.oc1.ap-tokyo-1.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
      "type": "volume"
    },
    "system-tags": {
      "orcl-cloud": {
        "free-tier-retained": "true"
      }
    },
    "time-created": "2024-04-08T03:18:45.372000+00:00",
    "volume-group-id": null,
    "vpus-per-gb": 10
  },
  "etag": "1b1426f94439337479f7c4023fca24c0"
```


##### クローンされたボリュームの確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607565/27d9ce08-a10e-199c-35d1-6c9b29cdda6c.png)

プレイブックに記載されているコマンドで実行する新テナント側では自動的にボリューム名が作成されます。
ocicliのマニュアルを確認して、**--dispaly-name**　オプションをつけると任意の名前で指定できるのでバックアップボリュームからのリストアはオプションをつけてやってみます。

参考)https://docs.oracle.com/en-us/iaas/tools/oci-cli/3.39.1/oci_cli_docs/cmdref/bv/volume/create.html

 ```: ブロックボリュームのバックアップからのリストア実行コマンド
C:\Users\ xxxxxx \.oci> 
oci bv volume create --region=ap-tokyo-1 --volume-backup-id=ocid1.volumebackup.oc1.ap-tokyo-1.(既存テナント内のバックアップブロックボリュームのOCID) --compartment-id=ocid1.tenancy.(クローン先の新テナントのコンパートメントOCID)
--availability-domain=Uqfm:AP-TOKYO-1-AD-1 --display-name mm02_restorevolume(任意の名前)
```

:::note warn
リストア時はAvailability Domainの指定オプションが必須です。
オプション指定に必要な各ADの名前はoci cliの以下コマンドで取得できます。
```
C:\Users\ xxxxxx \.oci> oci iam availability-domain list
{
  "data": [
    {
      "compartment-id": "ocid1.tenancy.oc1..aaaaaaaafkxv3eclq27fx4ozbgbhshqmsxgo3yix66xtxynbdjtacpw7vncq",
      "id": "ocid1.availabilitydomain.oc1..aaaaaaaaaijs56nfsz2usbwsr6k6t5b3do7hns6ib2day6le5scrvvjpeceq",
      "name": "Uqfm:AP-TOKYO-1-AD-1"
    }
  ]
}
```

:::

##### ブロックボリュームのバックアップからのリストア実行
```
{
  "data": {
    "auto-tuned-vpus-per-gb": null,
    "autotune-policies": [],
    "availability-domain": "Uqfm:AP-TOKYO-1-AD-1",
    "block-volume-replicas": null,
    "compartment-id": "ocid1.tenancy.oc1..aaaaaaaafkxv3eclq27fx4ozbgbhshqmsxgo3yix66xtxynbdjtacpw7vncq",
    "defined-tags": {
      "Oracle-Tags": {
        "CreatedBy": "oracleidentitycloudservice/oramiya",
        "CreatedOn": "2024-04-05T04:18:19.542Z"
      }
    },
    "display-name": "mm02_restorevolume2",
    "freeform-tags": {},
    "id": "ocid1.volume.oc1.ap-tokyo-1. xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ",
    "is-auto-tune-enabled": false,
    "is-hydrated": false,
    "kms-key-id": null,
    "lifecycle-state": "PROVISIONING",
    "size-in-gbs": 50,
    "size-in-mbs": 51200,
    "source-details": {
      "id": "ocid1.volumebackup.oc1.ap-tokyo-1. xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ",
      "type": "volumeBackup"
    },
    "system-tags": {},
    "time-created": "2024-04-11T06:43:48.561000+00:00",
    "volume-group-id": null,
    "vpus-per-gb": 10
  },
  "etag": "4723c31cea968dcd61b1b0882d631363"
}"
```
















# おわりに
今回は仕組みを確認しながら実施しましたが、
先にvolumeを古いテナントから新テナントにクローンorリストアしておけば新しいテナントでカスタムイメージからcomputeを作成するときに作成画面でリストアしてきたvolumeが選択できますので一回で引っ越しが可能です。