如何在lambda函数中使用pymongo?
按照AWS-https://docs.aws.amazon.com/lambda/latest/dg/lambda-python-how-to-create-deployment-package.html#python-package-dependencies的说明进行操作后,我发现 pymongo 库不是我的lambda处理程序函数可以识别,而是其他本地包。
python-dateutil 是一个本地软件包,可以正常工作,但是pymongo软件包无法识别为导入文件,并且在运行时会失败。
我的文件名也正确地列在了lambda处理函数中(hotel-car-rental.lambda_handler),并且其他本地包导入也可以正常工作。因此,我认为这与pymongo有关?如何让pymongo与AWS Lambda配合使用?
以下是lambda文件结构:
以下是代码:
import json
import datetime
import dateutil.parser # <--- Works with local package
import logging
from pymongo import MongoClient # <--- Does NOT work with local package
# --- Main handler ---
def lambda_handler(event, context):
"""
Route the incoming request based on intent.
The JSON body of the request is provided in the event slot.
"""
logger.debug('event.bot.name={}'.format(event['bot']['name']))
return dispatch(event)
答案 0 :(得分:1)
您还可以-无需执行此操作,因为它需要使用您自己的东西进行复制/修补-在docker容器中运行此命令以打包lambda。
docker run -v <code directory>:/function -it --rm ubuntu
apt-get update
apt-get install python-pip
apt-get install zip
cd function
pip install -t . pymongo
cd ..
zip -r linux-lambda.zip working
我现在这样做的唯一原因是,当我使用Mac时(有时会这样做),有时会出现“无效的ELF标头”错误,而Lambda无法编译!
答案 1 :(得分:0)
我解决此问题的方法是将整个“ site-packages”目录打包到我的虚拟环境中,而不是打包单个打包位置。似乎pymongo安装了所需的其他依赖项,例如bson库。
这是我用来打包已安装的库以供aws lambda使用的特定过程。
mkdir -p ./package/tmp/lib
cp -a ./lambda/. ./package/tmp/
cp -a venv/lib/python3.7/site-packages/. ./package/tmp/
rm -rf ./package/tmp/wheel* && rm -rf ./package/tmp/pip*
cd ./package/tmp && zip -r ../../hotel-car-rental.zip .