Scheduling Functions で OCI CLI を cron っぽく定期実行してみる。(Oracle Cloud Infrastructure)

(※2024/12/22追記)改良版を書きました。是非下記記事も参照して下さい彡(^)(^)

https://qiita.com/ora_gonsuke777/items/f1309c67d0fb247b975e

前回(下記)の続編的な記事になります。Scheduling Functions で OCI CLI を cron っぽく定期実行してみるやで。
彡(ﾟ)(ﾟ)

https://qiita.com/ora_gonsuke777/items/3501b7026b1d112dd93b


# 1. やってみること

前述の記事で作成した OCI CLI の Functions を応用して、OCI Resource Scheduler の Scheduling Functions で定期実行します。

> スケジューリング関数
> https://docs.oracle.com/ja-jp/iaas/Content/Functions/Tasks/functionsschedulingfunctions-about.htm

今回は Autonomous Database Serverless(以下 ADB-S) を OCI CLI + Scheduling Functions で 1時間毎 に起動/停止してみます。

# 2. 権限付与(リソース・プリンシパル)

まず OCI Functions が OCI CLI を実行できるようにするための権限付与(リソース・プリンシパル)を行います。
動的グループは前回記事のものを流用します。ADB-S を起動/停止するために下記の権限(ポリシー)を動的グループに付与します。

```python
Allow dynamic-group ayu-dynamic-group01 to use autonomous-database in compartment ayu-compartment01
```

次に Scheduling Functions が Functions を実行できるように新規に動的グループと権限(ポリシー)を作成します。

動的グループは下記で resource.type に resourceschedule を指定します。

```shell
ALL {resource.type='resourceschedule'}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/6d7858e7-e6c4-cd51-d810-2c6ac717b4ae.png)

新しく作った動的グループに付与する権限(ポリシー)は下記としています。

```shell
Allow dynamic-group 'Default'/'ayu-dynamic-group02' to manage functions-family in compartment ayu-compartment01
```

Scheduling Functions による Functions の実行に必要な動的グループや権限(ポリシー)は下記マニュアルも参照して下さい。

> 関数のスケジュール
> https://docs.oracle.com/ja-jp/iaas/Content/Functions/Tasks/functionsscheduling.htm


# 3. OCI CLIコマンドの動作確認 と Functions の準備

まず ADB-S を起動/停止する OCI CLIコマンド を動作確認します。

```shell
# ADB-S を起動する OCI CLIコマンド
oci db autonomous-database start --autonomous-database-id ocid1.autonomousdatabase.oc1....

