はじめに

この記事では、ローカル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-vcn、IPv4 CIDRブロック:10.1.0.0/16、DNS解決:OFF を設定


  • サブネットを作成します。

  • 名前: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作成します。

  • OCIR作成後の画面で、OCIDをコピーしておきます。後続作業で使用します。

APIキーと認証トークンを作成

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



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

    構成ファイルはコピーしておきます。
  • 認証トークンを発行します。発行した認証トークンはコピーしておきます。

  • OCI CLI のインストール
  • インストールされたか確認します。
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で感覚を掴み、用途に応じて使い分けていくのがよさそうです。