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

コード Flask

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"]

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

参考サイト

AWS LambdaでPython+Flask環境を作成する
AWS SAM + Lambda + Python + Flask の環境を作成する方法を調べたのでメモにします。 環境 $ docker --version Docker version 20.10.5, build 55c4c88 $ aws --version aws-cli/2.1.34 Python/3.8...
GitHub - slank/awsgi: A WSGI gateway for the AWS API Gateway/Lambda proxy integration
A WSGI gateway for the AWS API Gateway/Lambda proxy integration - GitHub - slank/awsgi: A WSGI gateway for the AWS API Gateway/Lambda proxy integration

コメント

タイトルとURLをコピーしました