我知道使用部署程序包的概念相对简单,但是最近几个小时我一直在努力解决这个问题。我正在关注documentation from AWS on packaging up Lambda dependencies。我想编写一个简单的Lambda函数,以在发生某些事件时更新PostgreSQL表中的条目。
我首先创建一个新目录以在其中工作:
mkdir lambdas-deployment && cd lambdas-deployment
然后创建一个新的虚拟环境并安装我的软件包:
virtualenv v-env
source v-env/bin/activate
pip3 install sqlalchemy boto3 psycopg2
我的 trigger-yaml-parse.py 函数(它实际上并未使用 sqlalchemy 库,但我只是想成功导入它):
import logging
import json
import boto3
import sqlalchemy
def lambda_handler(event, context):
records = event['Records']
s3_records = filter(lambda record: record['eventSource'] == 'aws:s3', records)
object_created_records = filter(lambda record: record['eventName'].startswith('ObjectCreated'), s3_records)
for record in object_created_records:
key = record['s3']['object']['key']
print(key)
我一直在遵循AWS文档中的说明。
zip -r trigger-yaml-parse.zip $VIRTUAL_ENV/lib/python3.6/site-packages/
然后我添加我的功能代码:
zip -g trigger-yaml-parse.zip trigger-yaml-parse.py
我得到updating: trigger-yaml-parse.py (deflated 48%)
的输出。
然后,我将新的压缩部署上传到我的S3构建存储桶中:
aws s3 cp trigger-yaml-parse.zip s3://lambda-build-bucket
但是,我的Lambda函数在执行时失败,并显示以下错误:
START RequestId: 396c6c3c-3f5b-4df9-b7f1-057842a87eb3 Version: $LATEST
Unable to import module 'trigger-yaml-parse': No module named 'sqlalchemy'
我在做什么错?我从字面上一步一步地遵循了AWS的文档。
答案 0 :(得分:1)
”使用错误权限上传的压缩包可能导致执行 失败。 AWS Lambda要求对代码文件和 构成您的部署软件包的所有依赖库”
因此您可以使用zip信息来检查权限:
zipinfo trigger-yaml-parse.zip
-r --------表示只有文件所有者具有权限。
答案 1 :(得分:1)
我认为您的问题可能在此行:
zip -r trigger-yaml-parse.zip $VIRTUAL_ENV/lib/python3.6/site-packages/
创建zip文件时,压缩文件将具有您磁盘中完整的路径。 lambda中的python运行时将无法找到这些库。
相反,您应该执行以下操作
cd $VIRTUAL_ENV/lib/python3.6/site-packages/
zip -r /full/path/to/trigger-yaml-parse.zip .
对这两个文件运行unzip -t,您将看到区别。