OCI Compute の Oracle Linux 8  に Functions(fn) のビルド/実行環境を構築する(Oracle Cloud Infrastructure)

OCI Functions は OCI のサーバーレス・アプリケーションを提供するサービスです。Functions のビルドや実行は Cloud Shell でやることが多いんですが、今回は OCI Compute の Oracle Linux 8 に環境を構築してみるやで。
彡(ﾟ)(ﾟ)

下記マニュアルの「C.ローカルホスト開発環境を設定する」を参考にしながら進めます。

> ローカル・ホストでのファンクションのクイックスタート
> https://docs.oracle.com/ja-jp/iaas/Content/Functions/Tasks/functionsquickstartlocalhost.htm#functionsquickstartlocalhost

環境構築のマニュアル本体は下記となります。

https://docs.oracle.com/ja-jp/iaas/Content/Functions/Tasks/functionsconfiguringclient.htm

Compute や Network の構成は下記記事を前提としています。

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


# 1. podman と podman-docker のインストール

マニュアルでは Docker をインストールしていますが、Fn は podman をサポートしているので今回は podman をインストールします。

```
sudo dnf -y install podman
sudo dnf -y install podman-docker
```

docker versionコマンドで結果を確認します。

```shell
[opc@ays-prv-compute02 ~]$ docker version
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
Client:       Podman Engine
Version:      4.9.4-rhel
API Version:  4.9.4-rhel
Go Version:   go1.21.13 (Red Hat 1.21.13-2.module+el8.10.0+90407+20770c94)
Built:        Tue Sep 24 15:46:08 2024
OS/Arch:      linux/amd64
[opc@ays-prv-compute02 ~]$
```

# 2. OCI CLI のインストールと設定

OCI CLI をインストールして構成します。APIキーの登録など OCI CLI のセットアップは色々な記事があるので詳細は割愛します。

```shell
sudo dnf -y install oraclelinux-developer-release-el8
sudo dnf install python36-oci-cli
oci setup config
```

下記辺りを参照すると良いです。

https://qiita.com/shirok/items/e63be9a22158fef10ba9

インストールと設定完了後に動作を確認します。下記では Object Storage の namespace を取得しています。

```shell
[opc@ays-prv-compute02 ~]$ oci os ns get
{
  "data": "xxxxxxxxxxxx"
}
[opc@ays-prv-compute02 ~]$
```


# 3. Fn Project CLI のインストール

下記マニュアルに従って Compute に Fn Project CLI をインストールします。

> Fn ProjectのCLIのインストール
> https://docs.oracle.com/ja-jp/iaas/Content/Functions/Tasks/functionsinstallfncli.htm

まずインストール前に .bashrc の PATH に /usr/local/bin を追加して読み込みます。ここにパスを通しておかないとこの後の fn のインストールでエラーになります。

```shell
cd ~
vi .bashrc

【.bashrc に export PATH="$PATH:/usr/local/bin" を追記】

source .bashrc
```

下記コマンドで fn をインストールします。

```shell
curl -LSs https://raw.githubusercontent.com/fnproject/cli/master/install | sh
```

インストール完了後に fn versionコマンドでバージョンを確認します。

```shell
[opc@ays-prv-compute02 ~]$ fn version
Client version is latest version: 0.6.34
Server version:  ?
[opc@ays-prv-compute02 ~]$
```

# 4. Container Registry の作成

Functions のビルド・イメージを格納する Container Tegistry を作成します。左上のハンバーガー・メニュー → Developer Services → Containers＆Artifacts → Container Registry で遷移して Create Repository で作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/b051cb11-5fca-2393-57b1-45896e3d0ecb.png)


# 5. Functions の Getting Started(Local setup) の実行

Functions の画面に遷移して Getting Started の Local setup を実行していきます。基本はコピペで OK ですが注意事項がある手順は補足します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/69cd7b7b-38b0-6d0e-a82b-f2aa988804d0.png)

fn init の言語は何でも良いのですが、ここでは java を選択します。

```shell
fn init --runtime java my-func
```

ディレクトリが自動作成されるので移動します

```shell
cd my-func
```

コンテキストの作成と使用を宣言します。

```shell
fn create context ayu-compartment01 --provider oracle
fn use context ayu-compartment01
```

コンテキストのコンパートメントOCID と API URL をアップデートします。

```shell
fn update context oracle.compartment-id ocid1.compartment.oc1..xxxxxxxxxxxxxxxxxxxxxxxxxxxx
fn update context api-url https://functions.us-phoenix-1.oraclecloud.com
```

コンテキストの使用リポジトリをアップデートします。

```shell
fn update context registry phx.ocir.io/<ネームスペース名>/<4. で作成したリポジトリ名>
```

リポジトリのログインに必要な認証トークンを発行します。下記マニュアルを参照して下さい。初めに発行すると再度参照できないので紛失しないようにして下さい。

https://docs.oracle.com/ja-jp/iaas/Content/Registry/Tasks/registrygettingauthtoken.htm

dockerコマンドでリポジトリにログインします。ここの注意事項は **OCI IAM Identity Domainでフェデレーションしているユーザーの場合、oracleidentitycloudservice をネームスペース名とユーザー名の間に挿し込む必要があります。** ハマリポイントでした…。

```shell
docker login -u '<ネームスペース名>/<ユーザー名>' phx.ocir.io
または
docker login -u '<ネームスペース名>/oracleidentitycloudservice/<ユーザー名>' phx.ocir.io
```

https://docs.oracle.com/ja-jp/iaas/Content/Functions/Tasks/functionslogintoocir.htm#Log_in_to_Oracle_Cloud_Infrastructure_Registry

> テナンシがOracle Identity Cloud Serviceとフェデレートされている場合は、<tenancy-namespace>/oracleidentitycloudservice/<username>の書式を使用します。

アプリケーションをビルドするのですが、その前に Fn のコンテナエンジンを Docker から Podman に変更します。

https://docs.oracle.com/ja-jp/iaas/Content/Functions/Tasks/functionsinstalldocker.htm

> Fn Projectでは、Dockerの代替としてPodmanもサポートされています……
> (中略)…container-enginetype構成設定を~/.fn/config.yamlファイルに追加します。

マニュアル記載の通り ~/.fn/config.yaml を編集して保存します。

```shell
vi ~/.fn/config.yaml
【container-enginetype を podman に変更して保存】
```

アプリケーションをビルドして Functions にデプロイします。

```shell
fn deploy --app ayu-functions1
```

Functions にデプロイされたアプリケーションを実行します。

```shell
fn invoke ayu-functions1 my-func
```

以下のように Hello, world! が表示されれば成功です。

```shell
[opc@ays-prv-compute02 my-func]$ fn invoke ayu-functions1 my-func
Hello, world!
[opc@ays-prv-compute02 my-func]$
```

# 6. まとめ

やんごとなき事情により Compute(Oracle Linux) に Functions(fn) のビルド/実行環境を構築しました。Custom Image とかでもっと手軽に作りたいもんですが Cloud Shell や手元の WLS とかで事足りるから要らないのかな。
彡(^)(^)