1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

OCI Functionsのアーキテクチャを理解する

Last updated at Posted at 2023-07-11

はじめに

こちらで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名とします。

スクリーンショット 2023-07-10 15.54.29.png

image.png

Functionsの作成、実行

アプリケーションの作成

OCIのコンソールからアプリケーションを作成します。
アプリケーション名、VCN、サブネットを以下のように指定します。

スクリーンショット 2023-07-10 15.56.29.png

こちらを確認すると、アプリケーションを作成するとFn ServerもFunction単位で作成されるようです。

image.png

以降はアプリケーション作成後のコンソールのスタート・ガイドにサンプルファンクションの実行手順がありますので、これに沿って設定します。
今回はローカル設定の手順です。

スクリーンショット 2023-07-10 15.58.19.png

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/

image.png

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

image.png

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のリポジトリに保存されています。

スクリーンショット 2023-07-10 15.51.06.png

image.png

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を実行すると以下のような流れでコードが実行されます。

  1. コンテナイメージのPull
  2. コンテナの実行
  3. コードの実行
  4. コンテナの削除

image.png

Functionが複数回実行された場合の動作は、以下のように実行されたタイミングによって異なります。

ファンクションの実行が終了し、アイドル状態の期間が経過すると、Dockerコンテナは削除されます。コンテナが削除される前に、OCIファンクションが同じファンクションに対する別のコールを受信すると、2番目のリクエストは同じ実行中のコンテナにルーティングされます。OCIファンクションが、実行中のコンテナ内で現在実行中のファンクションに対するコールを受け取ると、OCIファンクションは水平方向にスケーリングして、両方の着信リクエストを提供し、2番目のDockerコンテナが開始されます。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?