AWS LambdaにPython(Flask)で作ったプロジェクトを手動でデプロイする

2022/02/05

#Python

AWSのLambdaにFlaskで作ったWEB APIをzipファイルアップロードでデプロイしてAPI Gatewayの設定をするまでを備忘録として残しておきます。

ベースになるFlaskプロジェクト


ルートアクセス → {msg=”hello”}
/get?msg=メッセージ → {msg=メッセージ}
/post(POST:msg=メッセージ) → {msg=メッセージ}
お試しで↑みたいなAPIを作ります

from flask import Flask, request, jsonify

app = Flask(__name__)
@app.route("/",methods=["GET"])
def root():
    return jsonify(msg="hello")

@app.route("/get/",methods=["GET"])
def get():
    return jsonify(msg=request.args.get('msg')

@app.route("/post/",methods=["POST"])
def post():
    return jsonify(msg=request.form['msg'])

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


Lambda仕様に書き換え


from flask import Flask, request, jsonify
import awsgi

app = Flask(__name__)
@app.route("/",methods=["GET"])
def root():
    return jsonify(msg="hello")

@app.route("/get/",methods=["GET"])
def get():
    return jsonify(msg=request.args.get('msg')

@app.route("/post/",methods=["POST"])
def post():
    return jsonify(msg=request.form['msg'])

def lambda_handler(event,context):
    return awsgi.response(app, event, context)


awsgiというuWSGI的なライブラリを追加してlambda_handlerからFlaskのアプリを呼び出せるように書き換えます。
またファイル名をlambda_function.pyにする必要があります。
requirements.txtも必要に応じて用意します。

Flask
aws-wsgi


ライブラリの用意・圧縮


使用するライブラリを同じフォルダにインストールする必要があるので下みたいにpip installします。

pip3 install -r requirements.txt -t ./


インストールできたら設置されたライブラリファイル・プログラム諸々をまとめてzip形式に圧縮します。
ツールはOS標準でも何でもおそらく問題ないです。

AWSへデプロイ


AWSのコンソールから普通にPythonで空の関数を作成してzipファイルをアップロード→デプロイします。

API Gatewayでは下みたいな設定でrest apiを作成します。

1.メゾットを作成→any
2.anyにlambdaの関数を紐付け&「lambdaプロキシ統合の使用」にチェック
3.anyのメゾットレスポンスから200を削除
4.リソースを作成→プロキシリソースとして設定する→lambda関数を紐付け

後はデプロイで普通にFlaskで作ったAPIを外から扱えるようになります。

ついでにメモ-IPアドレスを取得


ヘッダーのX-Forwarded-Forに入っているので

request.headers["X-Forwarded-For"]


みたいに書くと取れます。


関連記事:Python

Python3で Firebase Realtime Databaseを使ってみる

Python

Python3からFirebase Realtime DatabaseにTimestampを追加する方法

Python

Python3でFirebaseのtimestampをDatetimeに変換する方法

Python