https://github.com/tkote/fn-fastapi
Fn / OCI Function without FDK, with FastAPI
https://github.com/tkote/fn-fastapi
fastapi fdk fn oci-functions
Last synced: 25 days ago
JSON representation
Fn / OCI Function without FDK, with FastAPI
- Host: GitHub
- URL: https://github.com/tkote/fn-fastapi
- Owner: tkote
- Created: 2021-05-09T09:01:46.000Z (about 5 years ago)
- Default Branch: main
- Last Pushed: 2021-05-10T01:52:45.000Z (about 5 years ago)
- Last Synced: 2025-07-25T23:42:56.214Z (11 months ago)
- Topics: fastapi, fdk, fn, oci-functions
- Language: Python
- Homepage:
- Size: 9.77 KB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Functions without FDK
## Fn (OCI Functions) の Function を FDK を使わずに作成する方法 - Python/FastAPI 編
FDK (Function Development Kit) を使わずに Function を作る方法として「 [netty と reactor-netty で実装してみた](https://github.com/tkote/fn-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。ここでは簡易的なデモ実装をしている。
```python
@app.post('/call')
async def post_call():
... 実際の処理 ...
```
Fn/Functions がどういう仕様で Unix Domain Socket を使ってコンテナと通信しているかについては、前述の netty/reactor-netty 編を参照されたし。
## ビルド & 実行
* ローカルで実行
```bash
# 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 を作成 & 実行
```bash
# 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はインストール済みという前提で
```bash
# 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 が作成されている前提で
```bash
# 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
```