1
0

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 をPodman 環境から実行する

Last updated at Posted at 2025-03-20

今回やりたいこと

タイトルの通りコンピュート・インスタンス(以下インスタンス)内に作成したPodman環境から、OCI Functions(以下ファンクション)を実行できるか検証を行います。
スクリーンショット 2025-03-20 9.08.37.png

実行環境

今回の実行環境は以下の通りです。

ネットワーク

  • VCN:VCN_10.0.0.0/16
    • パブリック・サブネット:Pubsub_10.0.0.0/24
    • インターネット・ゲートウェイ:IGW(パブリック・サブネットにアタッチ)
  • ルート表(パブリック・サブネット用)​
    • 宛先CIDR:0.0.0.0/0
    • ターゲット:IGW​
      ※ セキュリティ・リストはデフォルト設定のまま使用します。

ポリシー

以下の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コンソール画面左上のナビゲーションメニューから「アイデンティティとセキュリティ」→「コンパートメント」をそれぞれ選択します。
スクリーンショット 2025-03-20 9.22.22.png

コンパートメントの作成」を選択します。
スクリーンショット 2025-03-20 9.24.00.png

名前・説明ともに任意ですが、ここでは以下リソース名を入力、「コンパートメントの作成」を選択します。

  • 名前:fn-compartment
  • 説明:ファンクション用コンパートメント
    スクリーンショット 2025-03-20 9.27.11.png

fn-compartmentコンパートメントが作成されます。
スクリーンショット 2025-03-20 9.34.13.png

2.ネットワークの作成

コンパートメントの作成後、VCNを作成します。
今回はVCNウィザードからではなく、手動でVCNを作成します。

VCN

OCIコンソール画面左上のナビゲーションメニューから「ネットワーキング」→「仮想クラウド・ネットワーク」をそれぞれ選択します。
スクリーンショット 2025-03-20 9.37.58.png

作成したコンパートメント(ここではtf-compartment)が選択されていることを確認、「VCNの作成」を選択します。
スクリーンショット 2025-03-20 9.39.44.png

ここでは以下リソース名を入力、「VCNの作成」を選択します。

  • 名前:VCN_10.0.0.0/16
  • IPv4 CIDR ブロック:10.0.0.0/16
    ※他の設定は任意で問題ございません。
    スクリーンショット 2025-03-20 9.44.51.png

VCNが作成されます。
スクリーンショット 2025-03-20 10.31.01.png

サブネット

サブネットの作成」から、今回はパブリック・サブネットを作成します。
スクリーンショット 2025-03-20 10.31.01.png

ここでは以下リソース名を入力、「サブネットの作成」を選択します。

  • 名前:Subpub_10.0.0.0/24
  • IPv4 CIDR ブロック:10.0.0.0/24
  • サブネット・アクセス:パブリック
    ※他の設定は任意で問題ございません。
    スクリーンショット 2025-03-20 10.34.32.png
    スクリーンショット 2025-03-20 10.35.17.png

状態が「プロビジョニング中」→「使用可能」に遷移、サブネットが作成されます。
スクリーンショット 2025-03-20 10.36.44.png

インターネット・ゲートウェイ

インターネット・ゲートウェイ」→「インターネット・ゲートウェイの作成」から作成を行います。
スクリーンショット 2025-03-20 10.37.44.png

ここでは名前をIGWとし、「インターネット・ゲートウェイの作成」を選択します。
スクリーンショット 2025-03-20 10.38.40.png

インターネット・ゲートウェイが作成されます。
スクリーンショット 2025-03-20 10.39.11.png

ルート表

ゲートウェイの作成後、パブリック・サブネット用のルート表を作成します。
ルート表」→「ルート表の作成」を選択します。
スクリーンショット 2025-03-20 10.41.13.png

ここでは以下を入力、「作成」を選択します。

  • 名前:RT-Pub
  • ルート・ルール
    • ターゲット・タイプ:インターネット・ゲートウェイ
    • 宛先CIDRブロック:0.0.0.0/0
    • ターゲット・インターネット・ゲートウェイ:IGW
      ※他の設定は任意で問題ございません。
      スクリーンショット 2025-03-20 10.44.50.png

ルート表が作成されます。
スクリーンショット 2025-03-20 10.45.47.png

パブリック・サブネットのルート表はデフォルトのルート表を使用しているため、作成したルート表に置き換える必要があります。
サブネットの詳細画面の「編集」を選択します。
スクリーンショット 2025-03-20 10.47.44.png

ルート表を作成したリソースに変更、「変更の保存」を選択します。
スクリーンショット 2025-03-20 10.49.01.png

状態が「UPDATING」→「AVAILABLE」に遷移、ルート表が変更されます。
スクリーンショット 2025-03-20 10.50.14.png

ネットワーク関連のリソース作成については以上です。
なお、NSGやセキュリティリストは、必要に応じて適宜設定してください。

3.ファンクションの作成

コンテナ・レジストリの作成後、ファンクションを作成します。
OCIコンソール画面左上のナビゲーションメニューから「開発者サービス」→「アプリケーション」をそれぞれ選択します。
スクリーンショット 2025-03-20 10.57.05.png

アプリケーションの作成」を選択します。
スクリーンショット 2025-03-20 11.07.03.png

ここでは以下を入力、「作成」を選択します。

  • 名前:helloworld-app
  • VCN:VCN_10.0.0.0/16
  • サブネット:Subpub_10.0.0.0/24
    ※他の設定は任意で問題ございません。
    スクリーンショット 2025-03-20 11.08.20.png

ファンクションが作成されます。
スクリーンショット 2025-03-20 11.11.17.png

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
# .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)のマイ・プロファイルから「認証トークン」→「トークンの生成」を選択します。
スクリーンショット 2025-03-20 12.47.48.png

任意の説明(ここでは「ファンクション用」)を入力、「トークンの生成」を選択します。
スクリーンショット 2025-03-20 12.50.35.png

Dockerのログイン時に必要となるため、「コピー」でトークンを控えておきます。
スクリーンショット 2025-03-20 12.51.25.png

ローカル・セットアップ

認証トークンの取得後、アプリケーションの詳細画面にある「Local setup」の手順を参考にセットアップを行います。
スクリーンショット 2025-03-20 12.33.22.png

最初に、ここでは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で以下内容に変更すればエラー解消される可能性があります。

/etc/containers/registries.conf
# enforcing→permissiveに変更
[registries]
short-name-mode = "permissive"

アプリケーションの詳細画面を確認すると、ファンクションが新たに作成されています。
スクリーンショット 2025-03-20 14.42.40.png

作成したアプリケーション(ここではhelloworld-app)の ファンクション(ここではmy-func)を実行し、結果を取得します。

fn invoke helloworld-app my-func

30秒程度時間が経過したのち、スクリプト(ここではfunc.py)で設定した内容が表示されます。

実行結果例
{"message": "Hello World"}

OCI FuctionsをPodman環境から実行する手順については以上となります。

引用ドキュメント等

1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?