Python で AWS Lambda コードを実行しようとすると、「モジュールをインポートできません」というエラーが表示されます。
簡単な説明
AWS Lambda 環境で、Lambda デプロイパッケージで指定されたライブラリが見つからないとき、「モジュールをインポートできません」というエラーが表示されます。
このエラーを解決するには、必要なすべてのライブラリを収めたデプロイパッケージを作成します。または、必要なライブラリを収めた Lambda レイヤーを作成し、それを Lambda 関数にアタッチします。Lambda レイヤーメソッドを使用すると、複数の Lambda 関数で、このレイヤーを再利用できます。
解決策
Lambda レイヤーを作成して、複数の Lambda 関数にアタッチする
注: Lambda レイヤーを作成するときは、ライブラリは /python または python/lib/python3.x/site-packages フォルダーに配置してください。最善の方法は、Lambda ランタイムを実行する基盤となる オペレーティングシステム (OS) と同じ OS で Lambda レイヤーを作成することです。例えば、Amazon Linux 2023 の Amazon マシンイメージ (AMI) は、Python 3.12 を実行する基盤になるオペレーティングシステムです。そのため、このレイヤーは、Amazon Linux 2023 OS 上に作成します。
お使いの Amazon Elastic Compute Cloud (Amazon EC2) インスタンスに、PublishLayerVersion API コールを通じて Lambda レイヤーをアップロードするアクセス権限がない場合は、ステップ 1~3 に従ってください。インスタンスににアクセス権限がある場合は、ステップ 4 に進みます。
-
Amazon EC2 コンソールで、Amazon Linux 2023 AMI を使用してインスタンスを作成します。または、AWS Cloud9 コンソールを使用します。
-
PublishLayerVersion API オペレーションを呼び出すためのアクセス権限を与える AWS Identity and Access Management (IAM) ロールを作成します。
IAM ポリシーステートメントの例:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "lambda:PublishLayerVersion",
"Resource": "*"
}
]
}
-
IAM ロールを作成し、IAM ポリシーをロールにアタッチします。
-
IAM ロールをインスタンスにアタッチします。
-
インスタンスまたは Cloud9 環境に接続します。
-
次のコマンドを実行して新しいフォルダーを作成し、pip を使用して「numpy」という名前のライブラリをインストールします。
mkdir -p lambda-layer/python
cd lambda-layer/python
pip3 install --platform manylinux2014_x86_64 --target . --python-version 3.12 --only-binary=:all: numpy
注: 関数タイプに応じて platform のパラメータを更新します。x86_64 Lambda 関数の場合は、値を manylinux2014_x86_64に設定します。arm64 関数の場合は、値を manylinux2014_aarch64に設定します。python-version パラメータを Lambda 関数で使用されているバージョンと同じ値に更新します。
-
次のコマンドを実行して、python フォルダの内容を layer.zip ファイルにコピーします。
cd ..
zip -r layer.zip python
次のコマンドを実行して、Lambda レイヤーを公開します。
aws lambda publish-layer-version --layer-name numpy-layer --zip-file fileb://layer.zip --compatible-runtimes python3.12 --region us-east-1
**注:**us-east-1 を、Lambda 関数の AWS リージョンに置き換えます。
-
Lambda 関数にレイヤーを追加します。
-
Lambda 関数をテストするには、パッケージをインポートしてバージョンを出力します。
出力の成功例:
import json
import numpy
def lambda_handler(event, context):
print(numpy.__version__)
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}