'lambda_function'모듈을 가져올 수 없습니다. *라는 모듈이 없습니다.
추가 패키지를 사용하는 파이썬 람다 함수를 실행하려고합니다. 그러나 .zip 파일을 람다 콘솔에 업로드 할 때마다 오류가 발생합니다.
{
"errorMessage": "Unable to import module 'lambda_function': No module named '*'",
"errorType": "Runtime.ImportModuleError"
}
나는 다음 지시를 따랐다. https://docs.aws.amazon.com/lambda/latest/dg/python-package.html#python-package-dependencies 내 패키지가 내 람다 함수의 로컬 디렉토리에 있는지 확인하라는 메시지가 표시되었습니다.
~/my-function$ pip install --target ./package Pillow
필로우를 사용하지 않습니다. 해당 사이트의 샘플 코드입니다. 이미 Lambda에서 액세스 할 수있는 패키지를 사용하고 있지 않습니다. 그것은 내가 github에서 얻은 것이고 내 앱에 첨부해야합니다.
처음에는 작동하지 않았으므로 setup.cfg파일을 만들고 다음을 추가했습니다.
[install]
prefix=
이제 pip명령을 사용하여 대상에 설치하면 작동합니다 (내 패키지 이외의 다른 폴더도 추가하지만 필요하다고 생각하여 거기에 두었습니다.
디렉토리로 이동하면 패키지가 있습니다.
그런 다음이 답변을 찾았습니다. https://stackoverflow.com/a/12493244/5675125 아마도 일부 숨겨진 파일이 포함되지 않았을 가능성이 있으며 이것이 압축 방법입니다.
다시 같은 오류입니다.
람다가 내 패키지가 있음을 인식하도록하려면 어떻게해야합니까?
답변
Pillow가 필요한 경우 함수에서 사용하는 가장 쉬운 방법 은 github의 keithrozario / Klayers 와 같은 공용 레이어 (필로우 포함)가있는 인기있는 저장소를 사용하는 것 입니다. 이를 사용하려면 리전을 기반으로 레이어의 ARN을 찾습니다 . Python 3.8 용 ARN 목록은 여기에 있습니다 .
예를 들어 us-east-1Python 3.7 용으로 추가 된 레이어는 다음과 같습니다.
최신 정보
방금 사용자 정의 레이어를 instabot만들고 작동하는지 확인할 수 있습니다.
사용 된 기술에는 최근 AWS 블로그에 설명 된 Docker 도구가 포함됩니다 .
- Docker와 함께 시뮬레이션 된 Lambda 환경을 사용하여 Lambda 계층을 생성하려면 어떻게해야합니까?
따라서이 질문에 대해 다음과 같이 확인했습니다 .
빈 폴더 (예 :
mylayer.폴더로 이동
requirements.txt하여 내용으로 파일을 만듭니다.
instabot
- 다음 docker 명령을 실행하십시오.
docker run -v "$PWD":/var/task "lambci/lambda:build-python3.8" /bin/sh -c "pip install -r requirements.txt -t python/lib/python3.8/site-packages/; exit"
- numpy 제거
이 instabot필요로 numpy매우 큰있다. 따라서 레이어를 만들기 전에 수동으로 제거합니다. numpy대신 AWS에서 제공 하는 레이어 를 사용하겠습니다 .
sudo rm -rvf ./python/lib/python3.8/site-packages/numpy*
numpy를 제거하지 않으면 레이어는> 50MB가됩니다.
- zip으로 레이어 만들기 :
zip -9 -r mylayer.zip python
mylayer.zipAWS 콘솔을 기반으로 람다 계층을 생성합니다 . 로 지정Compatible runtimes하는 것을 잊지 마십시오python3.8.함수에 두 개의 레이어를 추가합니다.
첫 번째는 AWSLambda-Python38-SciPy1xAWS에서 numpy 로 제공하고 두 번째는 위에서 만든 것입니다. 따라서 함수는 두 개의 레이어를 사용합니다.
- 다음 람다 함수를 사용하여 람다의 계층을 테스트합니다.
import json
from instabot import Bot
def lambda_handler(event, context):
# TODO implement
bot = Bot(base_path='/tmp')
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}