Oracle Analytics Cloud：REST APIでスナップショットを作成する

# はじめに
ここ何回か、Oracle Analytics Cloud（**OAC**）に対する管理タスクのREST APIによる実行方法を紹介しています。
今回はREST APIを使用したスナップショットの作成や復元を紹介します。
こちらの記事も参考にしてください。

- [Oracle Analytics Cloud：REST APIによるシステム設定の管理](https://qiita.com/tyo38/items/680bfe1eb1e0eedf8d96)
- [Oracle Analytics Cloud：REST APIで接続の管理](https://qiita.com/tyo38/items/a6b8efb723dc28fbfb75)

# 1. 準備
## 1.1 機密アプリケーションの作成
機密アプリケーションを作成しておく必要があります。
手順はこちらと共通です。

- [Oracle Analytics Cloud：REST APIによるシステム設定の管理](https://qiita.com/tyo38/items/680bfe1eb1e0eedf8d96)

## 1.2 オブジェクトストレージの準備
作成したスナップショットの保管先として、任意のバケットを作成してください。
ここでは、例として「mysnapshot-bucket」バケットを作成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/e13d25b0-1549-4760-8025-d4420e105a03.png)

## 1.3 OCIDの取得とAPIキーの作成
テナンシのOCIDをコピーしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/8e0d6ee9-4c5c-671f-f8aa-7a77ccd0e674.png)

バケットに接続するユーザーのOCIDをコピーしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/4121bba2-ef42-7e05-8cab-860f2f964565.png)

同じユーザーの「APIキー」セクションでAPIキーを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/d91ac590-9ebe-3f62-c183-1f35fe0a0f62.png)

「APIキー・ペアの生成」を選択し、秘密キーをダウンロードします。
「追加」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/858dde16-99c6-dfa8-e42d-e15a92fdfd88.png)

確認して閉じます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/74385eaf-4acd-ff18-c5de-a9643ee7540d.png)

フィンガープリントはコピーしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/cded8d4d-5fc3-7001-4782-c8d7cde5dc8d.png)

# 2. スナップショットの操作
スナップショットは、OACの「コンソール」－「スナップショット」からGUIで操作することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/10c6fa2a-7ad3-7c41-32bb-874cfa665121.png)

REST APIを使用して作成したスナップショットは、オブジェクトストレージに保存され、こちらには表示されません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/adb8e067-51d8-56be-a4b1-5846f2914fa1.png)
また、ここに表示されているスナップショットをREST APIで操作することもできません。

これ以降、REST APIの実行はCloud Shellでcurlコマンドを使用しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/f2afa8a9-c121-8b7f-2e69-6079d28c2d3e.png)

## 2.1 作成
ホームディレクトリにjsonファイルを作成します。
mysnapshot-bucketというバケットのmyfolderというフォルダの中に、myfirstsnapshot.barという名前で保存する例です。

|パラメータ|値|
|:-|:-|
|name|スナップショットの名前|
|bucket|保存先のバケット|
|ociRegion|リージョン|
|ociTenancyId|テナンシのOCID|
|ociUserID|ユーザーのOCID|
|ociKeyFingerprint|先程コピーしておいたAPIキーのフィンガープリント|
|ociPrivateKeyWrapped|秘密キーをBase64エンコードしたもの|
|uri|スナップショットファイル名|
|password|スナップショットのパスワード|

```json:new_snapshot.json
{
    "type": "CREATE",
    "name": "myfirstsnapshot",
    "storage": {
        "type": "OCI_NATIVE",
        "bucket": "mysnapshot-bucket",
        "auth": {
            "type": "OSS_AUTH_OCI_USER_ID",
            "ociRegion": "ap-tokyo-1",
            "ociTenancyId": "ocid1.tenancy.oc1..aa......",
            "ociUserId": "ocid1.user.oc1..aa......",
            "ociKeyFingerprint": "e1:56:51:......",
            "ociPrivateKeyWrapped": "LS0tLS1CRUdJTiBQUklWQV......"
        }
    },
    "bar": {
        "uri": "file:///myfolder/myfirstsnapshot.bar",
        "password": "snapshotPassword123"
    }
}

```

