AWS Lambda 関数で Python コードを実行したときの「モジュールをインポートできません」というエラーを解決したいです。
簡単な説明
AWS 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 レイヤーをアップロードするアクセス許可がある場合は、ステップ 5 に進みます。
次の手順を実行します。
-
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 ロールをインスタンスにアタッチします。
-
インスタンスまたは AWS Cloud9 環境に接続します。
-
次のコマンドを実行して新しいフォルダーを作成し、pip を使用して "numpy" というライブラリをインストールします。
mkdir -p lambda-layer/pythoncd 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 jsonimport numpy
def lambda_handler(event, context):
print(numpy.__version__)
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
関連情報
Amazon EMR および Amazon EMR Serverless のクラスターに Python ライブラリをインストールしてトラブルシューティングする方法を教えてください