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
오류를 디버깅 할 수 있도록 도와주세요.
답변
답변
zip 파일을 업로드하는 경우. 디렉토리 자체가 아닌 디렉토리의 내용을 압축하고 있는지 확인하십시오.
답변
이 문제의 또 다른 원인은 압축 된 파일에 대한 권한입니다. 그것은 반드시 적어도 전 세계적으로 읽을 수. (분 chmod 444
)
압축하기 전에 파이썬 파일에서 다음을 실행했는데 제대로 작동했습니다.
chmod u=rwx,go=r
답변
Nithin의 답변이 매우 유용하다는 것을 알았습니다. 다음은 구체적인 연습입니다.
다음 값을 찾으십시오.
- Python 스크립트의 lambda_handler 함수 이름입니다. AWS 예제에 사용 된 이름은 “def lambda_handler (event, context)”처럼 보이는 “lambda_handler”입니다. 이 경우 값은 “lambda_handler”입니다.
- Lambda 대시 보드에서 함수에 대한 람다 대시 보드의 “Configuration”섹션에있는 “Handler”텍스트 상자에서 Handler 이름을 찾습니다 (Nithin의 스크린 샷에 표시됨). 내 기본 이름은 “lambda_function.lambda_handler”입니다.
- Python 스크립트의 이름입니다. “cool.py”라고 가정 해 보겠습니다.
이러한 값을 사용하면 핸들러 (스크린 샷에 표시됨)의 이름을 “cool.lambda_handler”로 변경해야합니다. 이것은 “Unable to import module ‘lambda_function'”오류 메시지를 제거하는 한 가지 방법입니다. python 스크립트의 핸들러 이름을 “sup”으로 변경하려면 람다 대시 보드의 핸들러 이름을 “cool.sup”으로 변경해야합니다.
답변
너무 많은이 있습니다 개는은 (파이썬) AWS 람다에 대한 배포 패키지를 만들 때. 거의 실패하지 않는 공식을 찾을 때까지 디버깅 세션에 몇 시간을 보냈습니다.
전체 프로세스를 자동화하는 스크립트를 만들었으므로 오류 발생 가능성이 줄어 듭니다. 모든 것이 어떻게 작동하는지 설명하는 튜토리얼도 작성했습니다. 다음을 확인해보십시오.
답변
다음은 빠른 단계입니다.
deploy
call 안에 람다 파일 이있는라는 폴더가 있다고 가정합니다 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
합니다 (예 : 위의 예).
답변
위의 모든 솔루션을 시도한 후에 어려운 방법을 찾았습니다. zip 파일의 하위 디렉토리를 사용하는 경우 각 하위 디렉토리에 파일을 포함하고 __init__.py
저에게 효과적 이었는지 확인하십시오.