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

所要時間2分
0

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

次の手順を実行します。

  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. インスタンスまたは AWS Cloud9 環境に接続します。

  6. 次のコマンドを実行して新しいフォルダーを作成し、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 関数で使用しているバージョンと同じ値に更新します。

  7. 次のコマンドを実行して、python フォルダの内容を layer.zip ファイルにコピーします。

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

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

  10. 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 ライブラリをインストールしてトラブルシューティングする方法を教えてください

AWS公式
AWS公式更新しました 4ヶ月前
コメントはありません