AWS Lambda で Gemini API を使うと発生する『cygrpc』インポートエラーの完全解決ガイド

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'

[環境]

項目詳細
RuntimePython 3.12
OSAmazon Linux 2023 (Lambda 実行環境)
Librarygoogle-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 で grpciogoogle-generativeai を扱う際の cygrpc インポートエラーは、環境間のバイナリ不整合が原因です。特に Python 3.12 以降の Amazon Linux 2023 環境では、古いバイナリが動作しないケースが増えています。

デプロイ時は必ず Docker を活用し、Lambda と同等の Linux 環境でビルドしたパッケージを使用するようにしましょう。

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