【AWS Lambda】Python 3.12でGemini APIが動かない?grpcioのImportErrorを解決する決定版

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の変更に伴うライブラリの互換性に注意しましょう!

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