Azure FunctionsでのRESTful APIの開発を楽にしたいと考えて調べたら、簡単な方法でFastAPIが使えることが分かりました。
備忘を兼ねて共有します。
注意
ここで紹介する方法で使用するパッケージ(Bonnette)は2021年3月現在、2019年8月を最後に更新されていません。
上記の理由から公開されたサービスの本番運用には向いていないかと思います。
この記事は個人レベルの簡単なアプリをAzure Functionsでぱぱっと無料で公開することを念頭に置いています。
前提条件
- Azure Functionsを利用できるAzureのサブスクリプションを持っていること
- もしなければここで作成できます
使うもの
- Pythonが動くAzure Functionsアプリ
- Bonnette
- その他Azure Functionsの開発に必要なもの
Bonnetteとは
- Azure Functions用のASGIアダプタです
- 受け取ったリクエストをASGIインスタンス向けに変換し、FastAPIが返したレスポンスをAzure Functions向けに変換します
- 乱暴な言い方をするとUvicornの代わりです
- 繰り返しになりますが、2021年3月現在このプロジェクトのレポジトリには THIS PROJECT IS UNMAINTAINED と記載されており、2019年8月を最後に更新されていません
Azure Functionsアプリの作成
当たり前ですが Python が動く設定でお好きなリージョンに作成してください。
バージョンは3.6以降しか選べないのでどれでも構いません。
VS Codeでプロジェクトを作成する
公式のチュートリアルを参考にローカルでプロジェクトを作成してください。
もし初めてであれば、Azureへのデプロイと初期状態での動作確認を行っておくことをお勧めします。
サンプルを見ながらコードを編集する
azure-functions-fastapi-asgi-exampleに素晴らしいサンプルがあります。
このレポジトリのURLを貼るだけで十分とか言っちゃいけない。
編集する点は以下の5点です。
-
host.json
-
"extensions"
以下をコピーして追加してください - これを追加することでURLに勝手に追加される"api"という文字列を消すことができます
-
-
requirements.txt
- bonnette と fastapi を追加してください
-
[function name]/__init__.py
-
fastapi/__init__.py
と置き換えてください -
Bonnette(app)
がFastAPIインスタンスをラップするための記述です
-
-
[function name]/main.py
-
fastapi/main.py
をコピーして配置してください - このファイルに FastAPI アプリケーションを記述します(もちろんファイルを分割しても構いません)
-
-
[function name]/function.json
-
["bindings"][0]
に"route": "{*route}"
を追加してください - この記述を追加することで、
<アプリ名>.azurewebsites.net
以降のすべてのパスをFastAPIで自由に使えるようになります
-
デプロイと動作確認
チュートリアルと同じ手順でAzure上にデプロイします。
<アプリ名>.azurewebsites.net
にアクセスして {"Hello": "World"}
と返ってくれば成功です。
まとめ
Bonnetteを使えばAzure Functions上でFastAPIが走ります。
個人で遊ぶ程度であればAzure Functionsは無料(2021年3月時点での情報)で使えますのでだいぶ捗りますね。
ちなみに
AWSのFaaSであるLambdaでも似たような方法でFastAPIを使えるようです。
その場合にはMangumというアダプタを使うようですが、AWSには詳しくないので名前を紹介するだけにします。
参考
- Bonnette(Github Repo)
- azure-functions-fastapi-asgi-example(Github Repo)
- クイックスタート: Visual Studio Code と Python を使用して Azure に関数を作成する