はじめに
こちらでFn Projectのアーキテクチャを整理しましたが、これをもとにFn ProjectのマネージドサービスであるOCI Functionsのアーキテクチャを整理したいと思います。
事前準備
今回はFunctionsのクライアントとして、Oracle Linuxのインスタンスを使用します。
Docker, Fn CLIなど必要なパッケージはインストール済みです。
ポリシーの設定
以下のポリシーを設定します。
Allow service FaaS to use virtual-network-family in compartment <コンパートメント名>
Allow service FaaS to read repos in compartment <コンパートメント名>
VCNの作成
今回は作成済みのVCNを利用します。
OCIRの作成
今回はコンテナレジストリとしてOCIRを使用します。
事前に作成しない場合、Functionデプロイ時にルートコンパートメントにリポジトリが作成されます。
今回は以下のようにプライベートリポジトリを作成します。リポジトリ名は任意の名称/Function名
とします。
Functionsの作成、実行
アプリケーションの作成
OCIのコンソールからアプリケーションを作成します。
アプリケーション名、VCN、サブネットを以下のように指定します。
こちらを確認すると、アプリケーションを作成するとFn ServerもFunction単位で作成されるようです。
以降はアプリケーション作成後のコンソールのスタート・ガイド
にサンプルファンクションの実行手順がありますので、これに沿って設定します。
今回はローカル設定
の手順です。
Functionの初期化、雛形作成
引数に言語とFunction名を指定して雛形を作成します。
$ fn init --runtime go hello-func
Creating function at: ./hello-func
Function boilerplate generated.
func.yaml created.
$ ls -l hello-func/
total 12
-rw-r--r--. 1 opc opc 521 Jul 10 06:33 func.go
-rw-r--r--. 1 opc opc 152 Jul 10 06:42 func.yaml
-rw-r--r--. 1 opc opc 58 Jul 10 06:33 go.mod
$ cd hello-func/
Contextの設定
デフォルトでContextはLocalhostになっていますので、新しいContextを追加して、OCIに接続するように変更します。
$ fn create context lhr --provider oracle
Successfully created context: lhr
$ fn use context lhr
Now using context: lhr
$ fn list context
CURRENT NAME PROVIDER API URL REGISTRY
default default http://localhost:8080
* lhr oracle
FunctionをデプロイするコンパートメントのOCIDを設定します。
$ fn update context oracle.compartment-id ocid1.compartment.oc1..aaaaaaaamyemvazvbgl42f5pi7gzxxxxxxxxxxxxxxxxxxxxxxxxxxx
Current context updated oracle.compartment-id with ocid1.compartment.oc1..aaaaaaaamyemvazvbgl42f5pi7gzxxxxxxxxxxxxxxxxxxxxxxxxxxx
API URLを指定します。これはリージョンによって異なります。
$ fn update context api-url https://functions.uk-london-1.oraclecloud.com
Current context updated api-url with https://functions.uk-london-1.oraclecloud.com
Buildしたコンテナイメージを保存するリポジトリを設定します。
これは事前に作成したリポジトリからFunction名を除いて設定します。
$ fn update context registry lhr.ocir.io/orasejapan/lhr-functions-repo-01
Current context updated registry with lhr.ocir.io/orasejapan/lhr-functions-repo-01
確認します。
$ fn list context
CURRENT NAME PROVIDER API URL REGISTRY
default default http://localhost:8080
* lhr oracle https://functions.uk-london-1.oraclecloud.com lhr.ocir.io/orasejapan/lhr-functions-repo-01
Functionのデプロイ
OCIRにログインします。ログインする際のパスワードは認証トークンです。
認証トークンは事前に作成する必要がありますが、今回はこちらで作成したトークンを利用します。
$ docker login lhr.ocir.io
アプリケーション名を指定してFunctionをデプロイします。
$ fn deploy --app app01
Deploying hello-func to app: app01
Bumped to version 0.0.2
Using Container engine docker
Building image lhr.ocir.io/orasejapan/lhr-functions-repo-01/hello-func:0.0.2 ......................................
Updating function hello-func using image lhr.ocir.io/orasejapan/lhr-functions-repo-01/hello-func:0.0.2...
Buildされたコンテナイメージが指定したOCIRのリポジトリに保存されています。
fnコマンドでもアプリケーションとFunctionが確認できます。
$ fn list app
NAME ID
app01 ocid1.fnapp.oc1.uk-london-1.aaaaaaaaxp5k5v6q3wqqfbyctrqzsvofpxxxxxxxxxxxxxxxxxxxxxxxx
$ fn list f app01
NAME IMAGE ID
hello-func lhr.ocir.io/orasejapan/lhr-functions-repo-01/hello-func:0.0.2 ocid1.fnfunc.oc1.uk-london-1.aaaaaaaarbcpzevlocpdtpcn622ep4qnzcz4x27prmqtkeqswbpt5s6x7bhq
Functionの実行
以下のコマンドを実行してFunctionを実行します。
$ fn invoke app01 hello-func
{"message":"Hello World"}
Functionを実行すると以下のような流れでコードが実行されます。
- コンテナイメージのPull
- コンテナの実行
- コードの実行
- コンテナの削除
Functionが複数回実行された場合の動作は、以下のように実行されたタイミングによって異なります。
ファンクションの実行が終了し、アイドル状態の期間が経過すると、Dockerコンテナは削除されます。コンテナが削除される前に、OCIファンクションが同じファンクションに対する別のコールを受信すると、2番目のリクエストは同じ実行中のコンテナにルーティングされます。OCIファンクションが、実行中のコンテナ内で現在実行中のファンクションに対するコールを受け取ると、OCIファンクションは水平方向にスケーリングして、両方の着信リクエストを提供し、2番目のDockerコンテナが開始されます。