Python で Lambda コードを実行すると「モジュールをインポートできません」というエラーが表示されるのですが、どうすれば解決できますか?

最終更新日: 2022 年 4 月 12 日

AWS Lambda コードを Python で実行しようとすると、「モジュールをインポートできません」というエラーが表示されます。どうすればこのエラーを解決できますか?

簡単な説明

通常、このエラーは、Lambda 環境が Python コードで指定されたライブラリを見つけられない場合に表示されます。これは、Lambda がすべての Python ライブラリに事前にパッケージ化されているわけではないためです。

このエラーを解決するには、Lambda の Python コードで使用するライブラリを含めたデプロイパッケージまたは Lambda レイヤーを作成します。

重要:Python 用にインポートするライブラリを /python フォルダ内に配置します。

解決方法

注: 以下では、デプロイパッケージではなく Lambda レイヤーを作成する手順を示します。これは、複数の Lambda 関数で Lambda レイヤーを再利用できるためです。各 Lambda ランタイムは、特定の /opt ディレクトリフォルダを PATH 変数に追加します。レイヤーが同じフォルダー構造を使用している場合、Lambda 関数のコードはパスを指定せずにレイヤーコンテンツにアクセスできます。

ベストプラクティスは、Lambda ランタイムのベースと同じ オペレーティングシステムで Lambda レイヤーを作成することです。たとえば、Python 3.8 は Amazon Linux 2 Amazon マシンイメージ (AMI) に基づいています。ただし、Python 3.7 と Python 3.6 は Amazon Linux AMI に基づいています。

Python 3.8ライブラリの Lambda レイヤーを作成するには、次の手順を実行します。

1.    AWS Cloud9 コンソールで、Amazon Linux 2 AMI を使用して Amazon Elastic Compute Cloud (Amazon EC2) インスタンスを作成します。手順については、AWS Cloud9 ユーザーガイドの EC2 環境の作成 を参照してください。

2.    PublishLayerVersion API オペレーションを呼び出すアクセス権限を付与する AWS Identity and Access Management (IAM) ポリシーを作成します

PublishLayerVersion API オペレーションを呼び出すアクセス権限を付与する IAM ポリシーステートメントの例

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "lambda:PublishLayerVersion",
            "Resource": "*"
        }
    ]
}

3.    IAM ロールを作成しIAM ポリシーをロールにアタッチします。次に、IAM ロールを Amazon EC2 インスタンスにアタッチします

注: これで、EC2インスタンスに PublishLayerVersion API 呼び出し用のLambdaレイヤーをアップロードする権限が付与されました。

4.    AWS Cloud9 Amazon EC2 環境を開きます。次に、以下のコマンドを実行して Python 3.8 と pip3 をインストールします。

$ sudo amazon-linux-extras install python3.8
$ curl -O https://bootstrap.pypa.io/get-pip.py
$ python3.8 get-pip.py --user

5.    次のコマンドを実行して、Python フォルダーを作成します。

$ mkdir python

6.    次のコマンドを実行して、Pandas ライブラリファイルを python フォルダにインストールします。

重要: Pandas は、インポートする Python ライブラリの名前に置き換えます。

$ python3.8 -m pip install pandas -t python/

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

$ zip -r layer.zip python

8.    次のコマンドを実行して、Lambda レイヤーを公開します。

重要: us-east-1 は、Lambda 関数が存在する AWS リージョンに置き換えます。

$ aws lambda publish-layer-version --layer-name pandas-layer --zip-file fileb://layer.zip --compatible-runtimes python3.8 --region us-east-1

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