今回やりたいこと
タイトルの通りコンピュート・インスタンス(以下インスタンス)内に作成したPodman環境から、OCI Functions(以下ファンクション)を実行できるか検証を行います。
実行環境
今回の実行環境は以下の通りです。
ネットワーク
- VCN:
VCN_10.0.0.0/16
- パブリック・サブネット:
Pubsub_10.0.0.0/24
- インターネット・ゲートウェイ:IGW(パブリック・サブネットにアタッチ)
- パブリック・サブネット:
- ルート表(パブリック・サブネット用)
- 宛先CIDR:
0.0.0.0/0
- ターゲット:
IGW
※ セキュリティ・リストはデフォルト設定のまま使用します。
- 宛先CIDR:
ポリシー
以下のIAM ポリシーを設定することで、ファンクションを適切に利用できるようになります。
(fn-group
は例です。実際に使用するグループに置き換えて設定してください。)
-
コンパートメントの作成権限
Allow group fn-group to manage compartments in tenancy
※ 既にコンパートメントを作成済みの場合、このポリシーは不要です。 -
VCNの作成権限
Allow group fn-group to manage virtual-network-family in tenancy
※ 今回はVCNの作成から実施するため、manage
権限を付与しています。
既にVCNを作成済みの場合、使用権限を許可するuse
権限の付与を推奨します。 -
ファンクションおよびアプリケーションの作成権限
Allow group fn-group to manage functions-family in tenancy
-
オブジェクト・ストレージ・ネームスペースの取得権限
Allow group fn-group to read objectstorage-namespaces in tenancy
-
ファンクションのレジストリ読み取り権限
Allow service FaaS to read repos in tenancy
-
インスタンスの作成権限
Allow group fn-group to manage instance-family in tenancy
※ インスタンスからではなく、ローカル端末から実行する場合は不要です。
インスタンス
認証を分離するため、ローカル端末ではなく、同じパブリック・サブネット内にインスタンスを構築してファンクションの設定を行います。
インスタンスのスペックは任意ですが、今回は以下の設定で作成します。
※ローカル端末からでも実行可能であるため、本手順ではインスタンス作成を割愛します。
- OS:
Oracle Linux 9
- OCPU:
1 OCPU
- メモリ:
8 GB
- ストレージ:
50 GB
本手順
1.コンパートメントの作成
最初にコンパートメントの作成を行います。
既にコンパートメント作成済みの場合、この手順をスキップしてください。
OCIコンソール画面左上のナビゲーションメニューから「アイデンティティとセキュリティ」→「コンパートメント」をそれぞれ選択します。
名前・説明ともに任意ですが、ここでは以下リソース名を入力、「コンパートメントの作成」を選択します。
fn-compartment
コンパートメントが作成されます。
2.ネットワークの作成
コンパートメントの作成後、VCNを作成します。
今回はVCNウィザードからではなく、手動でVCNを作成します。
VCN
OCIコンソール画面左上のナビゲーションメニューから「ネットワーキング」→「仮想クラウド・ネットワーク」をそれぞれ選択します。
作成したコンパートメント(ここではtf-compartment
)が選択されていることを確認、「VCNの作成」を選択します。
ここでは以下リソース名を入力、「VCNの作成」を選択します。
サブネット
「サブネットの作成」から、今回はパブリック・サブネットを作成します。
ここでは以下リソース名を入力、「サブネットの作成」を選択します。
状態が「プロビジョニング中」→「使用可能」に遷移、サブネットが作成されます。
インターネット・ゲートウェイ
「インターネット・ゲートウェイ」→「インターネット・ゲートウェイの作成」から作成を行います。
ここでは名前をIGW
とし、「インターネット・ゲートウェイの作成」を選択します。
ルート表
ゲートウェイの作成後、パブリック・サブネット用のルート表を作成します。
「ルート表」→「ルート表の作成」を選択します。
ここでは以下を入力、「作成」を選択します。
- 名前:
RT-Pub
- ルート・ルール
パブリック・サブネットのルート表はデフォルトのルート表を使用しているため、作成したルート表に置き換える必要があります。
サブネットの詳細画面の「編集」を選択します。
ルート表を作成したリソースに変更、「変更の保存」を選択します。
状態が「UPDATING」→「AVAILABLE」に遷移、ルート表が変更されます。
ネットワーク関連のリソース作成については以上です。
なお、NSGやセキュリティリストは、必要に応じて適宜設定してください。
3.ファンクションの作成
コンテナ・レジストリの作成後、ファンクションを作成します。
OCIコンソール画面左上のナビゲーションメニューから「開発者サービス」→「アプリケーション」をそれぞれ選択します。
ここでは以下を入力、「作成」を選択します。
4.ファンクションのセットアップ
ここでは、パブリックサブネット上のインスタンスからファンクションのセットアップを実行します。
その前に、インスタンス上でOCI CLIをセットアップする必要があります。
手順については、以下を参考にしてください。
podmanとpodman-dockerのインストール
この後インストールするFn Projectではpodmanをサポートしているため、今回はpodmanを以下コマンドでインストールします。
sudo dnf install -y podman
sudo dnf install -y podman-docker
以下コマンドで結果を確認します。
docker version
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
Client: Podman Engine
Version: 5.2.2
API Version: 5.2.2
Go Version: go1.22.9 (Red Hat 1.22.9-2.el9_5)
Built: Tue Feb 4 19:50:29 2025
OS/Arch: linux/amd64
Fnのインストール
合わせてFn Projectのインストールも行います。
Fn Projectとは、開発者エクスペリエンス重視なFaaSを構築するためのプラットフォームです。
インストール前に.bashrcのPATHに/usr/local/bin
を追加します。
cd ~
vim .bashrc
# .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
# User specific environment
if ! [[ "$PATH" =~ "$HOME/.local/bin:$HOME/bin:" ]]
then
PATH="$HOME/.local/bin:$HOME/bin:$PATH"
fi
export PATH
# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
# 以下の行を追加
export PATH="$PATH:/usr/local/bin"
追加後、source
コマンドで設定を反映します。
source .bashrc
以下コマンドでFn Projectをインストールします。
curl -LSs https://raw.githubusercontent.com/fnproject/cli/master/install | sh
fn version 0.6.39
______
/ ____/___
/ /_ / __ \
/ __/ / / / /
/_/ /_/ /_/`
インストール後、which
コマンドでFn Projectの実行コマンド(fn
)が使用可能か確認します。
which fn
/usr/local/bin/fn
FnのコンテナエンジンをDockerからPodmanに変更します。
vim ~/.fn/config.yaml
cli-version: 0.6.39
# docker→podmanに変更
container-enginetype: podman
認証トークンの取得
Fn Projectをインストールした後、OCIコンソールに戻り、Dockerのログインに必要な認証トークンを取得します。
対象ユーザー(ここではfn-user
)のマイ・プロファイルから「認証トークン」→「トークンの生成」を選択します。
任意の説明(ここでは「ファンクション用」)を入力、「トークンの生成」を選択します。
Dockerのログイン時に必要となるため、「コピー」でトークンを控えておきます。
ローカル・セットアップ
認証トークンの取得後、アプリケーションの詳細画面にある「Local setup」の手順を参考にセットアップを行います。
最初に、ここではPythonを実行環境としてmy-func
というファンクションを作成します。
fn init --runtime python my-func
Creating function at: ./my-func
Function boilerplate generated.
func.yaml created.
作成したmy-func
ディレクトリに移動します。
cd my-func
fn-compartment
という名前のFnプロジェクトのコンテキストを作成し、OCIをプロバイダとして指定します。
fn create context fn-compartment --provider oracle
Successfully created context: fn-compartment
作成したfn-compartment
コンテキストを現在の作業環境として使用します。
fn use context fn-compartment
Now using context: fn-compartment
コンテキストにコンパートメントOCIDを設定します。
fn update context oracle.compartment-id ocid1.compartment.oc1..aaaaaaaaxxx
Current context updated oracle.compartment-id with ocid1.compartment.oc1..aaaaaaaaxxx
ファンクションのエンドポイントURLを設定します。
(ここでは東京リージョンを指定します。)
fn update context api-url https://functions.ap-tokyo-1.oraclecloud.com
Current context updated api-url with https://functions.ap-tokyo-1.oraclecloud.com
関数をコンテナイメージとして保存するコンテナ・レジストリ(OCIR)のURLを設定します。
fn update context registry nrt.ocir.io/<オブジェクト・ストレージのネームスペース>/fn-repo
Current context updated registry with nrt.ocir.io/<オブジェクト・ストレージのネームスペース>/fn-repo
Dockerにコンテナ・レジストリへの認証情報を設定し、ログインします。
docker login -u '<オブジェクト・ストレージのネームスペース>/fn-user' nrt.ocir.io
Password:
Login Succeeded!
作成したアプリケーション(ここではhelloworld-app
)に作成したファンクション(ここではmy-func
) をデプロイ(デプロイ時にコンテナイメージが作成され、OCIRへプッシュされる)。
fn deploy --app helloworld-app
Deploying my-func to app: helloworld-app
Bumped to version 0.0.6
Using Container engine podman
Building image nrt.ocir.io/nrxe3k7cw1gm/fn-repo/my-func:0.0.6 TargetedPlatform: amd64HostPlatform: amd64
..................
Using Container engine podman to push
Pushing nrt.ocir.io/<オブジェクト・ストレージのネームスペース>/fn-repo/my-func:0.0.6 to docker registry...Getting image source signatures
Copying blob 7211f2483774 done |
Copying blob f5f24e15a6d0 done |
Copying blob 1508d2f8d3a7 done |
Copying blob a7b34eff3525 done |
Copying blob b6b3ea7877e7 done |
Copying config d5b0caea1d done |
Writing manifest to image destination
Updating function my-func using image nrt.ocir.io/<オブジェクト・ストレージのネームスペース>/fn-repo/my-func:0.0.6...
Successfully created function: my-func with nrt.ocir.io/<オブジェクト・ストレージのネームスペース>/fn-repo/my-func:0.0.6
デプロイ時に以下エラーが発生する場合があります。
Deploying my-func to app: helloworld-app
Bumped to version 0.0.5
Using Container engine podman
Building image nrt.ocir.io/<オブジェクト・ストレージのネームスペース>/fn-repo/my-func:0.0.5 TargetedPlatform: amd64HostPlatform: amd64
Error during build. Run with `--verbose` flag to see what went wrong. eg: `fn --verbose CMD`
Fn: error running docker build: exit status 125
See 'fn <command> --help' for more information. Client version: 0.6.39
この場合、短縮名のコンテナイメージは解決できないことが原因で/etc/containers/registries.conf
で以下内容に変更すればエラー解消される可能性があります。
# enforcing→permissiveに変更
[registries]
short-name-mode = "permissive"
アプリケーションの詳細画面を確認すると、ファンクションが新たに作成されています。
作成したアプリケーション(ここではhelloworld-app
)の ファンクション(ここではmy-func
)を実行し、結果を取得します。
fn invoke helloworld-app my-func
30秒程度時間が経過したのち、スクリプト(ここではfunc.py
)で設定した内容が表示されます。
{"message": "Hello World"}
OCI FuctionsをPodman環境から実行する手順については以上となります。
引用ドキュメント等