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エラーに悩まされているなら、ぜひ試してみてください。


