web-dev-qa-db-ja.com

AWS Lambda-モジュール 'lambda_function'をインポートできません

私の他の多くの人と同じように、AWS Lambda関数を実行しようとしています。テストしようとすると、

"errorMessage": "モジュール 'lambda_function'をインポートできません"

ハンドラーはlambda_function.lambda_handlerに設定されており、実際には、lambda_handlerという関数を含むlambda_function.pyという名前のファイルがあります。これが証拠としてのスクリーンショットです: enter image description here

付属のIDEでコードのスニペットをインラインで記述しているときはすべて正常に機能していましたが、すべての依存関係でプログラム全体を圧縮してアップロードすると、上記のエラーが発生しました。

私は非常に大きいNumpyおよびScipyパッケージを使用しています。 zip圧縮されたディレクトリは34 MB、解凍されたディレクトリは122 MBです。圧縮されたディレクトリの制限は50 MBなので、これで問題ないはずです。次のメッセージが表示されるため、うまくアップロードされているようです。

Lambda関数「one-shot-image-classification」の展開パッケージが大きすぎるため、インラインコード編集ができません。ただし、今でも関数を呼び出すことができます。

Virtualenvを使用してこれを解決する記事がいくつかありますが、私はそのテクノロジーに精通しておらず、適切に使用する方法がわかりません。

依存関係には依存関係があり、それらを含める必要がある場合があるという記事もいくつか見ましたが、これを見つける方法はわかりません。

Lambda_function.pyの一番上の部分は、使用しているライブラリを確認するのに十分なはずであり、実際にlambda_handler関数があることを示しています。

import os
import boto3
import numpy as np
from scipy.ndimage import imread
from scipy.spatial.distance import cdist

def lambda_handler(event, context):

    s3 = boto3.resource('s3')

ここに、アップロードしているディレクトリの解凍バージョンのスクリーンショット: enter image description here

また、Lambdaが使用しているポリシーロールを投稿することもできます(それが問題になる可能性がある場合)。

洞察は大歓迎です!

UPDATE:

私が試した1つの解決策を次に示します。1. git clone https://github.com/Miserlou/lambda-packages 2. new_lambdaというドキュメントにフォルダーを作成します。3。記事に従ってDocker for AWSを使用してコンパイルしたscipyライブラリとともに、lambda-function.pyとnumpyフォルダーをlambda-packagesからnew_lambdaにコピーします。 https://serverlesscode.com/post/scikitlearn-with-Amazon-linux-container/ 4. new_lambdaフォルダーを右クリックして「compress」を選択し、zip圧縮します。

私の結果:

モジュール 'lambda_function'をインポートできません: 'lambda_function'という名前のモジュールはありません

繰り返しますが、私のファイルの名前はlambda_function.pyで、lambda_handlerという関数が含まれています。この関数は2つの引数を受け入れます(上記参照)。この情報は、ハンドラーで見られる情報と一致します。

それが重要な場合は、Macコンピューターを使用しています。

更新2

上記の手順に従うが、代わりに圧縮するファイルを直接選択してファイルを圧縮し、右クリックして「圧縮」を選択すると、代わりにエラーが発生します

モジュール 'lambda_function'をインポートできません:名前 'show_config'をインポートできません

また、プリコンパイルされたラムダパッケージは、「少なくともPython 2.7」用にコンパイルされているが、ラムダランタイムは3.6です。これは問題になりますか?

6
Spencer Goff

解決策は、numpyとscipyのプリコンパイル済みパッケージを this ソースから圧縮することでした。

1
Spencer Goff

問題は、ローカルnumpyおよびpandasがローカルマシンのアーキテクチャ用にコンパイルされていることです。AWSLambdaはカスタムLinuxを使用しているため、おそらく互換性がありません。

したがって、それらを使用する場合は、2つの選択肢があります。

  • AWS Lambdaと同じAmazon Linuxバージョンを使用するEC2インスタンスの依存関係をコンパイルし、デプロイパッケージを作成します。

  • here のプリコンパイル済みパッケージのいずれかを使用します

追伸投稿のコメントを読んだことがあるので、ファイルと関数の名前に問題はなく、numpyが問題を引き起こしていることがわかります。

7
ljmocic

同様の問題がありました:

_Unable to import module 'lib/lambda_function': No module named 'lib/lambda_function'
_

私とおそらくあなたのための修正は、lambda_function.pyと同じディレクトリに空の___init__.py_を含めることでした。

なぜ___init__.py_が問題を修正するのですか?

ディレクトリ(私の場合はlib、あなたの。ではlib)が有効なPythonパッケージであると見なされる必要があることを理解しています。

以下はその仮説に基づいた参考資料です: 5.2.1。通常パッケージ-Python 3.7.3 documentation

0
Alain O'Dea