PythonでServer-Sent Events (SSE)を実装するプロジェクト
AWS Lambda Web AdapterとLambda Function URLs (Response Streaming)を使用して、AWS Lambda上でSSEを実現します。
デプロイ後、test_client.htmlをブラウザで開き、Lambda Function URLを入力して「接続」をクリックすると、リアルタイムでイベントを受信できます。
- FastAPIによるREST API
- Server-Sent Eventsによるリアルタイム通信
- AWS Lambda Web Adapterを使用したLambdaでのSSE実現
- Lambda Function URLs + Response Streamingでのストリーミング対応
- ローカル開発環境
# Python依存関係(ローカル開発用)
pip install -r requirements.txtpython run_local.pyブラウザで以下のURLにアクセス:
- API: http://localhost:8000/
- SSEエンドポイント: http://localhost:8000/events
pytest- Dockerがインストールされていること
- AWS CLIが設定されていること
- Serverless Frameworkがインストールされていること
# 1. Node.js依存関係をインストール
npm install
# 2. デプロイ(初回はDockerイメージのビルドとECRへのプッシュのため時間がかかります)
npm run deploy
# デプロイ後、Function URLが出力されます
# 例: https://xxxxxxxxxx.lambda-url.ap-northeast-1.on.aws/
# 3. SSEエンドポイントにアクセス
# https://xxxxxxxxxx.lambda-url.ap-northeast-1.on.aws/events
# 4. スタックを削除する場合
npm run removeこのプロジェクトでは、以下の技術を組み合わせてSSEを実現しています:
- Lambda Web Adapter: 通常のWebアプリケーションをLambdaで実行可能にするExtension
- Response Streaming:
AWS_LWA_INVOKE_MODE=RESPONSE_STREAMでストリーミングレスポンスを有効化 - Lambda Function URLs: API Gatewayをバイパスして直接Lambdaにアクセス
- FastAPI + SSE-Starlette: PythonでSSEを簡単に実装
GET /- ヘルスチェックGET /events- SSEイベントストリーム
{
"time": "2024-01-01T12:00:00.000000",
"message": "Event number 1",
"count": 1
}-
Dockerがインストールされているか確認
docker --version
-
AWS認証情報が設定されているか確認
aws sts get-caller-identity
-
ECRへのプッシュ権限があるか確認
# ログをリアルタイムで確認
npm run logs
# 最近10分間のログを確認
aws logs tail /aws/lambda/py-sse-dev-api --since 10m- Lambda Function URLsはAPI Gatewayとは異なり、SSEをサポートします
- Lambdaのタイムアウト(15分)に注意してください
- 初回デプロイ時はDockerイメージのビルドとECRへのプッシュに時間がかかります