この記事は下記記事の続編的な記事になります。下記記事で課題だったログ廻りに少し改良を加えましたやで。
彡(゚)(゚)
また本記事は毎年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
schema_version: 20180708
name: hotwrap-func
version: 0.0.1
同様に 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 を見ると上記のように実行結果のログがアップロードされています。
ダウンロードして中身をみてみると、本体の 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 による定期実行でも同様に動作することを確認しました。
5. まとめ
やや小ぶりなネタですが、前々回前回記事の課題を地味に改良してより実践的にしました。
用途は色々ありそうです。活用した感想が有ればお聞かせ下さいね。
彡(^)(^)