programing

Python에서 AWS 오류:람다_function이라는 모듈이 없습니다.

i4 2023. 6. 30. 22:04
반응형

Python에서 AWS 오류:람다_function이라는 모듈이 없습니다.

AWS Lambda Python 배포 패키지를 만들고 있습니다.외부 종속성 요청을 하나 사용하고 있습니다.AWS 설명서를 사용하여 외부 종속성을 설치했습니다.아래는 제 파이썬 코드입니다.

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을 만들고 람다에 업로드했습니다(디렉토리가 아닌 디렉터리 내용 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

람다 함수의 파일 이름으로 인해 오류가 발생했습니다.콘솔은 더 이상 원하는 핸들러 이름을 묻지 않고 "lambda_function.lambda_handler"로 설정합니다.

따라서 파일 이름이 "lambda_function.py"이고 함수 이름이 "lambda_handler"인지 확인해야 합니다.

다른 대안은 함수를 만든 후 처리기의 이름을 명시적으로 설정하는 것입니다.

zip 파일을 업로드하는 경우.디렉토리 자체가 아닌 디렉토리의 내용을 압축하는지 확인합니다.

이 문제의 또 다른 원인은 압축된 파일에 대한 사용 권한입니다.적어도 전 세계적으로 읽을 수 있어야 합니다.(분)chmod 444)

python 파일을 압축하기 전에 다음과 같이 실행해보니 정상적으로 작동했습니다.

chmod u=rwx,go=r

나는 니틴의 대답이 매우 도움이 된다는 것을 알았습니다.다음은 특정 단계별 설명입니다.

다음 값을 찾습니다.

  1. python 스크립트에 있는 lambda_handler 함수의 이름입니다.은 AWS 예제사이다같습니다음입니다.lambda_handler처럼 def lambda_handler(event, context)은 이경우, 값다과같습다니음입니다.lambda_handler
  2. 람다 대시보드에서 함수에 대한 람다 대시보드의 구성 섹션에 있는 핸들러 텍스트 상자에서 핸들러의 이름을 찾습니다(니틴의 스크린샷에 표시됨).내 기본 이름은.lambda_function.lambda_handler.
  3. 파이썬 스크립트의 이름입니다.예를 들어.cool.py

