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"]
みたいに書くと取れます。