はじめに
こんにちは、技術一課の山中です。
本ブログでは 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 サービスと連携することでもっと複雑なアプリケーションも楽に作れそうです!