PythonでのAWSLambdaインポートモジュールエラー


98

AWS Lambdapythonデプロイメントパッケージを作成しています。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で作成し、lambdaにアップロードしました(ディレクトリではなく、ディレクトリのコンテンツを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

エラーのデバッグを手伝ってください。


それはあなたの完全なコードですか?エラーによって、どこかに何かがimport lambda_function見つからないように思われます。たぶんあなたが欲しいfrom future import lambda_functionですか?または、cmd行にlambda_functionpipインストールします。
Berci 2016

@BerciAWSプラットフォームでこのPythonコードを実行しています。ピップは使えません。私のコードのどこでもlambda_functionを使用しています。AWSコンソールに同じコードをコピーして貼り付けると機能します
Nithin K Anil 2016

このスレッドの最後のコメントを参照してください—多分あなたに当てはまりますか?
kwinkunks 2016

@kwinkunks私はそれを試しました。実際にはディレクトリではなくコンテンツを圧縮しています!!
Nithin K Anil 2016

2
私の推測では、関数の「ハンドラー」オプションが正しくありません。ファイル名が「lambda_function.py」で、ハンドラーメソッドが「lambda_handler」であることを確認してください
Vor

回答:


115

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

スナップショットの下をご覧ください。 ここに画像の説明を入力してください


1
私のコードは、ファイルとしてではなく、コードとしてラムダになっています。
ベンウィーラー

4
@BenWheeler:インラインコードですが、実際に書き込んだファイルです。ウィンドウの左側にファイル名とディレクトリ構造全体が表示されます。
ヴィニート2018年

そのため、コードに「lambda_function.py」という名前を付けましたが、ハンドラーにPython_lambda_function.lambda_handlerという名前を付ける必要がありますか?
RB 1719

@RahulBanerjeeいいえ。あなたはlambda_function.lambda_handlerとしてそれを呼ぶだろう
ディネッシュ

98

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


3
圧縮するときは、-rフラグも使用していることを確認してください。
グラントロバートスミス

@ 2ank3thあなたは最高です
SethuramanSrinivasan20年

これをありがとう。
JamesG

24

この問題のもう1つの原因は、zip形式のファイルに対するアクセス許可です。それはしなければならない、少なくとも世界的な読み取り可能。(分chmod 444

私はそれを圧縮する前にPythonファイルで以下を実行しました、そしてそれはうまくいきました。

chmod u=rwx,go=r

4
この。私はPythonのZipFileを使用してラムダ関数をプログラムでZIPにパッケージ化していましたが、デフォルトでは、おっしゃるように0600十分ではありません。さらに、統合されたLambdaソースコードエディター(Amazon Webページ上)は、パーミッションの問題を警告することなくファイルを問題なく読み取ります。
cjhanks 2016

2
第二に。ここに示す方法を使用してファイルのアクセス許可を設定することで機能しました:stackoverflow.com/a/434689/931277
dokkaebi 2017

16

ニティーンの答えはとても役に立ちました。具体的なウォークスルーは次のとおりです。

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

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

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


11

AWS Lambda(Python用)のデプロイメントパッケージを作成する際の落とし穴はたくさんあります。失敗することはめったにない式が見つかるまで、セッションのデバッグに何時間も費やしてきました。

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

手間のかからないPythonLambdaデプロイメント[チュートリアル+スクリプト]


2
素晴らしい投稿ですが、ネイティブライブラリをパッケージ化する方法である最も難しい部分の詳細が恋しいです。これがどのように複雑なその本当に正常ではない
JohnAndrews

10

これが簡単なステップです。

と呼ばれるフォルダーがあり、deploy呼び出し内にラムダファイルがあるとしますlambda_function.py。このファイルが次のようになっていると仮定しましょう。(p1およびp2サードパーティのパッケージを表します。)

import p1
import p2

def lambda_handler(event, context):
    # more code here

    return {
        "status": 200,
        "body" : "Hello from Lambda!",
    }

サードパーティの依存関係ごとpip install <third-party-package> --target .に、deployフォルダ内から行う必要があります。

pip install p1 --target .
pip install p2 --target .

これを実行すると、構造は次のようになります。

deploy/
├── lambda_function.py
├── p1/
│   ├── __init__.py
│   ├── a.py
│   ├── b.py
│   └── c.py
└── p2/
    ├── __init__.py
    ├── x.py
    ├── y.py
    └── z.py

最後に、フォルダzip内のすべてのコンテンツをdeploy圧縮ファイルにする必要があります。MacまたはLinuxでは、コマンドはフォルダーzip -r ../deploy.zip *内からのようになりdeployます。-rフラグは再帰的なサブフォルダー用であることに注意してください。

ファイルzipファイルの構造は、元のフォルダーを反映している必要があります。

deploy.zip/
├── lambda_function.py
├── p1/
│   ├── __init__.py
│   ├── a.py
│   ├── b.py
│   └── c.py
└── p2/
    ├── __init__.py
    ├── x.py
    ├── y.py
    └── z.py

zipファイルをアップロードし、上記の例のよう<file_name>.<function_name>に、プロセスに入力するLambdaを指定しますlambda_function.lambda_handler


1
また、のようにフォルダ全体を圧縮しないでくださいzip -r deploy.zip deploy。これにより、zipファイル内にデプロイフォルダーが作成されます。
openwonk

9

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


7

私もエラーがありました。私のzipファイルにはコードの親フォルダーが含まれていることがわかりました。unzipzipファイルを調べてみると、lambda_functionファイルは親フォルダーの下にあります./lambda

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

zip -r ../lambda.zip ./*

1
コードフォルダー内でzipを実行します。ここでの私の場合、cd lambda && zip -r ../lambda.zip ./*
Joe

4

ではlambda_handler形式でなければなりませんlambda_filename.lambda_functionNamelambda_handler関数を実行したいとしlambda_fuction.py、それがの場合、ハンドラーの形式はlambda_function.lambda_handlerです。

このエラーが発生するもう1つの理由は、モジュールの依存関係です。

あなたは、lambda_fuction.pyzipファイルのルートディレクトリにある必要があります。



2

2019年からの展望:

AWSLambdaはPython3.7をサポートするようになりました。これは、多くの人(私を含む)がインラインラムダのランタイムとして使用することを選択しています。

次に、外部の依存関係をインポートする必要があり、OPが参照するようにAWSDocsに従いました。(ローカルインストール-> zip->アップロード)。

インポートモジュールエラーが発生し、ローカルPCのデフォルトのPythonとしてPython2.7が使用されていることに気付きました。pipを呼び出すと、Python2.7の依存関係がインストールされました。

そこで、ラムダコンソールで選択したランタイムバージョンと一致するPythonバージョンにローカルで切り替えてから、外部依存関係を再インストールしました。これは私にとって問題を解決しました。例えば:

$ python3 -m pip install --target path/to/lambda_file <external_dependency_name>

1

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


1

Lambda関数の依存関係を(自分のマシンで)構築するために使用されるPythonバージョンが、Lambda関数用に選択されたPythonバージョンと異なるというここでの問題。このケースは、特にNumpyライブラリが依存関係の一部である場合によく見られます。

例:マシンのPythonバージョン:3.6 ---> Lambdapythonバージョン3.6


0

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

#!/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

誰かに役立つ場合に備えて、同じ問題の解決策を共有します。

問題:AWSの記事[2]で提供されているaws-big-data-blogコード[1]の実行中に、「[ERROR] Runtime.ImportModuleError:Unable to import module'lambda_function ':No module name'StringIO'」というエラーが発生しました。

解決策:ランタイムをPython3.7からPython2.7に変更しました

[1] — https://github.com/bsnively/aws-big-data-blog/blob/master/aws-blog-vpcflowlogs-athena-quicksight/CloudwatchLogsToFirehose/lambdacode.py [2] — https:// aws .amazon.com / blogs / big-data / analysis-vpc-flow-logs-with-amazon-kinesis-firehose-amazon-athena-and-amazon-quicksight /


これは、( - > 3.8 2.7)私のために他の方法で回避した
demonicdaron

0

Lambda関数を構成して、追加のコードとコンテンツをレイヤーの形式で取り込むことができます。レイヤーは、ライブラリ、カスタムランタイム、またはその他の依存関係を含むZIPアーカイブです。レイヤーを使用すると、デプロイメントパッケージにライブラリを含める必要なしに、関数でライブラリを使用できます。レイヤーを使用すると、デプロイメントパッケージを小さく保つことができるため、開発が容易になります。

参照:-

  1. https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html
  2. https://towardsdatascience.com/introduction-to-amazon-lambda-layers-and-boto3-using-python3-39bd390add17


0

私の問題は、.pyファイルと依存関係がzipの「ルート」ディレクトリにないことでした。たとえば、ライブラリのパスとラムダ関数.pyは次のようにする必要があります。

<lambda_function_name>.py
<name of library>/foo/bar/

ない

/foo/bar/<name of library>/foo2/bar2

例えば:

drwxr-xr-x  3.0 unx        0 bx stor 20-Apr-17 19:43 boto3/ec2/__pycache__/
-rw-r--r--  3.0 unx      192 bx defX 20-Apr-17 19:43 boto3/ec2/__pycache__/__init__.cpython-37.pyc
-rw-r--r--  3.0 unx      758 bx defX 20-Apr-17 19:43 boto3/ec2/__pycache__/deletetags.cpython-37.pyc
-rw-r--r--  3.0 unx      965 bx defX 20-Apr-17 19:43 boto3/ec2/__pycache__/createtags.cpython-37.pyc
-rw-r--r--  3.0 unx     7781 tx defN 20-Apr-17 20:33 download-cs-sensors-to-s3.py

0

実際にzipしたいメインフォルダ(デプロイメントパッケージ)に移動し、

そのフォルダ内ですべてのファイルを選択し、zipを作成してそのzipをアップロードします


0

以下に1つ追加してください Import requests

import boto3

私が見ることができるものはあなたのコードに欠けています。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.