无法将Pymongo导入AWS Lambda Function

时间:2018-12-12 20:35:49

标签: python mongodb amazon-web-services aws-lambda pymongo

如何在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文件结构:

  • BookTrip
    • dateutil
    • pymongo
    • hotel-car-rental.py

以下是代码:

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)

2 个答案:

答案 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 .