【问题标题】:Unable to import Pymongo into AWS Lambda Function无法将 Pymongo 导入 AWS Lambda 函数
【发布时间】:2018-12-12 20:35:48
【问题描述】:

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

  • 图书之旅
    • 日期工具
    • 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)

【问题讨论】:

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


    【解决方案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 无法编译!

    【讨论】:

      【解决方案2】:

      我解决此问题的方法是将整个“站点包”目录打包到我的虚拟环境中,而不仅仅是单独的包位置。看起来 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 .
      

      【讨论】:

        【解决方案3】:

        我正在通过无服务器框架构建 AWS lambda,并且遇到了类似的问题。然而,我发现了一个officialexample,并注意到他们提供了一个名为serverless-python-requirements 的特定插件。一旦我将它添加到 serverless.yml

        plugins:
          - serverless-python-requirements
        

        我收到一条警告(在 serverless deploy 上)我必须安装插件,这是通过

        serverless plugin install -n serverless-python-requirements
        

        完成此操作后,从 pymongo 导入不再导致问题。
        (我还必须将node_modules/ 添加到.gitignore 并将包文件添加到git)


        注意:还有一个known problem,包括使用 Windows + VS Code/Powershell 的用户在内的一些用户可能会遇到serverless-python-requirements:如果有人通过创建requirements.txt

        pip freeze > requirements.txt
        

        这可能会导致错误的编码,serverless deploy 在这种情况下会失败。将编码更改为 UTF-8 可解决此问题。他们建议使用

        pip freeze | Out-File -Encoding UTF8 requirements.txt
        

        反而允许避免这个问题。

        【讨论】:

          猜你喜欢
          • 2021-09-25
          • 1970-01-01
          • 2016-04-26
          • 2023-03-30
          • 2019-12-11
          • 2021-01-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多