Python의 AWS Lambda 가져 오기 모듈 오류


92

AWS Lambda Python 배포 패키지를 생성하고 있습니다. 하나의 외부 종속성 요청을 사용하고 있습니다. AWS 설명서 http://docs.aws.amazon.com/lambda/latest/dg/lambda-python-how-to-create-deployment-package.html을 사용하여 외부 종속성을 설치했습니다 . 아래는 내 파이썬 코드입니다.

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

오류를 디버깅 할 수 있도록 도와주세요.


전체 코드입니까? 오류로 인해 import lambda_function찾을 수없는 무언가를 원하는 것 같습니다 . 아마도 당신은 원 from future import lambda_function하십니까? 또는 cmd 줄에 lambda_function설치하십시오 .
Berci

@Berci AWS 플랫폼에서이 파이썬 코드를 실행하고 있습니다. pip를 사용할 수 없습니다. 내 코드의 어느 곳에서나 lambda_function을 사용하고 있습니다. 내가 붙여 복사하면 AWS에서 동일한 코드는 작동 콘솔
니씬 K 아닐

이 스레드 에 대한 마지막 댓글을 참조하십시오. 귀하에게 해당 될 수 있습니까?
kwinkunks

@kwinkunks 나는 그것을 시도했다. 실제로 디렉토리가 아닌 콘텐츠를 압축하고 있습니다 !!
Nithin K Anil

2
내 생각 엔 함수의 "핸들러"옵션이 잘못되었다는 것입니다. 파일 이름이 "lambda_function.py"이고 핸들러 메소드가 "lambda_handler"인지 확인하십시오.
Vor

답변:


110

람다 함수의 파일 이름으로 인해 오류가 발생했습니다. 람다 함수를 생성하는 동안 Lambda 함수 핸들러를 요청합니다. Python_File_Name.Method_Name 으로 이름을 지정해야합니다 . 이 시나리오에서는 lambda.lambda_handler로 이름을 지정했습니다 (lambda.py는 파일 이름 임).

아래에서 스냅 샷을 찾으십시오. 여기에 이미지 설명 입력


1
내 코드는 파일이 아닌 코드로 람다에 있습니다.
Ben Wheeler

4
@BenWheeler : 인라인 코드이지만 실제로 작성하는 파일입니다. 창 왼쪽에서 파일 이름과 전체 디렉토리 구조를 볼 수 있습니다.
Vineeth

그래서 코드 이름을 "lambda_function.py"로 지정했는데 핸들러 이름을 Python_lambda_function.lambda_handler로 지정해야합니까?
RB17

@RahulBanerjee 번호 당신은 lambda_function.lambda_handler로 부를 것이다
네쉬

90

zip 파일을 업로드하는 경우. 디렉토리 자체가 아닌 디렉토리의 내용을 압축하고 있는지 확인하십시오.


2
압축 할 때 -r 플래그도 사용하고 있는지 확인하십시오!
Grant Robert Smith

@ 2ank3th 당신은 최고입니다
Sethuraman Srinivasan

감사합니다.
JamesG

24

이 문제의 또 다른 원인은 압축 된 파일에 대한 권한입니다. 그것은 반드시 적어도 전 세계적으로 읽을 수. (분 chmod 444)

압축하기 전에 파이썬 파일에서 다음을 실행했는데 제대로 작동했습니다.

chmod u=rwx,go=r

4
이. Python의 ZipFile을 사용하여 프로그래밍 방식으로 람다 함수를 ZIP으로 패키지화했습니다. 기본적으로 0600언급 한대로 충분하지 않습니다. 또한 통합 Lambda 소스 코드 편집기 (Amazon 웹 페이지에 있음)는 권한 문제에 대한 경고없이 파일을 즐겁게 읽을 수 있습니다.
cjhanks

2
둘째. 여기에 표시된 방법을 사용하여 파일 권한을 설정하여 작업했습니다. stackoverflow.com/a/434689/931277
dokkaebi

15

Nithin의 답변이 매우 유용하다는 것을 알았습니다. 다음은 구체적인 연습입니다.

