AWS LambdaをVPC内で運用しながらGemini APIを組み込もうとした際、通信プロトコルに関連する503エラーでハマったので備忘録として残します。
この記事でわかること
- VPC内のAWS LambdaでGemini APIが503エラーになる原因
- gRPCとRESTの通信プロトコルの違いによる影響
- transport=’rest’ 設定による接続問題の解決方法
[現象] Gemini API呼び出し時の 503 DNS resolution failed
VPC内に配置したAWS Lambda(Python)から google-generativeai ライブラリを使用してGemini APIを呼び出すと、以下のエラーがランダムまたは高頻度で発生します。
google.api_core.exceptions.ServiceUnavailable: 503 DNS resolution failed for generativelanguage.googleapis.com:443[環境] 発生時のシステム構成
- Runtime: Python 3.9 / 3.10 / 3.11 / 3.12
- Library: google-generativeai
- Infrastructure: AWS Lambda (VPC配置)
- Connectivity: NAT Gateway経由のインターネット接続
[原因] VPC内でのgRPC (HTTP/2) 通信の不安定さ
Python用の Gemini API ライブラリ(google-generativeai)は、デフォルトで gRPC (HTTP/2) を利用して通信を行います。しかし、AWS LambdaのVPC環境においては、以下の要因でgRPC通信が失敗し、503 ServiceUnavailable が引き起こされることがあります。
- NAT Gatewayの相性: 長時間のストリーム接続を維持するgRPCプロトコルが、NAT Gatewayのアイドルタイムアウトや接続制限に干渉される。
- DNSの名前解決: gRPC特有の名前解決プロセスが、VPC内のDNSリゾルバ設定や特定のエンドポイント解決において不安定になる。
[解決策] transport=’rest’ による通信プロトコルの強制変更
この問題は、通信プロトコルを gRPC から標準的な HTTPS (REST) に明示的に変更することで解決可能です。genai.configure 関数の引数に transport='rest' を追加します。
| プロトコル | デフォルト (gRPC) | 修正後 (REST) |
|---|---|---|
| 通信規格 | HTTP/2 | HTTP/1.1 |
| VPC適正 | 低い(503の要因) | 高い(標準的なHTTPS) |
| 安定性 | 環境により不安定 | 極めて安定 |
修正コードのBefore/After
# [修正前] デフォルト設定 (gRPCが使用される)
import google.generativeai as genai
genai.configure(api_key=API_KEY)
# [修正後] transport='rest' を指定してHTTPS通信に強制
import google.generativeai as genai
genai.configure(api_key=API_KEY, transport='rest')[まとめ] VPC環境ではREST通信が推奨
AWS LambdaをVPC内で利用する場合、gRPCプロトコルはインフラ側の制限を受けやすく、予期せぬ 503 ServiceUnavailable を招くことがあります。Gemini APIを利用する際は、transport='rest' を設定してREST通信に切り替えるのが、安定運用のためのプラクティスです。


