はじめに
こんにちは、技術一課の山中です。 本ブログでは Python の Web フレームワークである Flask を AWS に Serverless Framework を用いてデプロイしてみます。 今回は Amazon Linux 2 上で以下に沿って進めます。
Build a Python REST API with Serverless, Lambda, and DynamoDB
Flask とは
Flask は Python 用のマイクロ Web 開発フレームワークです。 標準で提供する機能を最小限にしているため、軽量でマイクロフレームワークと呼ばれています。
事前準備
事前に pyenv
と pyenv-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 サービスと連携することでもっと複雑なアプリケーションも楽に作れそうです!