AWS Lambda (VPC) で Gemini API が 503 エラーになる原因と、transport=’rest’ による回避策

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/2HTTP/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通信に切り替えるのが、安定運用のためのプラクティスです。

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