Zappaを使用したPython Dashアプリのデプロイ
前提条件
- Python 3.6以上がインストールされていること
- AWS CLIがインストールされ、設定済みであること
- AWSアクセスキーとシークレットキーが設定済みであること
デプロイ手順
1. 仮想環境の構築
# 仮想環境の作成
python3 -m venv venv
# 仮想環境のアクティベート
source venv/bin/activateZappaは仮想環境を前提としているため、必ず仮想環境を作成してください。
2. 必要なパッケージのインストール
# DashとZappaのインストール
pip install dash plotly pandas zappa3. 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.txt6. デプロイの実行
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