값을 하면 (을 " " " " " " " " " " " " (" " " " " " " 로 변경해야 .cool.lambda_handler이 방법은 "모듈을 가져올없습니다" 오류 메시지를 제거하는 한 가지 방법입니다.파이썬 스크립트의 핸들러 이름을 다음과 같이 변경하는 경우sup을 그면람대시핸의들이러름다변합음경니다야해로으을로 변경해야 .cool.sup

다음은 간단한 단계입니다.

다폴더있가정다니합다라는 폴더가 .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_function.lambda_handler위의 예에 대하여

AWS Lambda(Python용)용 배포 패키지를 생성할 때 gotchas가 너무 많습니다.저는 거의 실패하지 않는 공식을 찾을 때까지 디버깅 세션에 몇 시간을 보냈습니다.

전체 프로세스를 자동화하여 오류가 발생하기 쉬운 스크립트를 만들었습니다.저는 또한 모든 것이 어떻게 작동하는지 설명하는 튜토리얼을 썼습니다.다음을 확인할 수 있습니다.

번거롭지 않은 Python Lambda 배포 [튜토리얼 + 스크립트]

위의 모든 해결책을 시도해 본 결과 이 어려운 방법을 발견했습니다.파일에서 를 사용하는 zip 파일을 .__init__.py각 하위 디렉토리에 파일을 저장하고 제게 도움이 되었습니다.

lambda_handler형식은 다음과 같아야 합니다.lambda_filename.lambda_functionName을 한다고 가정합니다.lambda_handlerlambda_function.py 핸들러 이 그면당신핸형식입니다러들의러▁is다▁then니형입▁handler입니다.lambda_function.lambda_handler.

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

당신의.lambda_function.py파일의 .zip 파일의 루트 디렉터리에 있어야 합니다.

저도 오류가 있었어요.내 zip 파일에 부모 폴더 코드가 포함되어 있는 것으로 나타났습니다.내가 할 때unzip"zip zip"을 합니다.lambda_function 폴더 에 있습니다../lambda.

을 합니다.zip를 해결합니다.

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

람다 함수로 이동한 다음 계층을 선택한 다음 런타임 설정으로 스크롤하고 편집을 클릭합니다.

enter image description here

또한 YAML 파일의 특정 처리기로 SAM을 구성할 수도 있습니다.아래의 예.

AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Description: An AWS Serverless Specification template describing your function.
Resources:
  getRecommendation:
    Type: 'AWS::Serverless::Function'
    Properties:
      Handler: pythonfilename.lambda_handler
      Runtime: python3.7
      CodeUri: .
      Description: ''
      MemorySize: 128
      Timeout: 3
      Role: 'arn:aws:iam::xxxxx:role/lambdaroleIam'

폴더 구조의 모든 종속성을 python/[으로 압축합니다.[모든 종속성]을(를) 참조하여 이 문서에 따라 작동합니다.

https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html#configuration-layers-path

여기서 문제는 (사용자의 컴퓨터에서) 람다 함수 종속성을 구축하는 데 사용된 Python 버전이 람다 함수에 대해 선택된 Python 버전과 다르다는 것입니다.이 경우는 특히 Numpy 라이브러리가 종속성의 일부인 경우에 일반적입니다.

예:당신의 기계의 파이썬 버전: 3.6 ---> 람다 파이썬 버전 3.6

저는 zip 파일이 아닌 컨테이너를 통해 람다를 만들고 있었습니다.

이 문제를 해결한 것은 프로젝트를 "${LAMbda_TASK_ROOT}" 폴더에 복사한 것입니다. 이 폴더는 제가 선택한 사용자 지정 폴더가 아닙니다.

FROM public.ecr.aws/lambda/python:3.8

WORKDIR ${LAMBDA_TASK_ROOT}
COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt
COPY . .
CMD ["lambda_function.lambda_handler"]

이전에 WORKDIR을 설정하고 람다에서 "WORKDIR override" 설정을 사용하려고 했지만 "${LAMbda_TASK_ROOT}" 폴더를 사용했을 때만 작동했습니다.

@nithin, AWS »layers inside 내의개념Lambda기능들.레이어를 생성하여 라이브러리만큼 업로드한 후 레이어를 람다 함수와 연결할 수 있습니다.자세한 내용은 https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html .

2019년 이후의 전망:

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

그런 다음 외부 종속성을 가져와야 했고 OP에서 언급한 대로 AWS Docs를 팔로우했습니다. (local install --> zip --> upload)

가져오기 모듈 오류가 발생하여 로컬 PC에 Python 2.7이 기본 Python으로 설정되어 있다는 것을 알게 되었습니다.pip를 호출했을 때 Python 2.7에 대한 종속성이 설치되었습니다.

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

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

TL;DR을 시도합니다.chmod 755 python

이것이 이미 매우 긴 스레드라는 것을 알지만, 모든 커뮤니티 구성원들이 여기에 게시한 모든 잠재적인 해결책을 읽고도 여전히 다음 문제를 해결할 수 없다면, 제 문제를 해결한 해결책을 시도해 보십시오.

{
  "errorMessage": "Unable to import module 'xxx': No module named 'yyy'",
  "errorType": "Runtime.ImportModuleError",
  "stackTrace": []
}

Python 런타임에 대한 AWS Lambda Layer(배포 패키지가 아님)의 zip 파일을 말하는 것입니다.경우 은 내우경모종은다음폴배다아니치됩래에더라는 됩니다.python문서에 의하면

AWS Lambda Include library dependencies in a layer

로 이이지정폴사라는 를 사용합니다.pythonPython 버전에 의존하지 않기 때문에 다른 폴더 구조보다 더 좋습니다.

도 한번 해보세요.ls다음 코드 스니펫을 사용하여 람다:

import os

def lambda_handler(event, context):
    print(os.listdir('/opt'))
    print(os.listdir('/opt/python'))

예상 출력은 다음과 같습니다.

['python']
['OpenSSL', '__pycache__', ... 'urllib3', 'urllib3-1.24.2.dist-info']

저의 경우, 문제가 해결되기 전에 출력은

{
  "errorMessage": "[Errno 13] Permission denied: '/opt/python'",
  "errorType": "PermissionError",
  "stackTrace": [
    "  File \"/var/task/lambda_function.py\", line 16, in lambda_handler\n    print(os.listdir('/opt/python'))\n"
  ]
}

따라서, 그것은 분명히 허가 문제입니다.를 한 에.chmod 755 python,zip -r9 lambda-layer python 로드 중업lambda-layer.zip람다에게 문제가 해결되었습니다.

저는 같은 문제에 부딪혔는데, 제가 틀리지 않았다면 이것은 lynda.com 의 튜토리얼의 일부로 연습한 것입니다.제가 실수한 것은 런타임을 lamda 기능 콘솔의 옵션인 Python 3.6으로 선택하지 않은 것입니다.

누군가에게 도움이 될 경우를 대비해 동일한 문제에 대한 제 솔루션을 공유합니다.

문제: 오류가 발생했습니다: "[ERROR] 런타임.가져오기 모듈 오류:모듈 'lambda_function'을(를) 가져올 수 없습니다.'String'이라는 이름의 모듈이 없습니다.IO'"는 AWS 문서 [2]에 제공된 aWS-big-data-blog 코드[1]를 실행하는 동안 사용되었습니다.

솔루션:런타임이 Python 3.7에서 Python 2.7로 변경됨

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

레이어의 형태로 추가 코드와 컨텐츠를 끌어오도록 람다 함수를 구성할 수 있습니다.계층은 라이브러리, 사용자 지정 런타임 또는 기타 종속성을 포함하는 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

이 질문에 대해 동일한 문제를 가진 다른 사용자에게 이 답변을 추가하고 다른 솔루션은 사용할 수 없습니다.람다에 코드를 업로드한 후 배포를 클릭하지 않고 테스트를 시도해도 동일한 오류가 발생합니다. 테스트를 실행하려면 먼저 람다를 배포해야 합니다.enter image description here

위에서 언급했는지는 모르겠지만 .zip 파일 이름과 zip 내용이 일치해야 합니다.예: 파일: lambda.zip 및 내용: lambda.파이의

모든 요구 사항을 압축해야 합니다. 이 스크립트를 사용하십시오.

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

문제는 .py 파일과 종속성이 zip의 "root" 디렉터리에 없다는 것입니다. 예를 들어 라이브러리와 람다 함수 .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

뒤에 하나씩 해 주세요.Import requests

import boto3

제가 볼 수 있는 것은 당신의 코드에 없습니다.

zip에 있는 패키지 디렉토리도 세계에서 읽을 수 있어야 합니다.

문제인지 확인하려면(Linux) 다음을 사용합니다.

find $ZIP_SOURCE -type d -not -perm /001 -printf %M\ "%p\n"

사용 수정 방법:

find $ZIP_SOURCE  -type d -not -perm /001 -exec chmod o+x {} \;

파일을 읽을 수 있어야 합니다.문제인지 확인하려면 다음을 사용합니다.

find $ZIP_SOURCE -type f -not -perm /004 -printf %M\ "%p\n"

사용 수정 방법:

find $ZIP_SOURCE  -type f -not -perm /004 -exec chmod o+r {} \;

이 문제가 있고 Linux에서 작업 중인 경우 python 패키지를 만들거나 체크아웃할 때 umask가 적절하게 설정되어 있는지 확인합니다. 예를 들어 패키지 스크립트 또는 .bashrc:

umask 0002 

python 파일 이름을 lambda_function.py로 변경합니다. 예를 들어, 제 경우 파일 이름이 app.py 이었고 파일 이름을 lambda_function으로 변경하면 오류가 사라집니다.파이의

람다 함수 이름과 핸들러 이름이 일치하는지 확인합니다.들어, 함수 이름이' 람: 함인이름이 '인 index.py은 핸들러 기로이름을 '로 지정했습니다.lambda_function.lambda_handler그러면 '모듈 'lambda_function'을(를) 가져올없습니다.'라는 오류가 표시됩니다. 이름이 'lambda_function'인 모듈이 없습니다.

''에서.lambda_function.lambda_handler에게index.lambda_handler'

저는 람다 함수를 거치는 AWS 교육 과정을 밟고 있습니다.매우 기본적인 것처럼 보이지만 테스트 이벤트가 작동하기 전에 배포를 선택해야 합니다. 특히 다음이 포함되지 않은 코드를 업로드한 경우에는lambda_function.lambda_handler방법 - 이것은 나의 실수였습니다.이것은 제 훈련을 통해 저에게 명확하지 않았기 때문에, 이 바보 같은 실수로 30분 이상을 잃었습니다.

코드에 람다 함수를 알 수 없는 일부 패키지(예: 파이썬의 요청 모듈)가 포함되어 있을 수 있기 때문입니다.이를 해결하기 위해 AWS는 람다 함수에 레이어 개념을 도입하여 라이브러리 수만큼 업로드한 후 레이어를 람다 함수와 연결할 수 있습니다.

이전 스레드에 회신하는 것으로 알고 있습니다. 하지만 다른 사용자가 이 문제에 직면할 경우:

저는 오늘 M1 Mac에서 CloudFormation을 사용하여 Python Lambda 함수를 배포하는 것과 같은 문제를 겪었습니다.파일 이름과 핸들러가 올바른 것 같았지만 람다 프레임워크는 여전히 내 모듈을 찾을 수 없었습니다.

결국 제가 기능을 사용하도록 구성한 것으로 밝혀졌습니다.x86_64건축 양식를 CloudFormation 에서 변용경릿록 CloudFormation 플템arm64건축이 그 문제를 해결했습니다.

언급URL : https://stackoverflow.com/questions/35340921/aws-error-from-python-no-module-named-lambda-function

반응형