LoginSignup
1
1

More than 1 year has passed since last update.

AWSLambdaのようなFaaS「PyFuncApi」を作った話

Last updated at Posted at 2021-09-10

なぜ作ったのか

下記記事を書いていて、保存機能さえあれば
AWSLambdaやAzureFunctionsのようなFaaS(Function as a Service)と
同じようなものが出来そうだと思ったからです

技術スタック

  • 言語
    python

  • フレームワーク
    django

  • データベース
    Firebase RealtimeDatabase

コード

使い方

コードを登録

Bodyにコード(Python)を書いて、下記URLにPOSTします
同URLのGETで登録した値を取得できます

実行してからの登録になるので
構文エラーが無ければ登録できます

また、上書きされないように現状UPDATEは実装していません
/v1 など付けてバージョンを管理したほうが良いかもしれません

※こういうのが出来ますよ!という紹介なので
機密なコードやパスワードなどは入力しないでくださいね!

https://pyfuncapi.herokuapp.com/admin/api/{一意のURL}

「exec_input」変数が外部からの値入力
「exec_result」変数がWebApi実行時の戻り値
となります

例:
image.png

WebApiを実行

https://pyfuncapi.herokuapp.com/api/exec/{登録したURL}

bodyに入力した値がexec_inputに入ります
image.png

サンプルコード/サンプルAPI

フィボナッチ数列かどうかを判定するWebApi

bodyに数値を入力してPOSTします
https://pyfuncapi.herokuapp.com/api/exec/is-fibonacci

コード

is-fibonacci.py
def fib(n):
    if n > 1:
        return fib(n-1) + fib(n-2)
    return n

def main(exec_input):
    if exec_input == '':
        return
    num = int(exec_input)
    i = 0
    while True:
        i +=1
        fib_num = fib(i)
        if fib_num == num:
            return True
        if fib_num > num:
            return False


exec_result = main(exec_input)

人口動態調査 / 人口動態統計 月報(概数)WebApi

政府が公開しているオープンデータ(CSVファイル)をjsonに変換して返すWebApiです
https://pyfuncapi.herokuapp.com/api/exec/vital-statistics-survey-monthly

コード

monthly-traffic-accident.py
import csv
import json
import requests
import numpy

# https://www.e-stat.go.jp/stat-search/files?page=1&layout=dataset&toukei=00450011&cycle=1&stat_infid=000032115375&file_type=1&metadata=1&data=1
# 人口動態調査 / 人口動態統計 月報(概数)
# 

def main():
    datas = requests.get(
        "https://www.e-stat.go.jp/stat-search/file-download?statInfId=000032115375&fileKind=1")
    datas.encoding = "shift-jis"

    text = ""
    for line in numpy.array([s.split(',') for s in datas.text.splitlines()]).T:
        text += ",".join(line) + "\n"

    rows = []
    lines = text.splitlines()
    reader = csv.DictReader(lines[1:len(lines)], delimiter=',')
    for row in reader:
        rows.append(row)

    return ''.join(json.dumps(rows, ensure_ascii=False).split())

exec_result = main()

この記事を書いていて思ったこと

Knativeという超強いものがあったのを知りました・・・。

課題

セキュリティーがガバガバです
URLさえ知っていればコードが取得できてしまいます
(認証作れば良いんでしょうけど、今回はそこまで作り込みません・・・。)

あと、HeaderやステータスコードなどResponse自体を戻り値設定できるようにしたほうが良いなぁと思いつつ
レスポンスの値を作るのがめんどくさくなるのでBodyのみ指定できるようにしてあります

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