はじめに
この記事では、ローカルPCにインストールした Fn Project CLI を使用して、Oracle Cloud Infrastructure (OCI) Functions にPythonのサンプル関数をデプロイする手順を解説します。
OCI Functions をデプロイする方法として、下記3つあると思います。AWS Lambda をデプロイする場合と比較して紹介します。
- Fn Project CLI を使う (本記事で紹介)
- AWS Lambda デプロイ時に使う AWS SAM CLI と 近い機能を備えているのが、Fn Project CLI です。ローカルでの動作確認や、ローカルからデプロイを行えます。
- OCI DevOps を使う
- AWS Lambda デプロイを、AWS CodePipeline、AWS CodeBuild を使ってデプロイする流れを、OCI Functions で行いたい場合は、OCI DevOps で行えます。ソースコード・リポジトリ(GitHubやOCI Code Repositoriesなど)と連携し、CI/CDパイプラインを実現したい場合に使用できます。
- Terraform を使う
- OCI Functions はコンテナベースで動作します。事前にコードをDockerビルドし、OCI Container Registry (OCIR) にプッシュした後に、Terraform で、OCI Functions の定義を作成できます。
やること
- 前提
- OCIアカウント作成済み
- ローカルPCにDockerインストール済み
- ネットワーク(VCN)とOCIR(OCI Container Registry)の作成
- AWS Lambda は、VPC(Virtual Private Cloud) が必須ではないですが、OCI Functions はVCNが必須のため作成します。
- VCNと共に、サブネットを1つ、インターネットゲートウェイ も作成します。
- APIキーと認証トークンを作成
- OCIコンソールでAPIキーと認証トークンを発行し、OCI CLI をインストールして、ローカルPCにOCIのconfig(AWSで言うプロファイル)を作成します。
- Fn Project CLI のインストール
- Fn Project CLI コンテキスト (プロファイル) の設定
- OCIの向き先やOCIR(OCI Container Registry)を設定
- アプリケーションと関数の作成
- デプロイと動作確認
ネットワーク(VCN) の作成 と OCIR(OCI Container Registry)の作成
- OCIコンソールにログインし、仮想クラウド・ネットワーク の画面に遷移します。
- VCN作成します。
- サブネットを作成します。


- 名前:handson-functions-subnet1、IPv4 CIDRブロック:10.1.0.0/24

- パブリックサブネットを選択

- サブネット作成後のOCIDはコピーしておきます。OCI Functions で指定します。

- インターネットゲートウェイの作成と、ルート・ルールを設定します。


- 名前:handson-functions-igw





- ターゲットタイプ:インターネット・ゲートウェイ、宛先CIDRブロック:0.0.0.0/0、ターゲット・インターネット・ゲートウェイ:handson-functions-igw
- OCIR作成後の画面で、OCIDをコピーしておきます。後続作業で使用します。

APIキーと認証トークンを作成
- OCIへの接続は、ドメイン、グループを作成し、ポリシーを絞ることが推奨されますが、個人のOCIアカウントを使うため、Administrator 権限のままOCIへ接続しますので、ドメイン、グループ、ポリシーの設定は省略します。
- APIキーを発行します。



秘密鍵と公開鍵をダウンロード指定します。

構成ファイルはコピーしておきます。

- 認証トークンを発行します。発行した認証トークンはコピーしておきます。


