web-dev-qa-db-ja.com

pythonのAWS Lambdaインポートモジュールエラー

AWS Lambda pythonデプロイメントパッケージを作成しています。 1つの外部依存関係要求を使用しています。 AWSドキュメント http://docs.aws.Amazon.com/lambda/latest/dg/lambda-python-how-to-create-deployment-package.html を使用して外部依存関係をインストールしました。以下は私のpythonコードです。

import requests

print('Loading function')

s3 = boto3.client('s3')


def lambda_handler(event, context):
    #print("Received event: " + json.dumps(event, indent=2))

    # Get the object from the event and show its content type
    bucket = event['Records'][0]['s3']['bucket']['name']
    key = urllib.unquote_plus(event['Records'][0]['s3']['object']['key']).decode('utf8')
    try:
        response = s3.get_object(Bucket=bucket, Key=key)
        s3.download_file(bucket,key, '/tmp/data.txt')
        lines = [line.rstrip('\n') for line in open('/tmp/data.txt')]
        for line in lines:
            col=line.split(',')
            print(col[5],col[6])
        print("CONTENT TYPE: " + response['ContentType'])
        return response['ContentType']
    except Exception as e:
        print(e)
        print('Error getting object {} from bucket {}. Make sure they exist and your bucket is in the same region as this function.'.format(key, bucket))
        raise e

Project-dirディレクトリのコンテンツのZipを作成し、ラムダにアップロードしました(ディレクトリではなく、ディレクトリのコンテンツを圧縮します)。関数を実行すると、次のエラーが表示されます。

START RequestId: 9e64e2c7-d0c3-11e5-b34e-75c7fb49d058 Version: $LATEST
**Unable to import module 'lambda_function': No module named lambda_function**

END RequestId: 9e64e2c7-d0c3-11e5-b34e-75c7fb49d058
REPORT RequestId: 9e64e2c7-d0c3-11e5-b34e-75c7fb49d058  Duration: 19.63 ms  Billed Duration: 100 ms     Memory Size: 128 MB Max Memory Used: 9 MB

エラーのデバッグにご協力ください。

62
Nithin K Anil

エラーは、ラムダ関数のファイル名が原因でした。ラムダ関数の作成中に、Lambda関数ハンドラーを要求します。 Python_File_Name.Method_Nameとして名前を付ける必要があります。このシナリオでは、lambda.lambda_handlerという名前を付けました(lambda.pyはファイル名です)。

スナップショットの下にあります。 enter image description here

84
Nithin K Anil

Zipファイルをアップロードする場合。ディレクトリ自体ではなく、ディレクトリの内容を圧縮していることを確認してください。

44
2ank3th

この問題の別の原因は、圧縮されたファイルのアクセス許可です。それ_は_でなければならない少なくとも世界中で読める。 (最小chmod 444

pythonファイルを圧縮する前に以下を実行しましたが、うまくいきました。

chmod u=rwx,go=r
21
Catalin Ciurea

ニシンの答えは非常に役立つことがわかりました。具体的なウォークスルーは次のとおりです。

これらの値を検索します。

  1. pythonスクリプト内のlambda_handler関数の名前。 AWSの例で使用される名前は、「def lambda_handler(event、context)」のように見える「lambda_handler」です。この場合、値は「lambda_handler」です
  2. Lambdaダッシュボードで、関数のラムダダッシュボードの[構成]セクションにある[ハンドラー]テキストボックスでハンドラーの名前を見つけます(Nithinのスクリーンショットに表示)。私のデフォルト名は「lambda_function.lambda_handler」でした。
  3. pythonスクリプトの名前。 「cool.py」だとしましょう

これらの値を使用して、ハンドラー(スクリーンショットに表示)の名前を「cool.lambda_handler」に変更する必要があります。これは、「モジュール 'lambda_function'をインポートできません」というerrorMessageを取り除く1つの方法です。 pythonスクリプトのハンドラーの名前を「sup」に変更する場合、ラムダダッシュボードのハンドラーの名前を「cool.sup」に変更する必要があります。

12
user3303554

AWS Lambda(Python用)のデプロイパッケージを作成するとき、非常に多くのgotchasがあります。失敗することの少ない式が見つかるまで、デバッグセッションに何時間も費やしました。

プロセス全体を自動化するスクリプトを作成したため、エラーが発生しにくくなりました。また、すべてがどのように機能するかを説明するチュートリアルを作成しました。あなたはそれをチェックアウトしたいかもしれません:

面倒なPython Lambdaデプロイメント[チュートリアル+スクリプト]

8
joarleymoraes

上記の解決策をすべて試した後、私はこの難しい方法を見つけました。 Zipファイルでサブディレクトリを使用している場合は、各サブディレクトリに__init__.pyファイルを含めてください。

5
KApuri

私もエラーが発生しました。 Zipファイルにコードの親フォルダーが含まれていることがわかります。 unzipを使用してZipファイルを検査すると、lambda_functionファイルは親フォルダー./lambdaの下にあります。

Zipコマンドを使用して、エラーを修正します。

Zip -r ../lambda.Zip ./*
4
Joe

私は同じ問題にぶつかりました。これは、私が間違っていなければlynda.comのチュートリアルの一部としての演習でした。私が犯した間違いは、ランタイムをPython 3.6として選択しなかったことです。これは、lamda関数コンソールのオプションです。

1
Nadeem

lambda_handlerの形式はlambda_filename.lambda_functionNameである必要があります。lambda_handler関数を実行したい場合、lambda_fuction.pyにある場合、ハンドラー形式は「lambda_function.lambda_handler」です。エラーが発生する別の理由は、モジュールの依存関係です。 lambda_fuction.pyはZipのルートディレクトリにある必要があります。

1
primit patel

@ nithin、AWSはlayers関数内のLambdaコンセプトをリリースしました。レイヤーを作成し、ライブラリと同じ数だけアップロードしてから、レイヤーをラムダ関数に接続できます。詳細: https://docs.aws.Amazon.com/lambda/latest/dg/configuration-layers.html

0
muTheTechie

その混乱をする必要はありません。

python-lambdaを使用

https://github.com/nficano/python-lambda

単一のコマンドpylambda deployで、関数を自動的にデプロイします

0
uzu

すべての要件を圧縮する必要があります。このスクリプトを使用します

#!/usr/bin/env bash
rm package.Zip
mkdir package
pip install -r requirements.txt --target package
cat $1 > package/lambda_function.py
cd package
Zip -r9 "../package.Zip" .
cd ..
rm -rf package

で使用:

package.sh <python_file>
0
Uri Goren