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 でしばらく待てばセットアップしてくれる。

参考

やってみて

まだまだ理解が足りなくてハマリポイントが多いので、EC2の小さいインスタンスにFlaskアプリを置いたら良いんじゃない?っていうもうひとりの自分との戦いになってきてる。

今はここからDynamoDBと接続するあたりで格闘中。