AWS Lambda 関数で Python コードを実行したときの "Unable to import module" というエラーを解決したいです。
簡単な説明
AWS Lambda 環境で Lambda デプロイパッケージで指定されたライブラリが見つからない場合、"Unable to import module" というエラーが表示されます。
このエラーを解決するには、必要なすべてのライブラリを収めたデプロイパッケージを作成します。または、必要なライブラリを含む Lambda レイヤーを作成し、そのレイヤーを Lambda 関数にアタッチします。上記の完了後、レイヤーを複数の Lambda 関数で再利用できます。
解決策
Lambda レイヤーを作成して、複数の Lambda 関数にアタッチする
注: Lambda レイヤーを作成するときは、ライブラリは /python または python/lib/python3.x/site-packages フォルダーに配置してください。Lambda レイヤーのファイルサイズ制限は、圧縮すると 50 MB、解凍すると 250 MB です。ベストプラクティスは、Lambda ランタイムを実行する基盤となる オペレーティングシステム (OS) と同じ OS で Lambda レイヤーを作成することです。例えば、Amazon Linux 2023 の Amazon マシンイメージ (AMI) は、Python 3.12 を実行する基盤になるオペレーティングシステムです。したがって、このレイヤーを Amazon Linux 2023 OS 上に作成します。
Amazon Elastic Compute Cloud (Amazon EC2) インスタンスを使用していて、PublishLayerVersion API コールを使用するアクセス許可がある場合は、ステップ 5 に進んでください。または、認証に AWS CloudShell を使用している場合は、ステップ 5 に進んでください。
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI のエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
次の手順を実行します。
1.AWS CloudShell または Amazon EC2 コンソールで、Amazon Linux 2023 AMI を含むインスタンスを作成します。
2.PublishLayerVersion API オペレーションを呼び出すためのアクセス許可を付与する AWS Identity and Access Management (IAM) ポリシーを作成します。
IAM ポリシーの例:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "lambda:PublishLayerVersion",
"Resource": "arn:aws:lambda:*:*:layer:*"
}
]
}
3.IAM ロールを作成し、IAM ポリシーをロールにアタッチします。
4.IAM ロールをインスタンスにアタッチします。
5.インスタンスに接続するか、CloudShell を開きます。
6.次のコマンドを実行して新しいフォルダーを作成し、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 関数で使用しているバージョンと同じ値に更新します。pip は Python 3.12 と互換性のあるパッケージを自動的にダウンロードするので、Python 3.12 をインストールする必要はありません。
7.次のコマンドを実行して、python フォルダの内容を layer.zip ファイルに入れます。
cd ..
zip -r layer.zip python
8.Lambda レイヤーを発行するには、次の publish-layer-version コマンドを実行します。
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 リージョンに置き換えます。
9.Lambda 関数にレイヤーを追加します。
10.Lambda 関数をテストするには、パッケージをインポートしてバージョンを出力します。
出力例:
import json
import numpy
def lambda_handler(event, context):
print(numpy.__version__)
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
関連情報
Amazon EMR および Amazon EMR Serverless のクラスターに Python ライブラリをインストールしてトラブルシューティングする方法を教えてください。