AWS Lambda と Gemini API (google-generative-ai) を組み合わせて、長大な構造化データを生成しようとしたところ、Lambda のペイロード上限(6MB)の壁にぶち当たり、502エラーでハマったので備忘録として残します。
この記事でわかること
- AWS Lambda の「6MB ペイロード制限」を回避する方法
- Lambda Web Adapter を利用したストリーミングレスポンスの実装
- Gemini API の
generate_content(stream=True)と FastAPI の連携法
[現象] 巨大な JSON レスポンスが 502 Bad Gateway になる
Gemini 1.5 Pro などを使用して、数万文字に及ぶ長い JSON やデータを生成させ、それを API Gateway 経由で返却しようとすると、以下のエラーが発生します。
Lambda implementation returned a response with size greater than 6291456 byte
(Error: 502 Bad Gateway)
[環境]
- Runtime: Python 3.12
- SDK: google-generative-ai
- Infrastructure: AWS Lambda + API Gateway (または Function URL)
[原因] AWS Lambda 同期呼び出しの物理的な制限
原因は極めてシンプルです。AWS Lambda の同期呼び出しにおけるリクエスト/レスポンスのペイロード上限は一律 6MB に設定されています。Gemini API のような長大なコンテキストを扱えるモデルでは、生成される JSON レスポンスがこの 6MB を容易に超過してしまいます。通常の SDK 利用ではレスポンス全体を一度メモリに保持してから return するため、この制限を物理的に回避できません。
[解決策] Lambda Web Adapter によるストリーミング実装
この問題を解決するには、レスポンスを一括で返すのではなく、「Response Streaming」を使用して、生成されたデータから順次クライアントへ送信する必要があります。
1. Lambda Web Adapter の導入
Lambda で HTTP ストリーミングを簡単に扱うため、Lambda Web Adapter を Layer に追加します。これにより、FastAPI などの標準的な Web フレームワークを Lambda 上でそのまま動かせるようになります。
2. ストリーミング対応の実装コード
Gemini API の stream=True を有効にし、FastAPI の StreamingResponse でチャンクを返却します。
from fastapi import FastAPI
from fastapi.responses import StreamingResponse
import google.generativeai as genai
import os
app = FastAPI()
genai.configure(api_key=os.environ["GEMINI_API_KEY"])
model = genai.GenerativeModel('gemini-1.5-pro')
@app.get("/generate")
async def generate():
def stream_generator():
# stream=True で逐次取得
response = model.generate_content("巨大な構造化データを生成して...", stream=True)
for chunk in response:
if chunk.text:
yield chunk.text
return StreamingResponse(stream_generator(), media_type="text/plain")
3. 制限の比較
| 機能 | 通常のレスポンス | Response Streaming |
|---|---|---|
| ペイロード上限 | 6MB (固定) | 20MB (Soft Limit / 設定次第) |
| ユーザー体験 | 完了まで待機が必要 | 生成から順次表示 (UX向上) |
| 実装難易度 | 低い | やや高い (Adapterが必要) |
[まとめ]
AWS Lambda で Gemini API の巨大なレスポンスを扱う際は、Response Streaming が必須です。Lambda Web Adapter と FastAPI を組み合わせることで、Python 開発者にとって馴染みのある方法で 6MB の壁を突破できます。Payload Too Large に悩まされている方は、ぜひストリーミング構成を試してみてください。

