Serverless FrameworkとFlaskでWeb APIを作りかけた
最近ちょっとAPIのアプリケーションを置き換えてみようかなと思っていて、AWSのサービスで作れたらいいなと思ったので、思い出しながらServerless Frameworkで作りかけました。
AWS SAMなんかもあるんだけど、もう少し情報ありそうなこっちをやっていくことに。
ツール
- Serverless Framework 1.67.0
PythonとNode.jsが使えて、Serverless Frameworkのインストールが終わっていること前提です。
準備
Node.jsで作る記事が多いのですが、今後の事も考えてPythonで書いています。
Serverless Framework のプラグインを導入
$ npm init -y
$ npm install --save-dev serverless-wsgi serverless-python-requirements
必要パッケージのインストール
# Pythonの仮想環境を有効化 venv とか
$ pip install boto3 flask
$ pip freeze > requirements.txt
雛形を生成
テンプレートを使って雛形を生成できる。ありがたい時代。
$ sls create --template aws-python --path myService
セットアップはこの辺に載ってる。
参考: Hello World Python Example
Web APIを構築
設定ファイルを作成
service: mealselect-api
plugins:
- serverless-python-requirements
- serverless-wsgi
custom:
wsgi:
app: main.app
packRequirements: false
pythonRequirements:
dockerizePip: non-linux
provider:
name: aws
runtime: python3.8
stage: dev
region: ap-northeast-1
package:
exclude:
- __pycache__
- .vscode
- bin/**
- venv
- .envrc
- node_modules
- README.md
functions:
app:
handler: wsgi_handler.handler
timeout: 30
events:
- http: ANY /
- http: 'ANY {proxy+}'
FlaskでJSONを返すAPIを作成
コマンドでひな形を生成した際は、 handler.py ができる。
ただこれは別名でもいいらしいので、わかりやすいように main.py を作る。
from flask import Flask, jsonify
app = Flask(__name__)
app.config["JSON_AS_ASCII"] = False
@app.route('/')
def hello():
body = {
"message": "Go Serverless v1.0! Your function executed successfully!",
}
response = {
"body": json.dumps(body)
}
return jsonify(response), 200
あとは、 $ sls deploy
でしばらく待てばセットアップしてくれる。
参考
- Build a Python REST API with Serverless, Lambda, and DynamoDB
- Serverless Framework で Flask app をデプロイする – サーバーワークスエンジニアブログ
- serverless frameworkでAWSにサーバレスなAPIサーバーを作る - Rails Webook
やってみて
まだまだ理解が足りなくてハマリポイントが多いので、EC2の小さいインスタンスにFlaskアプリを置いたら良いんじゃない?っていうもうひとりの自分との戦いになってきてる。
今はここからDynamoDBと接続するあたりで格闘中。