9
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

OCI Functions で OCI CLI を実行してみる。(Fn HotWrap, Oracle Cloud Infrastructure)

Last updated at Posted at 2024-10-30

OCI Functions で OCI CLI を実行してみます。Functions が基盤とする Fn には HotWrap という仕組みがあり、この HotWrap で UNIX/Linux のコマンドを実行できます。HotWrap の仕組みを利用して OCI CLI を OCI Functions で実行してみますやで。
彡(^)(^)

1. Fn HotWrap について

Fn HotWrap は UNIX/Linux のコマンドを Dockerコンテナとして作成します。Fn HowWrap によるコマンドの実行は下記で解説されています。

Make your own Linux command Function with HotWrap and a Customer Docker Image
https://fnproject.io/tutorials/docker/CustomLinuxContainer/

下記は Fn HotWrap の GitHubリポジトリです。

2. 環境

下記記事で作成した Compute + Fn + OCIR(Dockerレジストリ) + OCI Functions の環境を利用します。
OCI CLI はこの記事では OCI CLI の Dockerイメージ を使用しているため、Compute の OCI CLI には依存しません。

3. 動的グループの作成と権限付与(リソース・プリンシパル)

OCI Functions が OCI CLI を実行できるようにするための権限付与(リソース・プリンシパル)を行います。

下記は作成した動的グループです。Functions のみの実行であればインスタンス・プリンシパル(instance.~)は不要です。今回は Fn をビルドする Compute でも OCI CLI を実行したいのでリソース・プリンシパル(resource.~)と一緒に定義しています。

Any {instance.compartment.id = 'ocid1.compartment.oc1.............'}
Any {resource.compartment.id = 'ocid1.compartment.oc1.............'}

image.png

作成した動的グループに権限(ポリシー)を付与します。今回は Object Storage の権限を付与します。

Allow dynamic-group ayu-dynamic-group01 to manage buckets in compartment ayu-compartment01
Allow dynamic-group ayu-dynamic-group01 to manage objects in compartment ayu-compartment01

image.png

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

まず Fn のコンテキスト設定、Dockerレジストリのログインを済ませておきます。これらの詳細は上記 2. の記事を参照して下さい。

fn list context
fn use context ayu-compartment01
docker login -u '<namespace>/<ユーザー名>' <レジストリ名>
<レジストリのパスワードを入力>
[opc@ays-prv-compute02 ~]$ fn list context
CURRENT NAME                    PROVIDER        API URL                                         REGISTRY
*       ayu-compartment01       oracle          https://functions.us-phoenix-1.oraclecloud.com  phx.ocir.io/xxxxxxxxxx/ayu-repo1
        default                 default         http://localhost:8080
[opc@ays-prv-compute02 ~]$ fn use context ayu-compartment01

Fn: Context ayu-compartment01 currently in use

See 'fn <command> --help' for more information. Client version: 0.6.34
[opc@ays-prv-compute02 ~]$ docker login -u 'xxxxxxxxxxxxxx/oracleidentitycloudservice/xxxxxxxx.xxxxxxxx@xxxxxxxxx.xxxxxxxxxx' phx.ocir.io
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
Password:
Login Succeeded!
[opc@ays-prv-compute02 ~]$

上記 2. の環境でディレクトリを作成して移動します。

mkdir hotwrap-func
cd hotwrap-func

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 ["oci", "${OCI_CLI_COMMAND}"]

ENTRYPOINT ["/hotwrap"]

Dockerイメージをレジストリにデプロイします。--app で指定するアプリケーション名は上記 2. の記事で作成済みのものを流用します。

fn --verbose deploy --app ayu-functions1

以下はデプロイ時の実行ログ(抜粋)となります。

[opc@ays-prv-compute02 hotwrap-func]$ fn --verbose deploy --app ayu-functions1
Deploying hotwrap-func to app: ayu-functions1
Bumped to version 0.0.2
Using Container engine podman
Building image phx.ocir.io/xxxxxxxx/ayu-repo1/hotwrap-func:0.0.2
Dockerfile content
-----------------------------------
FROM ghcr.io/oracle/oci-cli:latest

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

ENV OCI_CLI_AUTH=resource_principal

