今回は、Deta cloudというサービスについて触れていきます。
またDeta cloudを使って、簡単にWeb APIを公開する方法を紹介致します。
1.FAST APIとは
まずDeta cloudを利用するにあたり、FAST APIを利用します。
Pythonの標準である型ヒント(type hint)に基づいてPython3.6以降でAPIを構築するための、モダンで、高速(パフォーマンス)なWebフレームワークです。
※高度な技術者向けよりかは、API開発初学者向けの特徴です。
FAST API主な特徴
- 直観的でわかりやすい書き方
- 公式ドキュメントの情報が豊富
- 自動ドキュメント生成機能がすごい(Swagger UIと連携)
- バリデーション機能の実装が簡単(type hintが肝心)
2.Deta cloudとは
代表的なクラウドサービスには、AWS、 Azure、 GCPがあるが、それよりももっと簡単にホスティングできるサービスです。
またAWS,Azure,GCPは無料利用枠があるものの、期間や一定使用量を超えたら、それ以降は従量課金となるが、Deta cloudは無料で利用することが可能である。(アカウント作成時クレカ登録不要)
FAST APIが推奨しているDeta Cloudにデプロイしてみます。
Deta にアカウントを作成
「Join Deta」からアカウントを作成していきます。
username、 password、 emailを適宜入力して「Sign Up」へ進みます。
無事アカウント作成できるとメールが受信されます。
受信Boxにない場合は、迷惑メールに入っていないか確認するとよいかと思います。
※Slackへの招待もメールで来ますが、SlackはDetaのcommunity channelなので、Slackへ入っても、アカウントが認証されないので、注意が必要です。
メール内のリンクから、Deta のdefaultページが表示されれば、OKです。
3.サンプルAPIを用意する
必要なファイルの用意をします。
requirements.txt
fastapi
main.py
from fastapi import FastAPI from fastapi.responses import JSONResponse from pydantic import BaseModel from deta import Deta import json # "project key" is necessary in local, but it's not on Deta base deta = Deta() users = deta.Base("fastapi-crud") app = FastAPI() class User(BaseModel): name: str age: int hometown: str class UserUpdate(BaseModel): name: str = None age: int = None hometown: str = None @app.get("/") def index(): return {"message": "hello world"} @app.get("/users") def read_user(): return next(users.fetch()) @app.post("/users", status_code=200) def create_user(user: User): user = users.put(user.dict()) return json.dumps(user) @app.get("/users/{uid}") def read_user(uid: str): user = users.get(uid) if user: return user res = JSONResponse({"message": "user not found"}, status_code=404) return res @app.patch("/users/{uid}") def update_user(uid: str, uu:UserUpdate): update = {k:v for k,v in uu.dict().items() if v is not None} try: users.update(update, uid) return users.get(uid) except Exception: return JSONResponse({"message": "user not found"}, status_code=404) @app.delete("/users/{uid}") def delete_user(uid: str): users.delete(uid) return JSONResponse({"message": "user is deleted"}, status_code=200)
userテーブル(名前:fastapi-crud)を作って、CRUD用のmethodをそれぞれ用意しています。userを新規作成するpost methodでは、insertでもできるようですが、putの方が早いとドキュメントには記載があります。
Deta baseでは、新規データが作成されるとkey(ユニークなID)が自動採番されます。
patchにてuser情報をupdateする場合、uidをkeyとしてデータを更新するようにしています。
参考動画: Building a CRUD using FastAPI + Deta Base on Deta Micros
ローカル環境でも、確認することは可能ですが、project key が必要です。
deta = Deta("project key")
簡易サーバーを立ち上げるコマンドは以下になります。
uvicorn deploy_api.main:app --reload
Deta にログインして、deployした確認がDeta cloud上でできるので、次に紹介する方法で、Deta cloudで見た方が早いかもしれません。
4.Deta cloudにサンプルAPIを公開する
Deta へデプロイしてWeb APIを公開するには、Deta CLIをインストールする必要があります。
Detaコマンドにて、Deta cloudへWeb APIをデプロイできます。
Deta Space CLIのインストール
DetaからDeta Spaceにサービス名が変わっているため、それに応じて、CLIのURIも変更されています。(2023/10/15時点)
※これ以降の画像スクショは、Deta CLIのものになるので、古いです。なので雰囲気だけ掴んでもらえればと思います。
MacとWindowsではコマンドが異なります。
Windows
iwr https://get.deta.dev/cli.ps1 -useb | iex ↓ iwr https://deta.space/assets/space-cli.ps1 -useb | iex
Mac/Linux
curl -fsSL https://get.deta.dev/cli.sh | sh ↓ curl -fsSL https://get.deta.dev/space-cli.sh | sh
無事インストールできたら、detaコマンドを確認します。
deta help
Detaへlogin
deta login
※VSCodeのターミナル上だとうまく行かなかったため、Windowsのpowershell上で実行してloginしてます。
デフォルトのブラウザが立ち上がり、Detaへのログインが求められます。
作成したアカウントでログイン後、ターミナル上の表示が「Logged in successfully」になります。
Deta への deploy
deta new
または
deta new --python
※「deta new」でうまくいかない場合は、「deta new –python」でデプロイできるかと思います。
エンドポイントの確認
https://xxxxx.deta.dev/
※サブドメイン(xxxxx部分)があなたの専用のものになります
これで、Deta側へのデプロイができています。
すごく早くて簡単にできてしまうので、便利です!
ローカルで作成していたフォルダ名がDetaの画面上に表示されることが確認できます。
デプロイされたWeb APIの確認
生成されたエンドポイント(URL)にdocsまたはredocをつけると、自動生成されたドキュメントを見ることができます。
またAPIを試すことができます。
https://xxxxx.deta.dev/docs
正常にデプロイされると、以下のような感じで、定義されているmethodのドキュメントを見ることができます。
POSTを選んでテストしてみます。
json形式で、適宜入力して、「Execute」で結果を確認します。
200が返ってきて、bodyの結果もよさげです。
Deta 側でも確認できます。
apiリクエストされると自動的に、テーブルおよびデータが作成されます。
docs側でリクエストしたデータが作成されていることがわかります。
その他のコマンド
コードを再度デプロイする場合
deta deploy
deta への変更を常に監視する場合
※ローカルで編集した内容が即時、Deta側へ反映されます
deta watch
5.まとめ
簡易的なWeb APIを作成して、動作確認をするのに向いています。
Databaseを利用する場合は、Deta BaseにてNoSQLでテーブル作成とCRUD操作はできるものの、複雑なクエリはまだ難しいのかと思います。
Driveには10GBまでファイルをアップロードできるので、画像など多く扱いたい場合に結構良さそうです。