:::note
秘密キーのBase64エンコード方法
```shell
cat myprivate-key.pem | base64 -w 0 > mywrapped-private-key.pem
```
:::

事前にトークンを取得します。

```shell
$ curl --request POST \
> --url https://<Domain URL>/oauth2/v1/token \
> --header 'authorization: Basic <base64(Client ID:Client Secret)>' \
> --header 'content-type: application/x-www-form-urlencoded;charset=UTF-8' \
> -d 'grant_type=password&username=<USERNAME>&password=<PASSWORD>&scope=<SCOPE>'

{"access_token":"eyJ4NXQjUzI1NiI6IjBPdFJxUml...","token_type":"Bearer","expires_in":100}

$
```

取得したトークンを使って、次のコマンドを実行します。

```shell
curl -i --header "Authorization: Bearer <access_token>" \
--header "Content-Type: application/json" \
--request POST https://<OAC Hostname>/api/20210901/snapshots -d @new_snapshot.json
```

すぐに実行結果とともにworkRequestIdが返されます。
workRequestIdを使用して実行状況を確認することができます。

```shell
HTTP/1.1 202 Accepted
Date: Mon, 15 Jan 2024 05:22:02 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 35
Connection: keep-alive
X-ORACLE-DMS-ECID: b7e414cf-8c5d-4ba8-86fb-7f431e5639a4-0003530d
ETag: W/"23-Gwua0jJJZhZXdNPo6M75GkFNn/0"
oa-work-request-id: lfc-ci:6-cu:486
X-ORACLE-DMS-RID: 0
Strict-Transport-Security: max-age=31536000;
vary: X-Forwarded-Proto,origin

{"workRequestId":"lfc-ci:6-cu:486"}
```
statusがSUCCEEDEDになれば完了です。

```shell
curl -i --header "Authorization: Bearer <access_token>" \
--request GET https://<OAC Hostname>/api/20210901/workRequests/lfc-ci:6-cu:486
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/8d12076c-aa55-fe69-3017-cf9dbac93766.png)

## 2.2 一覧
次のコマンドを実行します。

```shell
curl -i --header "Authorization: Bearer <access_token>" \
--request GET https://<OAC Hostname>/api/20210901/snapshots
```
これにより、各スナップショットのIDを取得できます。
復元や削除に必要なので、コピーしておきます。

## 2.3 復元
ホームディレクトリにjsonファイルを作成します。

```json:restore_mysnapshot.json
{
   "snapshot": {
      "id" : "b35be58e-1851-411f-bfc7-0fa1020866f2",
      "password" : "snapshotPassword123"
   }
}
```

次のコマンドを実行します。

```shell
curl -i \
--header "Authorization: Bearer <access_token>" \
--header "Content-Type: application/json" \
--request POST https://<OAC Hostname>/api/20210901/system/actions/restoreSnapshot \
-d @restore_mysnapshot.json

```

復元のステータスもworkRequestsで適宜確認できます。

## 2.4 削除
次のコマンドで削除できます。

```shell
curl -i --header "Authorization: Bearer <access_token>" \
--request DELETE https://<OAC Hostname>/api/20210901/snapshots/b35be58e-1851-411f-bfc7-0fa1020866f2
```

実行完了すると、スナップショットの一覧に表示されなくなりますが、オブジェクトストレージから自動的に削除されることはありません。
必要に応じて、自分で削除してください。

# 3. ドキュメント

- [スナップショットの一覧・作成・削除](https://docs.oracle.com/en/cloud/paas/analytics-cloud/acapi/api-snapshots.html)
- [スナップショットの復元](https://docs.oracle.com/en/cloud/paas/analytics-cloud/acapi/op-20210901-system-actions-restoresnapshot-post.html)

# 4. 参考
- [Oracle Analytics Cloud：スナップショットをObject Storageにエクスポート](https://qiita.com/tyo38/items/a884816a32ff82ce3741)