Python DashアプリをAWS Lambdaにデプロイする完全ガイド

Zappaを使用したデプロイ方法

Zappaを使用したPython Dashアプリのデプロイ

前提条件

デプロイ手順

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.jsonkeep_warmtrueに設定します:

"keep_warm": true,
"keep_warm_expression": "rate(5 minutes)"

トラブルシューティング

デプロイエラー

デプロイ中にエラーが発生した場合は、以下を確認してください:

アプリケーションエラー

アプリケーションが正常に動作しない場合は、以下を確認してください:

ログの確認

Lambda関数のログを確認するには、以下のコマンドを実行します:

zappa tail dev