API gateway経由でLambdaでFlaskアプリをZappaなしでデプロイ
はじめに
今回は、API gateway経由でLambdaにFlaskアプリをZappaなしでデプロイする方法を勉強してみました。
Zappaなしでデプロイする利点として以下があげられます。
・カスタマイズ性
・自分でリソースを設定するので、エラーが特定しやすい
手順
①アプリをローカルで作成
ディレクトリ構成
test ーー app.py
|__ handler.py
app.py
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return {"message": "Hello from Lambda!"}
@app.route('/hello/<name>')
def hello_name(name):
return f'Hello, {name}!'
handler.py
from app import app
import serverless_wsgi
def lambda_handler(event, context):
return serverless_wsgi.handle_request(app, event, context)
必要なら、venvでapp.pyがflaskで動くか確認してみる。
②packageディレクトリにLambdaにもっていくlibraryパッケージをZipする。
- packageディレクトリにパッケージをインストール
pip install flask serverless-wsgi -t ./package
- packageディレクトリに移動して、パッケージをzip
Mac/Linux
cd package
zip -r ../deployment.zip .
cd ..
zip -g deployment.zip app.py handler.py
Windows PowerShell
cd package
Compress-Archive -Path * -DestinationPath ../deployment.zip
Compress-Archive -Path
:pathを指定して圧縮処理をする
*
:カレントディレクトリを指定
-DestinationPath ../deployment.zip
:圧縮先を指定
# 上の階層に戻る
cd ..
# アプリ本体(app.py と handler.py)を ZIP に追加(Updateモード)
Compress-Archive -Path app.py, handler.py -Update -DestinationPath deployment.zip
③Lambdaにzipファイルを送る
アップロード元を押して、先ほどの作ったdeployment ZIPファイルをアップロード
ハンドラ:handler.lambda_handlerに変更
- Lambdaをテストします。
テストのタブをクリック⇒新しいイベントを作成⇒イベント名:test-flaskとする⇒イベントJSONに以下を張り付ける
{
"httpMethod": "GET",
"path": "/",
"headers": {},
"queryStringParameters": null,
"body": null,
"isBase64Encoded": false
}
テストのオレンジボタンを押す
成功すると緑の 実行中の関数:成功 がでてくる
▼詳細で詳細が確認できる
echo_flaskと名前をつける
エンドポイントタイプは、とりあえずリージョンで。
メソッド作成をおすと以下画面
GETを選んで、Lambdaを選ぶ
Lambdaプロキシ統合を有効化。←重要
Lambdaで作った関数を選ぶ。
④/hello/<name>
のデプロイ
リソースを作成を押してリソース名にhelloを入力
メソッドを作成を押す
先ほどを同じようにLambdaプロキシ統合をオンにして、先ほどのLambdaを選ぶ
/helloを選択したまま、リソースを作成を押す。
今度は、リソース名:{name}として作成。
同様にメソッドを作成でLambdaプロキシ統合をオンにして、先ほどのLambdaを選んで、メソッドを作成を押す。
APIをデプロイでステージを新しくするなり、そのままでもどちらでもいいのでデプロイ。(ステージはVersionと同じような感じ)
検証にかなり時間使ったが、できてよかった~。