在Python中使用MySQL和AWS Lambda的问题

Guy*_*her 25 python mysql amazon-web-services python-2.7 aws-lambda

我正在尝试使用AWS Lambda Python(Python btw中的初学者)启动并运行,但在包含MySQL依赖项方面存在一些问题.我试图按照指示在这里我的Mac上.

对于第3步,我在项目的根目录下执行命令会遇到一些问题

sudo pip install MySQL-python -t /
Run Code Online (Sandbox Code Playgroud)

错误:

例外:回溯(最近一次调用最后一次):文件"/Library/Python/2.7/site-packages/pip-1.5.6-py2.7.egg/pip/basecommand.py",第122行,处于主状态= self .run(options,args)在运行os.path中的文件"/Library/Python/2.7/site-packages/pip-1.5.6-py2.7.egg/pip/commands/install.py",第311行. join(options.target_dir,item)文件"/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py",第292行,移动引发错误,"目标路径"%s '已存在'%real_dst错误:目标路径'/MySQL_python-1.2.5-py2.7.egg-info/MySQL_python-1.2.5-py2.7.egg-info'已存在

我最终编写了以下lambda函数(在我的Mac上运行正常),这是:

import MySQLdb

def lambda_handler(event, context):
   # Open database connection
   db = MySQLdb.connect(...)

   # prepare a cursor object using cursor() method
   cursor = db.cursor()

   sql = "SELECT * FROM Users"

   try:
      # Execute the SQL command
      cursor.execute(sql)
      # Fetch all the rows in a list of lists.
      results = cursor.fetchall()
      for row in results:
         fname = row[0]
         lname = row[1]
         age = row[2]
         sex = row[3]
         income = row[4]
         # Now print fetched result
         print ("lname=%s" %(lname))
   except:
      print "Error: unable to fecth data"

   # disconnect from server
   db.close()
Run Code Online (Sandbox Code Playgroud)

我接下来要去/Library/Python/2.7/site-packages并复制我在做sudo pip时下载的MySQLdb文件夹/文件安装MySQL-python(没有-t /)(我是确定我在这里做错了什么),到我的lambda项目,然后将内容与lambda_function.py一起压缩并上传到AWS Lambda.

然后我得到:

无法导入模块'lambda_function':没有名为MySQLdb的模块

感谢任何帮助和建议!

编辑

能够做sudo pip安装MySQL-python -t/pathToProject工作(感谢评论中的帮助)但是现在我在运行lambda函数时得到了这个:

无法导入模块'lambda_function':/ var/task/_mysql.so:无效的ELF标头

我知道,如果我在Linux机器上工作,那么它应该可以正常工作(正如一些人所建议的那样),但我想知道我是否可以从OS X机箱开始工作.

sys*_*ack 9

对于像Lambda这样的用例,使用像PyMySQL这样的纯python实现会更快乐.

它是遵循Python数据库API规范的MySQLdb的替代品.对于大多数事情,比如触发的Lambda事件,它会同样快.

我在生产中经常使用它并且效果很好.


non*_*ing 8

mysqlclientTLDR:是的,您可以在 AWS Lambda Python 函数中使用。

这是一种方法 - 创建您自己的 AWS Lambda 层mysqlclient(即MySQLdb)。

然后我得到Unable to import module 'lambda_function': No module named MySQLdb

我知道如果我在 Linux 机器上工作,那么它应该可以正常工作(正如某些人所建议的那样),但我想知道是否可以使其在 OS X 机器上工作。

import MySQLdb我在尝试使用 AWS Lambda Python 函数时也遇到了完全相同的错误。

经过大量搜索解决方案并且对用作pymysql替代方案不满意(出于性能和兼容性原因),我最终mysqlclient. 我找不到“现成”的图层mysqlclient- 即使在很棒的KLayers 项目中也找不到。我很高兴分享一个 GitHub 存储库,其中包含一个“现成”层示例和一个简单的解决方案,可根据您的需求使用 AWS 推荐的过程构建您自己的自定义层。

mysqlclient(MySQLdb) 是 MySQL API 的高性能 C 实现的 Python 包装器。这使得它通常比纯 python 实现快得多,例如pymysql在大多数情况下(请参阅此列表以获取一些示例),但它也带来了一些问题,例如您所面临的问题。

由于它是针对mysql-devel包(例如MySQL 提供的.rpm或文件)进行编译的,因此链接到特定于平台的二进制文件以便工作。换句话说,Mac OS 笔记本电脑(作为示例)无法在使用某种形式的 AWS Lambda 环境(截至撰写本文时)中运行。您需要在 AWS Lambda 环境(或尽可能接近的环境)中进行编译,才能在您的 AWS Lambda 函数中工作。.debmysqlclientlibmysqlclient.solibmysqlclient.soAmazon Linux 2libmysqlclient.so

紧密模拟的 AWS-Lambda 环境以来自lamci 的 Docker 映像的形式提供。

因此,要打包 AWS-Lambda 兼容程序,mysqlclient您可以:

  • 拉一个合适的docker容器,例如lambci/lambda:build-python3.8
  • 导入MySQL 存储库 GPG 密钥
  • 安装MySQL repo setup RPM,以便yum可以找到并下载其他 MySQL repo 软件包
  • yum install必要的依赖项,例如适合mysql-devel您的用例的 rpm
  • pip install mysqlclient在容器中运行
  • zip 必要的libmysqlclient.so文件和 mysqlclient 的 python lib 目录

这或多或少是 AWS 官方推荐的过程:请参阅如何使用 Docker 的模拟 Lambda 环境创建 Lambda 层?

由此创建的 zip 可用于为mysqlclient. 您可以使用该层轻松使用,mysqlclient而不会在 Lambda 函数中出现任何错误。

经过一番绞尽脑汁,我终于得到了完整的程序,并将其自动化到这个 GitHub 项目build.sh中的单个脚本 ( ) 中。该代码构建一个文件,您可以直接上传该文件作为新的 AWS Lambda 层。该项目当前针对 Python3.8 和 MySQL 服务器 8.0.x 构建,但可以使用提供的说明和工具轻松适应不同的 Python 版本和目标 MySQL 版本。存储库中还有一个随时可用的文件 - 如果您想在 AWS Lambda 函数中针对 MySQL v8.0.x 和 Python 3.8(均经过测试)使用。我们的生产环境使用 SqlAlchemy,它使用 MySqlClient Lambda 层,它对我们来说非常有效。layer.ziplayer.zipmysqlclient

将 Lambda 函数配置为使用按描述构建的层(例如使用上述存储库中的工具)后,您可以像import MySQLdb往常一样在 Lambda 函数中继续编写真正的代码:

import MySQLdb

def lambda_handler(event, context):
    return {
        'statusCode': 200,
        'body': 'MySQLdb was successfully imported'
    }
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。


Pra*_*dan 6

只需上传两个包来更新 lambda 层: - sqlalchemy - PyMySQL(使用驱动程序代替 mysqlclient)

现在将您的驱动程序 URL 更新为“mysql+pymysql://...”。

这使您可以使用与现有环境的 Lambda 环境兼容的 pymysql 驱动程序。

不要忘记为 RDS 设置 VPC 终端节点。这可以控制性能和安全性。