FDK (Function Development Kit) を使わずに Function を作る方法として「 netty と reactor-netty で実装してみた 」を以前紹介したが、今回はその Python/FastAPI 編。使い慣れたフレームワークを使って Fnctions を開発したいという人は多いハズ。
Functions のロジックを実装しているもの (main.py)と、ASGI (Asynchronous Server Gateway Interface) 実装である uvicorn の起動や Fn/Functions の流儀に従ってソケットまわりのお世話をしているもの (fn-fastapi.py) の二つで構成されていて、fn-fastapi.py は全くいじる必要なし。
main.py で 通常 FastAPI で API を実装するのと同じように、/call
に対する POST リクエストを実装すればOK。ここでは簡易的なデモ実装をしている。
@app.post('/call')
async def post_call():
... 実際の処理 ...
Fn/Functions がどういう仕様で Unix Domain Socket を使ってコンテナと通信しているかについては、前述の netty/reactor-netty 編を参照されたし。
-
ローカルで実行
# preparation $ pip install fastapi $ pip install uvicorn # run server $ python fn-fastapi.py # call function $ curl --unix-socket /tmp/fnlsnr.sock -X POST -d 'Hello World!' http:/call
-
Docker image を作成 & 実行
# build $ docker build -t fn-fastapi:0.0.1 . # run server $ docker run --rm -it --name fn-fastapi -v /tmp:/tmp fn-fastapi:0.0.1 # call function $ curl --unix-socket /tmp/fnlsnr.sock -X POST -d 'Hello World!' http:/call
-
ローカル Fn Server で実行
Fn CLIはインストール済みという前提で
# start Fn server $ fn start # setup Fn CLI $ fn use context default # create app $ fn create app funcapp # deploy function $ fn deploy -app funcapp --local --no-bump -v # call function $ echo -n 'Hello World!' | fn invoke funcapp fn-fastapi
-
OCI Functions にデプロイ & 実行
OCI Functions で アプリケーション funcapp が作成されている前提で
# setup Fn CLI $ fn use context XXXXXX # deploy function $ fn deploy -app funcapp --no-bump -v # call functions $ echo -n 'Hello World!' | fn invoke funcapp fn-fastapi
# call OCI Functions
$ echo -n 'Hello World!' | fn invoke funcapp fn-fastapi
[REQUEST HEADERS]
host: localhost
user-agent: Go-http-client/1.1
transfer-encoding: chunked
accept-encoding: gzip
content-type: application/json
date: Sun, 09 May 2021 08:37:51 GMT
fn-call-id: 01F584D3CM1BT0010ZJ005T5M1
fn-deadline: 2021-05-09T08:43:16Z
oci-subject-id: ocid1.user.oc1..
oci-subject-tenancy-id: ocid1.tenancy.oc1..
oci-subject-type: user
opc-compartment-id: ocid1.compartment.oc1..
opc-request-id: /01F584D3AJ1BT0010ZJ005T5KR/01F584D3AJ1BT0010ZJ005T5KS
x-content-sha256: f4OxZX/x/FO5LcGBSKHWXfwtSx+j1ncoSt3SABJtkGk=
[REQUEST BODY]
Hello World!
OCI Functions で、サーバー起動から最初のリクエスト処理までのログ
ENV FN_LISTENER: unix:/tmp/iofs/lsnr.sock
actual: /tmp/iofs/lsnr.sock
phony: /tmp/iofs/ldyDK2Jn_lsnr.sock
INFO: Started server process [6]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on unix socket /tmp/iofs/ldyDK2Jn_lsnr.sock (Press CTRL+C to quit)
Ready to receive calls via /tmp/iofs/lsnr.sock -> ldyDK2Jn_lsnr.sock
INFO: - \"POST /call HTTP/1.1\" 200 OK