【问题标题】:Error deploying Python package to AWS Lambda将 Python 包部署到 AWS Lambda 时出错
【发布时间】:2016-08-09 17:48:45
【问题描述】:

当我上传 zip 文件时,AWS 成功创建了 lambda 函数。但是当我测试它时它给出了这个错误。

{
  "errorMessage": "Unable to import module 'amazonSNS'"
}

以下是我创建的 zip 文件的内容。我尝试将 zip 文件的名称更改为“amazonSNS”以匹配 amazonSNS.py 文件,但没有帮助,同样的问题。

Lambda 函数配置中的 Lambda 处理程序设置为“amazonSNS.handler”,其中 amazonSNS 是文件名,handler 是需要调用的函数名,正如他们在文档中所指示的那样。

这里是python文件的内容

import boto3
import MySQLdb

client = boto3.client("sns")
rds = boto3.client("rds")

def handler(event, context):
    conn = MySQLdb.connect("host", "username", "password", "database")
    cur = conn.cursor(MySQLdb.cursors.DictCursor)
    query = "select * from login.login limit 10"
    cur.execute(query)
    print cur.fetchall()
    print conn

这可能是什么问题?

这是日志输出

START RequestId:76a61551-052a-11e6-b466-8fa0769ac309 版本:$LATEST 无法导入模块“amazonSNS”:没有名为 _mysql 的模块

END 请求 ID:76a61551-052a-11e6-b466-8fa0769ac309 报告请求 ID: 76a61551-052a-11e6-b466-8fa0769ac309 持续时间:0.33 毫秒 持续时间:100 毫秒

更新

我从“site-package”文件夹中添加了一些我认为是 MySQLdb 包的一部分的文件,这是 zip 文件的当前内容。

在此之后,新的错误日志是。

START RequestId:c0715d9a-0531-11e6-9409-a3b194fd4afd 版本:$LATEST 无法导入模块“amazonSNS”:libmysqlclient.so.18:无法打开 共享对象文件:没有这样的文件或目录

END 请求 ID:c0715d9a-0531-11e6-9409-a3b194fd4afd 报告请求 ID: c0715d9a-0531-11e6-9409-a3b194fd4afd 持续时间:0.35 毫秒 持续时间:100 毫秒内存大小:128 MB 使用的最大内存:22 MB

【问题讨论】:

  • 我会强烈建议在开发 lambda 函数时始终使用虚拟环境。 Tutorials 的用法就在那里。这允许您使用完全您需要的软件包来构建和测试您的软件。然后,您只需将 pip --version 的内容(在激活 virtualenv 的情况下运行)复制到您上传的 zip 文件的顶级目录中,并确保您获得了所需的每个 (Python) 文件。
  • 不幸的是,获取所有您需要的 Python 文件似乎并没有涵盖您对某些依赖于 系统的软件的基础> 文件。 @OmarZairi 的回答向您展示了一种解决方法,当不在您的 virtualenv 的 site-packages 目录中的文件出现错误时,它应该是非常通用的。
  • 刚刚意识到,如果您不使用 Pipenv 或 virtualenvwrapper,则使用 pip --version 来识别 virtualenv 的 site-packages 目录的位置可能不起作用。无论如何,您可能应该使用其中之一。
  • 这是来自亚马逊(坦率地说,通常很糟糕)官方文档中的info on the virtualenv strategy
  • 如果您花费大量时间创建 Lambda 进程,那么在与 lambda 进程相同的环境中创建的虚拟环境中测试它们可能是值得的,这可以通过创建 EC2 instance using the official image 来完成.

标签: python amazon-web-services lambda


【解决方案1】:

要解决这个问题: 我搜索了libmysqlclient.so.20(最后的版本号可能不同)

find /. -name "libmysqlclient.so.20"

我的输出是

/./usr/lib/x86_64-linux-gnu/libmysqlclient.so.20

然后我将该文件复制到我的包的根目录中

cp /usr/lib/x86_64-linux-gnu/libmysqlclient.so.20 <your package path>

【讨论】:

  • locate 通常会比 find 更快地找到。
  • 不知道是不是最后的版本号有问题。您的 Python 版本可能引用的版本号与 Lambda 实例上可用的版本号不同。
  • 是的,版本号会根据您的系统版本而有所不同。但我也注意到依赖包必须与 ubuntu 兼容(我假设因为 AWS Lambda 是基于 linux 运行的)
【解决方案2】:

我未能编译 MySQL-python 使其在 Lambda 中工作。相反,我切换到pymysql。我不确定性能,但至少这是可行的。

附:我想知道为什么亚马逊上没有关于建议的 MySQL 驱动程序的官方建议。至少我还没找到。

【讨论】:

    【解决方案3】:

    我在使用 mysqlclient(适用于 Python3 的 MySQLd 分支)时遇到了这个问题。

    由于我使用Zappa 方便部署,因此解决方案很简单:只需切换到原始 MySQLd 包(但它不支持 Python 3):pip install mysql-python Zappa 附带了一个预编译的version

    【讨论】:

      【解决方案4】:

      您是如何安装 MySQLdb 的? http://mysql-python.sourceforge.net/FAQ.html 说:

      ImportError: 没有名为 _mysql 的模块 如果你看到这个,很可能你在安装 MySQLdb 时做错了;重新阅读(或阅读)自述文件。 _mysql 是与 MySQL 客户端库接口的低级 C 模块。

      如果您还没有安装 MySQLdb,请使用 pip。

      【讨论】:

      • 是的,我使用pip install MySQL-python 安装了 MySQLdb。我必须使用 sudo apt-get install libmysqlclient-dev 在我的 Ubuntu 机器上安装另一个依赖项,之后 MySQLdb 安装成功。您认为依赖性可能是这里的问题吗?如果是这样,那么知道如何解决它吗?
      • 您是否尝试过使用不同的库,例如 github.com/PyMySQL/PyMySQL
      • 不,因为 this(MySQLdb) 似乎是最受欢迎和最快的。但是让我试试另一个库。
      猜你喜欢
      • 2017-06-19
      • 2021-01-07
      • 2019-09-25
      • 2016-03-05
      • 1970-01-01
      • 1970-01-01
      • 2017-07-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多