Gemini API の巨大レスポンスで AWS Lambda が 502 エラーを出す時の回避策:6MB の壁をストリーミングで超える

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 に悩まされている方は、ぜひストリーミング構成を試してみてください。

タイトルとURLをコピーしました