前回の内容
database.py
import boto3
from botocore.exceptions import ClientError
# Get the service resource.
dynamodb = boto3.resource('dynamodb')
# Instantiate a table resource object
table = dynamodb.Table('todos')
def get_items():
try:
response = table.scan()
except ClientError as e:
print(e.response['Error']['Message'])
else:
return response['Items']
def create_item(item):
try:
response = table.put_item(Item=item)
except ClientError as e:
print(e.response['Error']['Message'])
else:
return response
main.py
from fastapi import FastAPI
from mangum import Mangum
from starlette.middleware.cors import CORSMiddleware
from .models import Item
from .database import get_items, create_item
app = FastAPI(root_path="/dev")
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # or ["*"] for all origins
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
@app.get("/todo/")
async def read_items():
items = get_items()
return items
@app.post("/todo/")
async def add_item(item: Item):
response = create_item(item.dict())
return response
handler = Mangum(app)
models.py
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: str = None
completed: bool = False
deployしてみる
- AWSの設定は、割愛
- デプロイコマンド
serverless deploy
- リソースの削除
serverless remove
結果の確認
詰まった点
- DynamoDBへの書き込み権限(デプロイ後に手動で付け足した。。。)
- 困ったらCloudWatchでログを確認(ローカルで動作確認していないため、、)、
- おそらく、環境構築が一番つらい。。
- Dockerを起動しておく必要がある
- CORSの設定 serverless.ymlとFastAPI側にCORSの設定を追加する必要がある
- FastAPIのCORSの設定
最後に
- Pythonは、簡潔にかけて、すごい楽しい。
- 最近は、業務でソースを書いていないから、書けて満足した
- AWSは、もっと学習して活用していきたいと改めて思った
- 業務では、サーバレスアーキテクチャをあまり、取り入れてはいないが、ネットワークを構築しないで良いのは非常に楽
- Docker等を用いて、ローカルでもテストできるような環境をつくるべきだったと、ちょっと後悔した。。
- serverless frameworkをfrontendでも作成したが、frontendとbackendでそれぞれ別のバージョンで動かす必要がある(バグなのか、環境のせいなのか不明)
何かあれば、Twitter @Kazu_e_aws にDMいただけますと、幸いです。