Serverless Framework で Flask app をデプロイする

記事タイトルとURLをコピーする

はじめに

こんにちは、技術一課の山中です。 本ブログでは Python の Web フレームワークである Flask を AWS に Serverless Framework を用いてデプロイしてみます。 今回は Amazon Linux 2 上で以下に沿って進めます。

Build a Python REST API with Serverless, Lambda, and DynamoDB

Flask とは

Flask は Python 用のマイクロ Web 開発フレームワークです。 標準で提供する機能を最小限にしているため、軽量でマイクロフレームワークと呼ばれています。


事前準備

事前に pyenvpyenv-virtualenv を使って仮想環境を用意しておきます。

$ pyenv virtualenv -p python3.7 3.7.1 flaskenv

また、 Serverless Framework も以下に従いインストールしておきましょう。

$ npm install serverless -g

新しいディレクトリと package.json を作成します。

$ mkdir my-flask-application && cd my-flask-application
$ pyenv local flaskenv
$ npm init -f

今回は以下 2 つのプラグインを利用します。

serverless-wsgi は API Gateway から Lambda へのリクエストを WSGI アプリ用に形式変換してくれるプラグインです。 Flask は WSGI アプリなので WSGI に変換してあげる必要があります。 serverless-python-requirements は自動で requirements.txt に記載した Python 用ライブラリ群をインストールし、パスを読み込んでくれます。

$ npm install --save-dev serverless-wsgi serverless-python-requirements

続いて main.py を作成し以下を記述します。

$ vim main.py
from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

これはルートパス / にリクエスがくると Hello World! を返すだけの単純な Flask アプリケーションです。 アプリケーションをデプロイするために serverless.yml も作成します。

$ vim serverless.yml
service: serverless-flask

plugins:
  - serverless-python-requirements
  - serverless-wsgi

custom:
  wsgi:
    app: main.app
    packRequirements: false
  pythonRequirements:
    dockerizePip: non-linux

provider:
  name: aws
  runtime: python3.7
  stage: dev
  region: ap-northeast-1

functions:
  app:
    handler: wsgi.handler
    events:
      - http: ANY /
      - http: 'ANY {proxy+}'

Lambda ファンクションのハンドラは custom ブロックにある wsgi セクションで指定しています。 今回は main.py の app オブジェクトがエントリーポイントとなっています。

最後に、 Flask パッケージを pip でインストールし、その内容を requirements.txt に出力します。

$ pip install flask
$ pip freeze > requirements.txt

デプロイ


$ sls deploy
Serverless: Generated requirements from /home/ec2-user/my-flask-application/requirements.txt in /home/ec2-user/my-flask-application/.serverless/requirements.txt...
Serverless: Installing requirements from /home/ec2-user/my-flask-application/.serverless/requirements/requirements.txt ...
Serverless: Using Python specified in "runtime": python3.7
Serverless: Packaging Python WSGI handler...
Serverless: Packaging service...
Serverless: Excluding development dependencies...
Serverless: Injecting required Python packages to package...
Serverless: Creating Stack...
Serverless: Checking Stack create progress...
.....
Serverless: Stack create finished...
Serverless: Uploading CloudFormation file to S3...
Serverless: Uploading artifacts...
Serverless: Uploading service .zip file to S3 (1.32 MB)...
Serverless: Validating template...
Serverless: Updating Stack...
Serverless: Checking Stack update progress...
.................................
Serverless: Stack update finished...
Service Information
service: serverless-flask
stage: dev
region: ap-northeast-1
stack: serverless-flask-dev
api keys:
  None
endpoints:
  ANY - https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev
  ANY - https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev/{proxy+}
functions:
  app: serverless-flask-dev-app
layers:
  None

試してみる

ブラウザを開き、 作成された API Gateway のエンドポイントへアクセスしてみましょう。

Hello World! が表示されます!

環境の削除

表示されることを確認したら、以下コマンドを実行しきれいに掃除しましょう。

$ sls remove

おわりに

Flask と Serverless Framework を利用することで簡単に Web アプリケーションを実装することができました。 AWS Lambda を利用しているので DynamoDB や他の AWS サービスと連携することでもっと複雑なアプリケーションも楽に作れそうです!