LambdaでOpenAIのAPIを呼び出しました。しかし、何も設定していなかったため、以下のエラーが発生しました。Lambdaで外部ライブラリを使用できるように設定していなかったので当然ですよね。今回はLambdaで外部ライブラリを使用できるようにする設定について解説します。
Response
{
"errorMessage": "Unable to import module 'lambda_function': No module named 'openai'",
"errorType": "Runtime.ImportModuleError",
"requestId": "10aa9f3c-7038-4cfd-a76a-021ef2da6777",
"stackTrace": []
}
発生したエラー
エラーメッセージに「No module named」とある通り、Lambda関数から使用する外部ライブラリが読み込めていません。Lambda関数で外部ライブラリを使用するにはレイヤーを設定する必要があります。レイヤーが設定されていなければ発生しますし、レイヤーが正しく設定されていなくても発生します。
Lambdaのレイヤーとは
Lambda関数で外部ライブラリや共有モジュールをパッケージ化したものです。パッケージ化することでLambda関数間で共有することができ、Lambda関数内に外部ライブラリや共有モジュールを含める必要が無いので、Lambda関数自体が軽量になります。
レイヤーの作り方
言語によって決まったディレクトリ構成でzipに圧縮してアップロードすることでレイヤーとして登録することができます。言語ごとのディレクトリ構成は『各 Lambda ランタイムのレイヤーパス』で確認することができます。openaiのライブラリはPythonなので今回はPythonのディレクトリ構成で説明します。
Windows環境でランタイムがPython3.12の場合、以下のコマンドでopenaiのレイヤーを作成することができます。
py -m venv .python-openai-layer
cd .python-openai-layer
Scripts\activate
mkdir python\lib\python3.12\site-packages
pip install fastapi==0.99.0 -t python\lib\python3.12\site-packages
pip install openai -t python\lib\python3.12\site-packages
zip -r openai-layer.zip python
最後のzipコマンドはWindowsの標準環境では動きません。『Zip for Windows』などからダウンロードするか使っている圧縮ツールで圧縮してください。
注意点
以下のミスをすると同様に Unable to import module
のエラーが発生します。
- python3.12.0のようにランタイムのバージョン指定を間違える
- Pythonの正式なバージョン表記ではなくLambda関数のランタイム指定に合わせる必要がありそうです
- python\lib\site-packagesのようにランタイムのバージョン指定のディレクトリが無い
- .shの手順をWindowsで真似るとバージョン指定のディレクトリが無い場合があるので注意しましょう
FastAPIについて
fastapi==0.99.0
をインストールしている理由については以下の記事を読んでください。
レイヤーの登録と関数へのアタッチ
作成したレイヤーはアップロードしてLambda関数にアタッチする必要があります。以下の手順で登録とアタッチを行ってください。
まとめ
Lambda関数のレイヤーについて解説しました。私は今回初めてLambda関数のレイヤーを使いました。注意点に書いたポイントを2つともミスしてしまいレイヤーの作成に時間がかかってしまいました。この記事を読んで同様のミスをする人が減ると良いななと思います。
コメント