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

最終更新日: 2021 年 7 月 26 日

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

簡単な説明

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

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

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

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

解決方法

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

Python 3.8 ライブラリ用の Lambda レイヤーを作成するには

1.    Amazon Linux 2 AMI から Amazon Elastic Compute Cloud (Amazon EC2) インスタンスを作成します

2.    publish-layer-version API を呼び出す権限を持つ AWS Identity and Access Management (IAM) ロールを作成します。次にIAM ロールを EC2 インスタンスにアタッチします

注: EC2 インスタンスに、publish-layer-version API コールの対象になる Lambda レイヤーをアップロードする権限が付与されました。

3.    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

4.    Python フォルダを作成します。

$ mkdir python

5.    aws-xray-sdk ライブラリファイルを Python フォルダにインストールします。

$ pip3 install -t python/ aws-xray-sdk

注: aws-xray-sdk サンプルライブラリをインポートしたい Python ライブラリの名前に置き換えます。

6.    python フォルダの内容を圧縮して layer.zip ファイルにします。

$ zip -r layer.zip python

7.    Lambda レイヤーを公開します。

$ aws lambda publish-layer-version --layer-name xray --zip-file fileb://layer.zip --compatible-runtimes python3.8 --region us-west-2