AWS LambdaでGemini APIが謎のタイムアウト?gRPCを捨ててREST通信で安定させる解決策

AWS Lambda上でGemini API(google-generativeai)を使って長文要約や複雑な推論を実装していたところ、処理時間に余裕があるはずなのに謎のタイムアウトや通信エラーが発生してハマったので備忘録として残します。

この記事でわかること

  • AWS LambdaでGemini APIが「DeadlineExceeded」を吐く原因
  • gRPC通信とLambdaネットワークスタックの相性問題
  • transport=’rest’ オプションによる安定化の方法

[現象] タイムアウト設定内なのにエラーが発生

Lambdaのタイムアウトを十分に長く設定しているにもかかわらず、Gemini APIの呼び出し時に以下のエラーがランダム、あるいは長文処理時に頻発します。

google.api_core.exceptions.DeadlineExceeded: 504 Deadline Exceeded
# または
ServiceUnavailable: 503 Ready check failed during gRPC stream

[環境]

  • Runtime: Python 3.9+
  • Library: google-generativeai
  • Platform: AWS Lambda

[原因] AWS LambdaとgRPCの相性問題

google-generativeai SDKは、デフォルトでgRPC通信を使用してAPIとやり取りします。しかし、AWS Lambdaのネットワーク層(特にHTTP/2のロングポーリングやストリーミング)において、gRPCの接続を維持できずにパケットがドロップされたり、セッションが切断されたりすることがあります。

これにより、SDK側は「応答が来ない」と判断し、タイムアウトやサービス利用不可のエラーを返してしまいます。特にレスポンスに時間がかかる「重い推論」の際に顕著に発生します。

[解決策] transport=’rest’ を明示的に指定する

解決策は非常にシンプルです。SDKのクライアント初期化時に、通信プロトコルをデフォルトのgRPCからREST (HTTP/1.1)へ変更します。

修正コード

GenerativeModelをインスタンス化する際の引数に transport='rest' を追加するだけです。

Before

import google.generativeai as genai

model = genai.GenerativeModel('gemini-1.5-pro')

After

import google.generativeai as genai

# transportに'rest'を指定して安定化
model = genai.GenerativeModel(
    'gemini-1.5-pro', 
    transport='rest'
)

この変更により、標準的なHTTPS通信として処理されるようになり、AWS Lambda環境下でも通信が極めて安定します。

まとめ

プロトコルAWS Lambdaでの安定性特徴
gRPC (デフォルト)× 不安定高速だがLambdaのネットワーク層で切断されやすい
REST (HTTP/1.1)○ 安定標準的なHTTPS通信のため、制限を受けにくい

Pythonを使ってAWS LambdaでGemini APIを動かす際は、「とりあえず transport=’rest’ を入れる」のを標準構成にすることをおすすめします。もし原因不明の504エラーに悩まされているなら、ぜひ試してみてください。

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