- 公開日:2018年11月25日
- 最終更新日:2018年11月25日
記事概要
Aws lambdaでflaskアプリをdeployする方法を記載した記事です。
記事の対象者
- Aws lambdaでflaskをdeployしたい
- flaskを使った実装を理解している
環境
- flask
- python3.6
- aws lambda
- zappa
- doorkeeper 16.1.0
flaskアプリ作成の準備
アプリ構築用のフォルダを作成します。
mkdir flask-app
続いて仮想環境を構築します。Zappaを使ってbuildとdeployをするので、仮想環境の構築が必須になります。
仮想環境の構築には、virtualenvを使います。virtualenvはPythonの仮想的な環境を作ることができます。
Zappaがpyenvでdeployできるかどうかは確認していません。
virtualenvは、プロジェクトごとにPythonのバージョンを変えたり、必要なパッケージを分けてインストールして動かす事もできます。
cd flask-app/ $ virtualenv .env Using base prefix '/Users/{user_name}/.pyenv/versions/3.6.3' New python executable in /Users/{user_name}/workspace/flask-app/.env/bin/python3.6 Also creating executable in /Users/{user_name}/workspace/flask-app/.env/bin/python Installing setuptools, pip, wheel... done.
仮想環境に入ります。
source .env/bin/activate (.env)
terminalのプロンプトの最初が(.env)に変わってれば入れています。
確認のために仮想環境を出ます。
deactivate
terminalのプロンプトから(.env)が消えていれば、仮想環境を出ています。
flaskアプリの作成
アプリを作成します。requirements.txtを作成します。
// 仮想環境に入る source .env/bin/activate touch requirements.txt
requirements.txtに必要なパッケージを記載します。
flask zappa
ライブラリをpipでinstallします。
pip install -r requirements.txt
Hello worldのアプリを作成します。
from flask import Flask, jsonify app = Flask(__name__) @app.route('/') def hello_world(): return jsonify({"message": "Hello World!"}) if __name__ == '__main__': app.run()
ローカルで動作することを確認します。
http://localhost:5000/でブラウザにアクセスします。
{"message":"Hello World!"}
問題ありませんね。
flaskアプリをlambdaにdeploy
ZAPPAを使います。
$ zappa init // 全てデフォルト
zappa_settings.jsonが作成されていることを確認します。
$ ls -l total 24 -rw-r--r--@ 1 edy staff 178 11 24 21:57 app.py -rw-r--r-- 1 edy staff 11 11 24 21:49 requirements.txt -rw-r--r-- 1 edy staff 240 11 24 23:09 zappa_settings.json
内容を確認すると、色々と設定が記載されているはずです。
deployします。
zappa deploy dev
deployします。
The role defined for the function cannot be assumed by Lambdaというエラーが表示されて
deployに失敗することがありますが、何回か叩くとうまくいくはずです。
URLが返却されたらURLをブラウザで叩いてみてください。
{"message":"Hello World!"}
上手くいきました。
flaskアプリをlambdaから削除
削除もコマンドで行えます。
zappa undeploy
これで削除されます。便利ですね。
まとめ
lambdaを使うと低コストでサーバーを利用することができます。
シンプルなAPIを作成するなら、これで十分です。機械学習のAPIとかなら、十分ですね。いやー、凄い時代になりました。
以上です。