はじめに
AWS Lambdaの非同期実行とローカル開発の両立って意外と面倒ですよね。
本記事では、asyncioによるローカル非同期処理と、Lambdaの非同期実行を同じAPIで扱えるユーティリティを作成し、LitestarでAPI化、CDKでデプロイまで自動化した構成を紹介します。
目的・背景
- ローカルではasyncioで高速に非同期処理を試したい
- 本番はAWS Lambdaでスケールしたい
- API設計はモダンなPythonフレームワーク(Litestar)で
- デプロイ・管理はCDKで自動化したい
アーキテクチャ概要
+-------------+ +----------------+ +--------------------+
| API Gateway | --> | API Lambda | --> | Worker Lambda |
+-------------+ +----------------+ +--------------------+
↑ | |
| (Litestar) | (async invoke) | (async job)
+-------------------+------------------------+
- API Gateway経由でリクエストを受け、API Lambda(Litestarアプリ)で処理
- 非同期ジョブはWorker Lambdaへinvoke
- ローカルではasyncioで同等の非同期実行
ソースコード
ローカル&Lambda両対応の非同期処理
-
async_lambda_invoker
デコレータで、ローカル時はasyncio、Lambda時はboto3でinvoke - 共通APIでどちらでも非同期ジョブをキックできる
from main import async_lambda_invoker
@async_lambda_invoker
async def process_job(data):
# 非同期ジョブ本体
LitestarによるAPI実装
-
/
でサービスのステータス確認 -
/process
で非同期ジョブをPOST - VS Code REST Client用の
api_test.http
で簡単にAPIテスト
AWS CDKによるデプロイ自動化
- Lambda関数、IAMロール、API Gatewayなど全てCDKで定義
-
manage.sh
で./manage.sh deploy
するだけで一発デプロイ -
.env
でAWSプロファイルやリージョンを安全に管理
./manage.sh deploy
プロジェクト構成と管理
-
main.py
: 非同期処理ロジックとAPI -
infra/cdk/
: CDKスタック定義 -
src/lambda/
: Lambdaハンドラー -
manage.sh
: 統合管理スクリプト -
.env
&.env.sample
: 設定ファイル -
requirements.txt
,requirements-dev.txt
: 依存関係管理
まとめ
- ローカルとLambdaの両方で同じAPIで非同期処理ができる
- LitestarでモダンなAPI開発
- CDKと管理スクリプトでデプロイも超簡単
- AWSプロファイルも安全に切り替え可能