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机箱开始工作.
对于像Lambda这样的用例,使用像PyMySQL这样的纯python实现会更快乐.
它是遵循Python数据库API规范的MySQLdb的替代品.对于大多数事情,比如触发的Lambda事件,它会同样快.
我在生产中经常使用它并且效果很好.
mysqlclientTLDR:是的,您可以在 AWS Lambda Python 函数中使用。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您可以:
lambci/lambda:build-python3.8yum可以找到并下载其他 MySQL repo 软件包yum install必要的依赖项,例如适合mysql-devel您的用例的 rpmpip install mysqlclient在容器中运行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)
希望这可以帮助。
只需上传两个包来更新 lambda 层: - sqlalchemy - PyMySQL(使用驱动程序代替 mysqlclient)
现在将您的驱动程序 URL 更新为“mysql+pymysql://...”。
这使您可以使用与现有环境的 Lambda 环境兼容的 pymysql 驱动程序。
不要忘记为 RDS 设置 VPC 终端节点。这可以控制性能和安全性。
| 归档时间: |
|
| 查看次数: |
12376 次 |
| 最近记录: |