Python 3.12への移行を進める中で、AWS Lambda上でGemini APIを実行しようとしてハマったので備忘録として残します。
この記事でわかること
- Python 3.12 (AL2023) 環境で発生するgrpcioエラーの正体
- バイナリ互換性が崩れる原因と仕組み
- Dockerやpipオプションを使った確実な解決手順
現象:デプロイしたLambdaがImportErrorで落ちる
ローカル環境で作成したライブラリ(google-generativeaiなど)をzipに固めてLambdaにアップロードし、テスト実行したところ以下のエラーが発生しました。
ImportError: /var/task/grpc/_cython/cygrpc.so: undefined symbol: __atomic_load_8コード自体は間違っていないはずなのに、ライブラリのインポート時点で停止してしまいます。
環境
- Runtime: Python 3.12
- OS: Amazon Linux 2023 (AL2023)
- Library: google-generativeai (依存ライブラリ: grpcio)
- Build Env: Local (macOS / Windows)
原因:Amazon Linux 2023とバイナリの不整合
このエラーの根本原因は、AWS Lambdaの実行環境(AL2023)と、ビルド時にダウンロードされた共有ライブラリ(.soファイル)の互換性にあります。
Python 3.12ランタイムからベースOSがAmazon Linux 2023に変更されました。Gemini APIが依存する grpcio はC言語で書かれた拡張モジュールを含んでおり、ビルド環境の glibc バージョンがLambda環境と異なると、実行時にシンボルが見つからず ImportError を吐き出します。
解決策:AL2023互換のバイナリをパッケージングする
この問題を解決するには、Lambdaの実行環境と同じ(または極めて近い)環境でライブラリをインストールする必要があります。以下の2つの方法が有効です。
方法1:Dockerを使用してビルドする
AWS SAMが提供する公式のビルドイメージを使用するのが最も確実です。
# プロジェクトルートで実行
docker run --rm -v $(pwd):/var/task public.ecr.aws/sam/build-python3.12 pip install google-generativeai -t .方法2:pipのプラットフォーム指定フラグを使う
Dockerを使わずに、適切なバイナリを明示的に指定してダウンロードする方法です。AL2023に適した manylinux_2_34 を指定します。
pip install \
--platform manylinux_2_34_x86_64 \
--only-binary=:all: \
--target . \
google-generativeaiポイント: --only-binary=:all: を指定することで、ソースからのビルドを避け、互換性のあるコンパイル済みバイナリ(wheel)のみを取得します。
まとめ
AWS Lambda (Python 3.12) で Gemini API を利用する際のポイントをまとめます。
| チェック項目 | 内容 |
|---|---|
| エラーの内容 | grpcioのシンボル参照エラー(__atomic_load_8) |
| 原因 | ローカルOSとAL2023のバイナリ(glibc)不整合 |
| 推奨解決策 | Docker(sam/build-python3.12)環境でのpip install |
| 代替案 | pip installに –platform manylinux_2_34_x86_64 を付与 |
これでGemini APIが正常に動作するはずです。特にPython 3.12へのアップグレード時は、OSの変更に伴うライブラリの互換性に注意しましょう!

