Python で Lambda コードを実行する際に表示される「モジュールをインポートできません」というエラーを解決する方法を教えてください。

所要時間2分
0

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 に進みます。

  1. Amazon EC2 コンソールで、Amazon Linux 2023 AMI を使用してインスタンスを作成します。または、AWS Cloud9 コンソールを使用します。

  2. PublishLayerVersion API オペレーションを呼び出すためのアクセス権限を与える AWS Identity and Access Management (IAM) ロールを作成します。
    IAM ポリシーステートメントの例:

    {
     "Version": "2012-10-17",
     "Statement": [
     {
     "Sid": "VisualEditor0",
     "Effect": "Allow",
     "Action": "lambda:PublishLayerVersion",
     "Resource": "*"
     }
     ]
    }
  3. IAM ロールを作成し、IAM ポリシーをロールにアタッチします。

  4. IAM ロールをインスタンスにアタッチします。

  5. インスタンスまたは Cloud9 環境に接続します。

  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 関数で使用されているバージョンと同じ値に更新します。

  7. 次のコマンドを実行して、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 リージョンに置き換えます。

  8. Lambda 関数にレイヤーを追加します。

  9. Lambda 関数をテストするには、パッケージをインポートしてバージョンを出力します。
    出力の成功例:

    import json
    import numpy
    
    
    def lambda_handler(event, context):
     print(numpy.__version__)
     return {
     'statusCode': 200,
     'body': json.dumps('Hello from Lambda!')
     }	
AWS公式
AWS公式更新しました 3ヶ月前