AWS Lambda上でPythonを用いてGemini APIを実装しようとしたところ、protobufのバージョン競合でハマったので備忘録として残します。
この記事でわかること
- AWS LambdaでGemini API使用時に発生するprotobufエラーの根本原因
- Lambda Layerによるパッケージ管理で発生する依存関係の衝突
- Dockerコンテナイメージを使ったエラーの完全な解消手順
[現象] google.protobufの初期化エラーが発生
google-generativeai パッケージをLambda Layerに含めてGemini APIを呼び出そうとすると、以下のようなエラーが発生してLambdaが停止します。
TypeError: __init__() got an unexpected keyword argument 'syntax'
(occurring during google.protobuf initialization)
[環境] 発生時の構成
- Runtime: Python 3.12 (AWS Lambda)
- Library: google-generativeai
- Deployment: Lambda Layer (zip形式によるデプロイ)
[原因] プリインストールされたprotobufとの競合
このエラーの根本的な原因は、AWS LambdaのPythonランタイム環境に最初から含まれている「boto3」などが依存するprotobufのバージョンにあります。
Lambda Layerで最新のprotobufをアップロードしても、Lambdaの実行環境(PYTHONPATH)では、プリインストールされている古いバージョンのメタデータが優先的に読み込まれてしまうことがあります。その結果、Gemini APIが要求する最新の記述形式(syntax引数など)を古いprotobufライブラリが理解できず、TypeErrorを吐き出します。
[解決策] Lambda Layerを卒業し、Dockerコンテナへ移行する
Layerでライブラリを上書きしようとするのは非常に難易度が高く、保守性も低いため、Dockerコンテナ(Container Image)形式でのデプロイへ切り替えるのが最も確実な解決策です。
| 比較項目 | Lambda Layer (Zip) | Docker Container |
|---|---|---|
| 依存関係の隔離 | ランタイム環境と競合しやすい | 完全に独立してパッケージ可能 |
| protobufエラー | 発生リスクが高い | 確実に解消可能 |
| 再現性 | 環境依存が発生する場合がある | どこでも同じ動作が保証される |
修正後のデプロイ方法
以下のDockerfileを使用してイメージを作成し、AWS ECRにプッシュしてLambda関数を作成します。
# LambdaのPython 3.12ベースイメージを使用
FROM public.ecr.aws/lambda/python:3.12
# ライブラリのインストール(プリインストール版に干渉されない)
RUN pip install google-generativeai
# 関数コードのコピー
COPY lambda_function.py ${LAMBDA_TASK_ROOT}
# ハンドラの設定
CMD [ "lambda_function.lambda_handler" ]
この方法であれば、pip install 時にインストールされた適切なバージョンのprotobufが優先され、エラーなくGemini APIを叩くことができます。
[まとめ]
AWS LambdaでPythonの依存関係、特にprotobuf エラーに直面した際は、Layerでの調整に時間を溶かすよりも、Dockerコンテナ化による環境の完全制御を選ぶのが正解です。サーバーレスなGemini API活用の参考になれば幸いです。


