AWS Lambda (Python 3.12) 上で Gemini API (google-generativeai) を導入しようとした際、デプロイ後の実行で cygrpc 関連のインポートエラーにハマったので備忘録として残します。
この記事でわかること
- AWS Lambda で Gemini API 導入時に発生するエラーの正体
- なぜローカルで pip install した ZIP 転送が失敗するのか
- Docker を利用した Lambda 互換パッケージ(Layer)の作成手順
[現象] 発生したエラーメッセージ
Lambda 関数を実行すると、以下のようなモジュールのインポートエラーが発生します。
Runtime.ImportModuleError: Unable to import module 'lambda_function':
cannot import name 'cygrpc' from 'grpc._cython'
[環境]
| 項目 | 詳細 |
|---|---|
| Runtime | Python 3.12 |
| OS | Amazon Linux 2023 (Lambda 実行環境) |
| Library | google-generativeai (依存ライブラリ: grpcio) |
[原因] ライブラリのバイナリ互換性
Gemini API が内部で使用する grpcio ライブラリには、パフォーマンス向上のために C 言語で記述されたネイティブ拡張が含まれています。
macOS や Windows のローカル環境で pip install を実行して作成した ZIP パッケージは、その OS 用のバイナリ(.soファイルなど)を含んでいます。しかし、AWS Lambda は Amazon Linux 2023 上で動作するため、これらにはバイナリ互換性がなく、実行時に共有ライブラリのロードに失敗してしまうのです。
[解決策] Docker を使用したパッケージング
Lambda の実行環境と同じ Linux 互換のバイナリを入手するため、Docker を使用してパッケージングを行います。以下のコマンドを実行することで、Lambda 用の manylinux 形式のホイールを強制的に取得できます。
手順:Lambda 互換パッケージの生成
プロジェクトのルートディレクトリで以下のコマンドを実行してください。
# 作業ディレクトリの作成
mkdir -p python
# Dockerを使用して Lambda 互換のバイナリをインストール
docker run --rm -v $(pwd):/var/task public.ecr.aws/sam/build-python3.12 \
pip install google-generativeai -t /var/task/python \
--platform manylinux2014_x86_64 \
--only-binary=:all:
# ZIP化して Lambda Layer 用に準備
zip -r gemini-layer.zip python/
ポイント:
--platform manylinux2014_x86_64: Lambda の CPU アーキテクチャに合わせた Linux 向けバイナリを指定します。--only-binary=:all:: ソースビルドを避け、ビルド済みの互換バイナリを優先的にダウンロードさせます。
[まとめ]
AWS Lambda で grpcio や google-generativeai を扱う際の cygrpc インポートエラーは、環境間のバイナリ不整合が原因です。特に Python 3.12 以降の Amazon Linux 2023 環境では、古いバイナリが動作しないケースが増えています。
デプロイ時は必ず Docker を活用し、Lambda と同等の Linux 環境でビルドしたパッケージを使用するようにしましょう。