CMD ["oci", "${OCI_CLI_COMMAND}"]

ENTRYPOINT ["/hotwrap"]

-----------------------------------
FN_REGISTRY:  phx.ocir.io/xxxxxxxx/ayu-repo1
Current Context:  ayu-compartment01
TargetedPlatform:  amd64HostPlatform:  amd64
STEP 1/5: FROM ghcr.io/oracle/oci-cli:latest
STEP 2/5: COPY --from=fnproject/hotwrap:latest /hotwrap /hotwrap
--> Using cache 13c9bd7483e3b9813ed98399bd3359a0a2108eb53b3c821bd305b46a12d0dc25
--> 13c9bd7483e3
:
Updating function hotwrap-func using image phx.ocir.io/xxxxxxxx/ayu-repo1/hotwrap-func:0.0.2...
Successfully created function: hotwrap-func with phx.ocir.io/xxxxxxxx/ayu-repo1/hotwrap-func:0.0.2
[opc@ays-prv-compute02 hotwrap-func]$

デプロイが成功すると OCIコンソールからは以下のように参照できます。

image.png

5. OCI Functions による OCI CLI の実行

fn configコマンドで関数(hotwrap-func)の環境変数OCI_CLI_COMMAND に OCI CLI の oci~ よりも後のオプションを指定します。ここではコマンドラインから環境変数を設定していますがOCIコンソールからも設定可能です。
今回は Object Storage のバケット・リストを取得してみます(oci os bucket list)。

fn config function ayu-functions1 hotwrap-func OCI_CLI_COMMAND "os bucket list --compartment-id ocid1.compartment.oc1......."

下記は環境変数設定の実行ログです。

[opc@ays-prv-compute02 hotwrap-func]$ fn config function ayu-functions1 hotwrap-func OCI_CLI_COMMAND "os bucket list --compartment-id ocid1.compartment.oc1......."
ayu-functions1 hotwrap-func updated OCI_CLI_COMMAND with os bucket list --compartment-id ocid1.compartment.oc1.......
[opc@ays-prv-compute02 hotwrap-func]$

環境変数OCI_CLI_COMMANDの設定が完了した関数(hotwrap-func)を実行します。

fn invoke ayu-functions1 hotwrap-func

下記は関数(hotwrap-func)の実行結果です。

[opc@ays-prv-compute02 hotwrap-func]$ fn invoke ayu-functions1 hotwrap-func
{
  "data": [
    {
      "compartment-id": "ocid1.compartment.oc1........",
      "created-by": "ocid1.saml2idp.oc1........",
      "defined-tags": null,
      "etag": "f1d572a9-21cb-43a1-88b3-9ff00582cfa2",
      "freeform-tags": null,
      "name": "ayu-bucket1",
      "namespace": "xxxxxxxx",
      "time-created": "2020-12-01T13:52:07.029000+00:00"
    },
    {
      "compartment-id": "ocid1.compartment.oc1........",
      "created-by": "logging/9A5C4B3CF0F9A881D4C6CFAAFCEA78DB2106BD3582B1A485072E9BF75EB2",
      "defined-tags": null,
      "etag": "d8baa063-3902-4963-9843-a7c932aa7303",
      "freeform-tags": null,
      "name": "oci-logs._flowlogs.ocid1.compartment.oc1........",
      "namespace": "xxxxxxx",
      "time-created": "2024-01-31T13:56:02.061000+00:00"
    }
  ]
}

Object Storage のバケット・リストを取得できています。
彡(^)(^)

6. まとめ

OCI Functions で OCI CLI を実行できました。OCI Functions は直近で Scheduled Functions という定時実行の機能がリリースされており、今回の記事と下記を組み合わせると色々できそうです。夢が広がりんぐ。
彡(^)(^)

OCI Functionsのスケジュール実行のサポート
https://blogs.oracle.com/oracle4engineer/post/oci-functions-scheduled

次回は Scheduled Functions で OCI CLI を定時刻で実行する検証をしてみようと思います。

Special Thanks!

こちらの記事は日本オラクル社の S.Kさん と K.Dさん が社内で検証されたものを記事化したものです。この場で篤く御礼申し上げます。彡(^)(^) サンガッツ

9
6
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
9
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?