# ADB-S を停止する OCI CLIコマンド
oci db autonomous-database stop --autonomous-database-id ocid1.autonomousdatabase.oc1....
```

次に前回記事の要領で OCI CLIコマンドを実行する Functions の関数を2つ用意します。atp-start という関数と atp-stop という関数を作成して、それぞれ OCI CLIパラメータの OCI_CLI_COMMAND変数 を設定しています。

下記では fnコマンド で OCI_CLI_COMMAND変数 を設定していますが、OCIコンソールからも設定可能です。

```shell
fn config function ayu-functions1 atp-start OCI_CLI_COMMAND "db autonomous-database start --autonomous-database-id ocid1.autonomousdatabase.oc1...."
fn config function ayu-functions1 atp-stop OCI_CLI_COMMAND "db autonomous-database stop --autonomous-database-id ocid1.autonomousdatabase.oc1...."
```

設定した OCI_CLI_COMMAND変数は下記のように OCIコンソールから参照可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/8711be45-8318-3923-ca68-f6656ff213eb.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/a1080452-a9a4-defd-1d80-04125327ac91.png)

fn invoke でそれぞれ動作を確認します。

```shell
[opc@ays-prv-compute02 ~]$ fn invoke ayu-functions1 atp-start
{
  "data": {
    "actual-used-data-storage-size-in-tbs": 0.004418373107910156,
    "allocated-storage-size-in-tbs": 0.0068359375,
    "apex-details": {
      "apex-version": null,
      "ords-version": "24.3.0.262.0924"
    },
：
  "etag": "beda009e",
  "opc-work-request-id": "ocid1.coreservicesworkrequest.oc1.phx.abyhqljsoz64u46griyuvj5eg2mfbyg4pw44ya3osifj2u64wp4zmm623qba"
}
```

```shell
[opc@ays-prv-compute02 ~]$ fn invoke ayu-functions1 atp-stop
{
  "data": {
    "actual-used-data-storage-size-in-tbs": 0.004418373107910156,
    "allocated-storage-size-in-tbs": 0.0068359375,
    "apex-details": {
      "apex-version": null,
      "ords-version": "24.3.0.262.0924"
    },
：
  "etag": "60e9b758",
  "opc-work-request-id": "ocid1.coreservicesworkrequest.oc1.phx.abyhqljsyg7yllegwuiebcc6igzwhco2xectmgy5aegwd6deyzooyhomhv6a"
}
```

Functions による起動/停止の実行は ADB-S の Work requests からも確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/7947c49c-8bf8-fc26-a2a3-76c073f8c9df.png)

# 4. Scheduling Functions による定期実行設定

OCIコンソールの左上のハンバーガーメニュー → Governance&Administoration → Resource Scheduler の Shcedules をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/68b42c52-38ab-5458-13b1-0333d8700947.png)

Create a scheduleボタンで定期実行ジョブを作成します。まずATP起動のスケジュール名と詳細を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/558311f8-0f45-aea5-4c6c-e8903c1ef89f.png)

Resource selection method は Static を、実行するリソースは 3. で準備した ADB-S起動 の Functions関数を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/eda81fcd-30d8-9762-7374-074973f2dc9f.png)

Specify schedule using は Cron expression を選択します。Recurrence details に cron書式の起動時刻を記述します。分 時 日 月 曜日 の順番となります。起動は奇数時刻に実行するように設定してみます。Time は現在時刻より後の時刻を UTC で設定して下さい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/9278584f-8f56-bee4-965e-a57335cafd69.png)

ATP-S起動ジョブには下記の時刻(奇数時0時)を設定しました。

```shell
0 1,3,5,7,9,11,13,15,17,19,21,23 * * *
```

ATP-S停止ジョブには下記の時刻(偶数時0時)を設定しました。

```shell
0 0,2,4,6,8,10,12,14,16,18,20,22 * * *
```
Resource Scheduler の Cron書式については下記マニュアルを参照して下さい。

> スケジュール情報の追加
> https://docs.oracle.com/ja-jp/iaas/Content/resource-scheduler/tasks/schedule-info.htm

その他のオプションもありますが、本記事ではこのまま作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/f35312dd-5906-8444-5942-11bcfe24babc.png)

ADB-S起動Functions と ADB-S停止Functions のスケジュールをそれぞれ作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/6a73abc6-eac5-ee74-7871-af6df5c28b89.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/fcf24ed6-9079-4411-d9cc-4bdb254b39ab.png)

# 5. Scheduling Functions の実行結果確認

しばらく待って Scheduling Functions の実行結果を確認します。上手く動作しているようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/9ddcaff7-a748-1417-9a0c-5041d39ae626.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/0124885f-c069-ea7d-2362-8b2c202d1552.png)

ADB-S の Work requests からも起動と停止が定時刻で実行されている様子を確認できました。
彡(^)(^)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/578a2025-89f2-a849-e6ed-feb7ef34c6f1.png)

※以下の書式でも動作しました。

```shell
0 1-23/2 * * *
```

```shell
0 0-22/2 * * *
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/d9cb7e98-517f-52fa-ea53-0e098339de3c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/ce586489-c204-df1c-bf5b-f0e13555e62a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/8e5ddda8-0e36-5533-e725-856cc3f4963b.png)


# 6. まとめ

Scheduling Functions で OCI CLI を定期実行できました。今回は ADB-S の起動/停止をお試ししてみましたが、OCI CLI のその他機能も動作する想定です。動作確認は必ず実施して下さい。

所感として、デバッグやトラブルシュートに課題が有ると感じました。上手く動かない時に見れる/採れる情報が少ない。これは事前の設定や仕込みで改善できる可能性もあるので、今後追ってみようかと思います。
彡(ﾟ)(ﾟ)