コンパイルされたバイナリを含む Python パッケージをデプロイパッケージに追加し、そのパッケージを Lambda と互換性を持たせるにはどうすればよいですか?

最終更新日: 2022 年 9 月 23 日

pip を使用してコンパイルされたコードを含む Python パッケージをインストールしたところ、AWS Lambda 関数が「Unable to import module」(モジュールをインポートできません) というエラーを返すようになりました。なぜこれが発生するのですか? また、問題を解決するにはどうすればよいですか?

簡単な説明

コンパイルされたコード (NumPy や pandas など) を含む Python パッケージは、デフォルトでは常に Lambda ランタイムと互換性があるとは限りません。pip を使用してこれらのパッケージをインストールすると、パッケージはローカルマシンのアーキテクチャ用の module-name パッケージをダウンロードしてコンパイルします。これにより、Linux オペレーティングシステムを使用していない場合、デプロイパッケージは Lambda と互換性がなくなります。

Linux オペレーティングシステム以外で pip を使用する場合に Lambda Python ランタイムと互換性のある Lambda デプロイパッケージまたはレイヤーを作成するには、 --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

この記事はお役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?