zappaを使ってLambdaにflaskアプリをデプロイする

zappaを使ってflaskアプリをデプロイする。

anacondaで仮想環境を作成、flaskを入れて適当なアプリを作る。

hello.py

from flask import Flask

app = Flask(__name__)


@app.route("/")
def hello_world():
    return "<p>Hello, World!</p>"


if __name__ == "__main__":
    app.run(debug=True)

問題なくローカルで動作することを確認。

次にzappaを入れる。

anacondaではパッケージが出てこなかったのでpipを使う。

pip install zappa

AWSの認証情報が書かれたファイルがMacに存在することを確認。

認証情報とはIAMユーザかRootユーザのアクセスキーとシークレットキーのことである。

cat ~/.aws/config

zappaの初期化をする。

zappa init

以下のエラーが発生する場合には、環境変数を設定すれば解決した。

StackOverflowで調べてみると、環境変数VIRTUAL_ENVに「which python」で得られる結果の1部(仮想環境の情報)を追加すれば良いらしい。

https://stackoverflow.com/questions/46164054/using-zappa-as-a-conda-user

多分、zappaはvirtualenv前提で作られているから、anacondaの場合には手動で環境変数を追加する必要があると思われる。

export VIRTUAL_ENV=/opt/anaconda3/envs/serverless

対話形式で質問に答えていくと以下のような設定ファイルができる。

{
    "dev": {
        "app_function": "hello.app",
        "profile_name": "eb-cli",
        "project_name": "flask-serverles",
        "runtime": "python3.7",
        "s3_bucket": "zappa-bqff0mxbf"
    }
}

デプロイしてみる。

zappa deploy dev

リージョン指定のエラーが出る。

botocore.exceptions.NoRegionError: You must specify a region.

設定ファイルにリージョンを追記する。

        "app_function": "hello.app",
        "aws_region": "us-west-2",
        "profile_name": "eb-cli",

再度デプロイすると成功した。