다음 값을 찾으십시오.

  1. Python 스크립트의 lambda_handler 함수 이름입니다. AWS 예제에 사용 된 이름은 "def lambda_handler (event, context)"처럼 보이는 "lambda_handler"입니다. 이 경우 값은 "lambda_handler"입니다.
  2. Lambda 대시 보드에서 함수에 대한 람다 대시 보드의 "Configuration"섹션에있는 "Handler"텍스트 상자에서 Handler 이름을 찾습니다 (Nithin의 스크린 샷에 표시됨). 내 기본 이름은 "lambda_function.lambda_handler"입니다.
  3. Python 스크립트의 이름입니다. "cool.py"라고 가정 해 보겠습니다.

이러한 값을 사용하면 핸들러 (스크린 샷에 표시됨)의 이름을 "cool.lambda_handler"로 변경해야합니다. 이것은 "Unable to import module 'lambda_function'"오류 메시지를 제거하는 한 가지 방법입니다. python 스크립트의 핸들러 이름을 "sup"으로 변경하려면 람다 대시 보드의 핸들러 이름을 "cool.sup"으로 변경해야합니다.


11

너무 많은이 있습니다 개는은 (파이썬) AWS 람다에 대한 배포 패키지를 만들 때. 거의 실패하지 않는 공식을 찾을 때까지 디버깅 세션에 몇 시간을 보냈습니다.

전체 프로세스를 자동화하는 스크립트를 만들었으므로 오류 발생 가능성이 줄어 듭니다. 모든 것이 어떻게 작동하는지 설명하는 튜토리얼도 작성했습니다. 다음을 확인해보십시오.

간편한 Python Lambda 배포 [튜토리얼 + 스크립트]


2
훌륭한 게시물이지만 네이티브 라이브러리를 패키징하는 가장 어려운 부분에 대한 세부 정보가 누락되었습니다. 이것이 얼마나 복잡한 지 정말 정상이 아닙니다
JohnAndrews 19

10

다음은 빠른 단계입니다.

deploycall 안에 람다 파일 이있는라는 폴더가 있다고 가정합니다 lambda_function.py. 이 파일이 다음과 같다고 가정 해 봅시다. ( p1p2타사 패키지를 나타냅니다.)

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_functionName . lambda_handler함수 를 실행하고 싶고에 있다고 가정하면 lambda_fuction.py처리기 형식은 lambda_function.lambda_handler.

이 오류가 발생하는 또 다른 이유는 모듈 종속성입니다.

당신은 lambda_fuction.pyzip 파일의 루트 디렉토리에 있어야합니다.



1

나는 같은 문제를 만났는데, 이것은 내가 틀리지 않은 경우 lynda.com에서 튜토리얼의 일부로 연습이었습니다. 내가 저지른 실수는 lamda 함수 콘솔의 옵션 인 Python 3.6으로 런타임을 선택하지 않은 것입니다.


1

2019 년의 관점 :

AWS Lambda는 이제 Python 3.7을 지원하며, 많은 사람들 (나를 포함하여)이 인라인 람다의 런타임으로 사용하기로 선택합니다.

그런 다음 외부 종속성을 가져와야하고 OP에서 언급 한 AWS Docs를 따랐습니다. (로컬 설치-> zip-> 업로드).

가져 오기 모듈 오류가 발생하여 로컬 PC에 기본 Python이 Python 2.7이 있음을 깨달았습니다. pip를 호출했을 때 Python 2.7에 대한 종속성이 설치되었습니다.

그래서 람다 콘솔에서 선택한 런타임 버전과 일치하는 Python 버전으로 로컬로 전환 한 다음 외부 종속성을 다시 설치했습니다. 이것은 나를 위해 문제를 해결했습니다. 예 :

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

1

여기에서 Lambda 함수 종속성을 빌드하는 데 사용 된 Python 버전 (자신의 머신에서)이 Lambda 함수에 대해 선택한 Python 버전과 다르다는 문제가 있습니다. 이 경우는 특히 Numpy 라이브러리가 종속성의 일부인 경우에 일반적입니다.

예 : 머신의 Python 버전 : 3.6 ---> Lambda python 버전 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 named 'StringIO'"오류가 발생했습니다.

솔루션 : 런타임이 Python 3.7에서 Python 2.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 / analyzing-vpc-flow-logs-with-amazon-kinesis-firehose-amazon-athena-and-amazon-quicksight /


그것은 나를위한 다른 길이었다 (
2.7-

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을 업로드하십시오.


0

아래에 하나씩 추가하세요 Import requests

import boto3

귀하의 코드에서 누락 된 것을 볼 수 있습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.