改良版・OCI CLI を Functions + Resource Scheduler で定期実行(Oracle Cloud Infrastructure)

この記事は下記記事の続編的な記事になります。下記記事で課題だったログ廻りに少し改良を加えましたやで。
彡(ﾟ)(ﾟ)

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

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

また本記事は毎年12月恒例の Advent Calendar にもノミネートさせて頂いています。※多忙と体調不良で投稿が遅れました。
彡(-)(-)ｽﾐﾏｾﾝ

> JPOUG Advent Calendar 2024
> https://adventar.org/calendars/10258

https://qiita.com/advent-calendar/2024/oci


# 1. 元記事の課題

OCI CLI の Functions による実行自体はどちらの記事でも上手く行っていたのですが、fn invokeコマンドでは出力される OCI CLI の JSON がどこかに消えてしまうという欠点がありました。

通常の Functions であれば標準出力は Logging を有効化すれば Logging に流れていくのですが、HotWrap の標準出力は Logging には流れて行ってくれないもよう、なんでや彡(-)(-)

# 2. 解決策

あれこれ試した結果、標準出力の JSON をファイルにリダイレクトして Object Storage にアップロードする、という方法が使えました。
ファイルのリダイレクトとか Functions のような FaaS にはあまり似つかわしくない解決策なのですが、やりたい事は実現可能。以降で解説します。

# 3. OCI Functions関数の作成とデプロイ

権限付与やレジストリのログインなど、前準備については下記記事を参照して下さい。

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

func.yaml は上記記事と同じです。コピペで OK

```yaml:func.yaml
schema_version: 20180708
name: hotwrap-func
version: 0.0.1
```

同様に Dockerfile も作成します。今回のポイントはこちらとなります。

```Dockerfile:Dockerfile
FROM ghcr.io/oracle/oci-cli:latest

COPY --from=fnproject/hotwrap:latest /hotwrap /hotwrap

ENV OCI_CLI_AUTH=resource_principal

CMD ["logname=$(date +output_%Y%m%d_%H%M%S_$$.log); oci ${OCI_CLI_COMMAND} > /tmp/${logname} 2>&1; oci os object put --bucket-name ayu-bucket1 --file /tmp/${logname};"]

ENTRYPOINT ["/hotwrap"]
```

CMD部分をワンライナーで記述していますがコマンドごとに分解して解説します。

```shell
logname=$(date +output_%Y%m%d_%H%M%S_$$.log);
```

↑初めのコマンドでログファイル名を定義しています。日付時刻とプロセス番号含んで可能な限りユニークなファイル名に

```shell
oci ${OCI_CLI_COMMAND} > /tmp/${logname} 2>&1;
```

↑次のコマンドで本体の OCI CLIコマンドを実行しています。JSON の返り値はログファイルにリダイレクト

```shell
oci os object put --bucket-name ayu-bucket1 --file /tmp/${logname};
```

↑最後のコマンドでログファイルを Object Storage にアップロードしています。バケット名はハードコードしてしまっていますが、環境変数化も可能です。

デプロイ(fn deploy)して実行の準備は完了です。

```shell
[opc@ays-prv-compute02 hotwrap-func]$ fn deploy --app ayu-functions1
Deploying hotwrap-func to app: ayu-functions1
Bumped to version 0.0.25
Using Container engine podman
Building image phx.ocir.io/xxxxxxxx/ayu-repo1/hotwrap-func:0.0.25 TargetedPlatform:  amd64HostPlatform:  amd64
..............
Using Container engine  podman  to push
Pushing phx.ocir.io/xxxxxxxx/ayu-repo1/hotwrap-func:0.0.25 to docker registry...Getting image source signatures
Copying blob bd9ddc54bea9 skipped: already exists
Copying blob 25ff21438623 done   |
Copying blob 62704d38913b skipped: already exists
Copying blob 80575aa2b656 skipped: already exists
Copying blob c74884e7daa9 done   |
Copying config a62a4825e5 done   |
Writing manifest to image destination
Updating function hotwrap-func using image phx.ocir.io/xxxxxxxx/ayu-repo1/hotwrap-func:0.0.25...
[opc@ays-prv-compute02 hotwrap-func]$
```

# 4. OCI Functions および Resource Scheduler による OCI CLI の実行

まず fn invoke でデプロイした Functions を実行してみます。標準出力としては最後のコマンドの結果(Object Storage のアップロード結果)が出力されます。

```shell
[opc@ays-prv-compute02 hotwrap-func]$ fn invoke ayu-functions1 hotwrap-func
{
  "etag": "7968263c-7e8d-4db3-a5ae-013e93bcef95",
  "last-modified": "Sun, 22 Dec 2024 13:19:58 GMT",
  "opc-content-md5": "XiXmWGvnmXWAN1LOqKn4gQ=="
}
[opc@ays-prv-compute02 hotwrap-func]$
```

Object Storage の Bucket を見ると上記のように実行結果のログがアップロードされています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/7e105c6f-6743-d14c-647a-5aa4b8c58a78.png)

ダウンロードして中身をみてみると、本体の OCI CLIコマンドの出力結果(JSON, 今回のケースでは Object Storage のバケット確認)を確認できます。

```json
{
  "data": [
    {
      "compartment-id": "ocid1.compartment.oc1..aaaaaaaadp65gxxxxxx",
      "created-by": "ocid1.saml2idp.oc1..aaaaaaaa4f776rylukgyuwyrxxxxx/xxxxxxxxxxx",
      "defined-tags": null,
      "etag": "f1d572a9-21cb-43a1-88b3-9ff00582cfa2",
      "freeform-tags": null,
      "name": "ayu-bucket1",
      "namespace": "xxxxxxxxxx",
      "time-created": "2020-12-01T13:52:07.029000+00:00"
    },
    {
      "compartment-id": "ocid1.compartment.oc1..aaaaaaaadpxxxxxxxxxx",
      "created-by": "logging/9A5C4B3CF0F9A881D4C6CFAAFCEA78DB2106BD3582B1A485072E9BF75EB2",
      "defined-tags": null,
      "etag": "d8baa063-3902-4963-9843-a7c932aa7303",
      "freeform-tags": null,
      "name": "oci-logs._flowlogs.ocid1.compartment.oc1..aaaaaaaadp65gxxxxxxxxxx",
      "namespace": "xxxxxxxxxxx",
      "time-created": "2024-01-31T13:56:02.061000+00:00"
    }
  ]
}
```

Resource Scheduler による定期実行でも同様に動作することを確認しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/16fc42cd-ab46-1f43-185d-d4a7bc477418.png)

# 5. まとめ
やや小ぶりなネタですが、前々回前回記事の課題を地味に改良してより実践的にしました。
用途は色々ありそうです。活用した感想が有ればお聞かせ下さいね。
彡(^)(^)