- OCI CLI のインストール
- Oracle Cloud Infrastructureドキュメント – OCI CLIのインストール に、沿って各OS毎の手順でインストールします。
- インストールされたか確認します。
oci --version 3.90.2
- OCIのプロファイル作成
# OCI設定ディレクトリの作成
mkdir ~/.oci
# ダウンロードした秘密キーを移動
mv XXXXX.pem ~/.oci/
# パーミッションの変更
chmod 600 ~/.oci/XXXXX.pem
# 空ファイルを作成した後、事前にコピーした構成ファイルを貼り付けます。key_file=~/.oci/XXXXX.pem に更新します。
touch ~/.oci/config
chmod 600 ~/.oci/config
# APIキーで、OCIに接続する確認。接続OKの場合はリージョンの一覧が取得できます。
oci iam region list
{
"data": [
省略...
{
"key": "NRT",
"name": "ap-tokyo-1"
},
省略...
]
}
Fn Project CLI のインストール
- ローカルPCで下記コマンドを実行します。
curl -LSs https://raw.githubusercontent.com/fnproject/cli/master/install | sh
Oracle Cloud Infrastructureドキュメント – Fn ProjectのCLIのインストール に、沿っています。
– インストールされたか確認します。
fn version Client version is latest version: 0.6.63 Server version: ?
Fn Project CLI コンテキスト (プロファイル) の設定
- Fn Project の向き先(コンテキスト)を OCI に設定します。設定値は~/.fn に出力されます。
# OCI用のコンテキストを作成(名前は任意、ここでは handson-functions-context) fn create context handson-functions-context --provider oracle # 作成したコンテキストを使用 fn use context handson-functions-context # コンパートメントOCIDの設定 fn update context oracle.compartment-id <あなたのコンパートメントOCID> # API URLの設定(例は東京リージョンの場合) fn update context api-url https://functions.ap-tokyo-1.oraclecloud.com # OCIRの設定 fn update context registry nrt.ocir.io/<テナンシ・ネームスペース>/handson-functions-repository
アプリケーションと関数の作成
- OCI上に、関数を束ねる「アプリケーション」という箱を作成します。
fn create app handson-functions-app --subnet-id <サブネットのOCID>
- 関数の初期化 PythonのHelloWorld関数の雛形を作成します。
fn init --runtime python hello-python cd hello-python ls func.py func.yaml requirements.txt
- ローカルでテストします。
# ローカルサーバー(Fn Server)を起動する
fn start
# ローカルサーバー(Fn Server)を起動したターミナルとは別のターミナルで以下実行
# ローカル用の設定(コンテキスト)に切り替える
fn use context default
fn create app handson-functions-app-local
# ローカルサーバーへデプロイ
fn deploy --app handson-functions-app-local --local
# ローカルでの実行確認
fn invoke handson-functions-app-local hello-python
{"message": "Hello World"}
デプロイと動作確認
- Dockerログインを実行 (ここで認証トークンを使用します)
docker login nrt.ocir.io Username: には、<テナンシ・ネームスペース>/<あなたのユーザー名> を入力します。 Password: には、認証トークンを入力します。 Login Succeeded と表示されたら、ログイン成功です。
- ローカルテスト 用の向き先を、OCI に設定します。
fn use context handson-functions-context
- デプロイ
fn -v deploy --app handson-functions-app Successfully created function: hello-python with nrt.ocir.io/nrno7eacl6zl/handson-functions-repository/hello-python:0.0.6 と表示されたらデプロイ成功です。
- OCI上で実行 (Invoke)
fn invoke handson-functions-app hello-python
{"message": "Hello World"}
と表示されたら実行成功です。
※ インターネットゲートウェイの作成とルート・ルールの設定を忘れているとここで、下記エラーとなります。
Error invoking function. status: 502 message: Failed to pull function image
最後に
OCI Functions のローカル実行、デプロイ、デプロイしての実行を行いました。
ローカル実行、デプロイの手順だけなら(機能の違いは置いておいて)、AWS Lambda と比べると、下記あたりに違いを感じました。
- VCNが必須
- ローカル実行時、ローカルサーバー(Fn Server)を起動して、コード修正したらローカルサーバーへデプロイする
- コンテキストの向き先をローカル、OCIを切替える
手元で気軽に試せる一方、実運用でCI/CDパイプラインを組む場合はOCI DevOps、Infrastructure as Codeで管理したい場合はTerraformといった選択肢もあります。まずはFn Project CLIで感覚を掴み、用途に応じて使い分けていくのがよさそうです。




