3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Oracle Cloud InfrastructureAdvent Calendar 2024

Day 19

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

Last updated at Posted at 2024-12-22

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

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

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

1. 元記事の課題

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

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

2. 解決策

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

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

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

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

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

同様に 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部分をワンライナーで記述していますがコマンドごとに分解して解説します。

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

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

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

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

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

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

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

[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 のアップロード結果)が出力されます。

[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

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

{
  "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

5. まとめ

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

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?