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 関数にレイヤーを追加します。