Zappaを使用したPython Dashアプリのデプロイ
前提条件
- Python 3.6以上がインストールされていること
- AWS CLIがインストールされ、設定済みであること
- AWSアクセスキーとシークレットキーが設定済みであること
デプロイ手順
1. 仮想環境の構築
# 仮想環境の作成
python3 -m venv venv
# 仮想環境のアクティベート
source venv/bin/activate
Zappaは仮想環境を前提としているため、必ず仮想環境を作成してください。
2. 必要なパッケージのインストール
# DashとZappaのインストール
pip install dash plotly pandas zappa
3. Dashアプリケーションの作成
以下のような内容でapp.py
を作成します:
import plotly.express as px
import dash
from dash import html, dcc
from dash.dependencies import Input, Output
# サンプルデータを読み込む
df = px.data.gapminder()
# アプリケーションを作成する
app = dash.Dash(__name__)
# グラフを作成する関数
def create_graph(data, x_col, y_col):
fig = px.scatter(data, x=x_col, y=y_col, color='continent',
log_x=True, size_max=60, title=f"{y_col} vs {x_col}")
return fig
# レイアウトを定義する
app.layout = html.Div([
html.H1("Dash App on AWS Lambda"),
html.Div([
dcc.Graph(id='graph-1')
]),
html.Div([
dcc.Dropdown(
id='x-column',
options=[{'label': i, 'value': i} for i in df.columns],
value='gdpPercap'
)
], style={'width': '25%', 'display': 'inline-block'}),
html.Div([
dcc.Dropdown(
id='y-column',
options=[{'label': i, 'value': i} for i in df.columns],
value='lifeExp'
)
], style={'width': '25%', 'display': 'inline-block'}),
])
# コールバックを定義する
@app.callback(
Output('graph-1', 'figure'),
[Input('x-column', 'value'),
Input('y-column', 'value')])
def update_graph(x_col, y_col):
fig = create_graph(df, x_col, y_col)
return fig
# Zappaで使用するWSGIアプリケーションインスタンス
dapp = app.server.wsgi_app
if __name__ == '__main__':
app.run_server(debug=True, host="0.0.0.0")
重要なポイント:
- ローカル環境で確認するときは、
app.run_server(debug=True, host="0.0.0.0")
によりサーバーが立ち上がります。 - Zappaでは、API GatewayのイベントをLambdaのイベントとしてバイパスするために、アプリケーションのインスタンスを指定する必要があります。そのために、
dapp = app.server.wsgi_app
のようにして、アプリケーションのインスタンスを変数dappに入れています。
4. Zappaの設定ファイルの作成
プロジェクトのルートディレクトリにzappa_settings.json
を作成します:
{
"dev": {
"app_function": "app.dapp",
"project_name": "dash-lambda",
"aws_region": "ap-northeast-1",
"runtime": "python3.9",
"s3_bucket": "your-deployment-bucket-name",
"environment_variables": {
"DASH_REQUESTS_PATHNAME_PREFIX": "/dev/"
},
"memory_size": 512,
"timeout_seconds": 30,
"keep_warm": false
}
}
設定ファイルの重要なポイント:
app_function
: Pythonのスクリプトファイルであるapp.pyのアプリケーションインスタンスを指定します。environment_variables
: API Gatewayはステージ名をURLに含めるため、DashでのJavaScriptなどのアセットのURLを/dev/配下にするためにDASH_REQUESTS_PATHNAME_PREFIX
を設定します。s3_bucket
: デプロイパッケージを保存するS3バケット名を指定します。バケットが存在しない場合は自動的に作成されます。
5. 依存関係ファイルの作成
pip freeze > requirements.txt
6. デプロイの実行
zappa deploy dev
デプロイが完了すると、以下のようなURLが表示されます:
https://xxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev
このURLにアクセスして、Dashアプリケーションが正常に動作していることを確認します。
更新と削除
アプリケーションの更新
アプリケーションを更新する場合は、以下のコマンドを実行します:
zappa update dev
アプリケーションの削除
アプリケーションを削除する場合は、以下のコマンドを実行します:
zappa undeploy dev
このコマンドを実行すると、Lambda関数とAPI Gatewayの設定が削除されますが、S3バケットは削除されません。必要に応じて手動で削除してください。
高度な設定
カスタムドメインの設定
カスタムドメインを使用する場合は、zappa_settings.json
に以下の設定を追加します:
"domain": {
"domain": "your-domain.com",
"certificate_arn": "your-certificate-arn",
"route53": true
}
スケジューリングの設定
定期的にLambda関数を実行する場合は、zappa_settings.json
に以下の設定を追加します:
"events": [
{
"function": "app.scheduled_function",
"expression": "rate(1 hour)"
}
]
ウォームアップの設定
コールドスタートを防ぐために、定期的にLambda関数をウォームアップする場合は、zappa_settings.json
でkeep_warm
をtrue
に設定します:
"keep_warm": true,
"keep_warm_expression": "rate(5 minutes)"
トラブルシューティング
デプロイエラー
デプロイ中にエラーが発生した場合は、以下を確認してください:
- AWS認証情報が正しく設定されているか
- S3バケット名がグローバルに一意であるか
- 必要なIAM権限があるか
アプリケーションエラー
アプリケーションが正常に動作しない場合は、以下を確認してください:
DASH_REQUESTS_PATHNAME_PREFIX
が正しく設定されているか- 依存関係が正しくインストールされているか
- Lambda関数のタイムアウト設定が十分か
ログの確認
Lambda関数のログを確認するには、以下のコマンドを実行します:
zappa tail dev