コンパイルされたバイナリを含む Python パッケージをデプロイパッケージに追加し、そのパッケージを Lambda と互換性を持たせるにはどうすればよいですか?
最終更新日: 2022 年 4 月 26 日
pip を使用してコンパイルされたコードを含む Python パッケージをインストールしたところ、AWS Lambda 関数が「Unable to import module」(モジュールをインポートできません) というエラーを返すようになりました。なぜこれが発生するのですか? また、問題を解決するにはどうすればよいですか?
簡単な説明
コンパイルされたコード (NumPy や pandas など) を含む Python パッケージは、デフォルトでは常に Lambda ランタイムと互換性があるとは限りません。pip を使用してこれらのパッケージをインストールすると、パッケージはローカルマシンのアーキテクチャ用の module-name パッケージをダウンロードしてコンパイルします。これにより、Linux オペレーティングシステムを使用していない場合、デプロイパッケージは Lambda と互換性がなくなります。
Linux オペレーティングシステム以外で pip を使用する場合に Lambda Python ランタイムと互換性のある Lambda デプロイパッケージまたはレイヤーを作成するには、次の手順を実行します。
1. コンパイル済みの Python パッケージを wheel (.whl) ファイルとしてダウンロードします。
2. --platform パラメータの値として manylinux2014 を指定して pip install コマンドを実行します。
注: macOS の --platform タグは機能しません。例: win_amd64 および macosx_10_6_intel タグは、Lambda と互換性のあるデプロイパッケージをインストールしません。
解決方法
注: この手順の例は、x86_64 アーキテクチャで実行されている Lambda Python 3.9 ランタイムに pandas をインストールする方法を示しています。
1. コマンドプロンプトを開きます。その後、次の pip コマンドを実行して、バージョン 19.3.0 以降の pip を使用していることを確認します。
pip --version
pip バージョン 19.3.0 より古いバージョンの pip を使用している場合は、次のコマンドを実行して pip の最新バージョンにアップグレードします。
python3.9 -m pip install --upgrade pip
2. 次のコマンドを実行して、コンパイル済みの Python パッケージの .whl ファイルを依存関係として Lambda 関数のプロジェクトディレクトリにインストールします。
重要: my-lambda-function を、関数のプロジェクトディレクトリの名前に置き換えてください。
pip install \
--platform manylinux2014_x86_64 \
--target=my-lambda-function \
--implementation cp \
--python 3.9 \
--only-binary=:all: --upgrade \
pandas
3. Lambda 関数のプロジェクトディレクトリを開きます。macOS を使用している場合は、次のコマンドを実行します。
cd my-lambda-function
4. テキストエディタで、lambda_function.py という名前の新しいファイルを作成します。その後、次のサンプルコードをコピーしてファイルに貼り付け、Lambda 関数のプロジェクトディレクトリに保存します。
import numpy as np
import pandas as pd
def lambda_handler(event, context):
df2 = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),columns=["a", "b", "c"])
number = np.pi
print(df2)
print(number)
5. 次のコマンドを実行して、インストールされているすべてのライブラリとソースコードを含む Lambda デプロイパッケージの .zip ファイルアーカイブを作成します。
zip -r ../my-deployment-package.zip .
6. my-deployment-package.zip ファイルアーカイブを使用して、新しい Python 3.9 Lambda 関数を作成するか、既存の関数を更新します。手順については、AWS Lambda デベロッパーガイドの「Deploy your .zip file to the function」(.zip ファイルを関数にデプロイする) を参照してください。
注: 同様の手順を使用して、複数の関数で使用できる Lambda レイヤーを作成できます。例えば、次のコマンドは、arm64 アーキテクチャで実行される Lambda Python 3.9 ランタイム用の pandas をインストールする新しい Lambda レイヤーを作成します。
pip install \
--platform manylinux2014_aarch64 \
--target=./python/lib/python3.9/site-packages \
--implementation cp \
--python 3.9 \
--only-binary=:all: --upgrade \
pandas