810 字
4 分钟
AWS Lambda PyMySQL连接
1. 背景
AWS Lambda 的 Python 运行时只内置标准库,不包含 pymysql 这类第三方包。函数中如果直接 import pymysql 连接数据库,运行时会报错:
[ERROR] Runtime.ImportModuleError: Unable to import module 'lambda_function':No module named 'pymysql'解决思路有两种:把依赖和代码一起打包上传,或者把依赖单独做成一个 Lambda 层(Layer)。本文采用层的方式——好处是多个函数可以共享同一个层,函数代码包保持精简,更新依赖也不用重新上传业务代码。
2. 层的目录结构要求
Lambda 层对目录结构有强制要求。Python 依赖必须放在压缩包内名为 python/ 的目录下,Lambda 运行时才能正确加载:
python-pymysql.zip└── python/ ├── pymysql/ └── pymysql-1.1.2.dist-info/关键点:压缩包根目录下必须是
python文件夹,依赖装在它里面。结构不对的话,层能创建成功,但函数仍会报找不到模块。
3. 打包依赖
3.1 Linux / macOS
$ mkdir python$ pip install pymysql -t ./python$ zip -r9 python-pymysql.zip ./pythonpip install -t ./python:-t指定安装目标目录为python/zip -r9:递归压缩,9为最高压缩级别
3.2 Windows
- 创建
python文件夹 - 进入该文件夹安装依赖:
pip install pymysql -t . - 回到上层目录,将整个
python文件夹打包成 zip
打包后的结构应与上面第 2 节一致。
4. 创建并导入层
- 进入 Lambda 控制台
- 左侧菜单选择 其他资源 → 层(Layers)
- 点击 创建层,填写:
- 名称:自拟,如
pymysql-layer - 上传:选择刚打包的 zip 文件
- 兼容运行时:选择打包环境对应的 Python 版本
- 名称:自拟,如
- 创建完成后,进入目标函数,在 层 配置区点击 添加层 → 自定义层,选择刚创建的层
完成后函数即可正常 import pymysql。
5. 注意事项
5.1 运行时版本要一致
打包环境的 Python 版本必须与 Lambda 函数运行时一致(如都用 Python 3.12)。版本不匹配可能导致依赖里的编译产物无法加载——pymysql 是纯 Python 实现影响较小,但涉及 C 扩展的库(如 cryptography、mysqlclient)务必严格对齐。
建议在与 Lambda 运行时相同的环境中打包,最稳妥的方式是用对应版本的 Amazon Linux 容器镜像安装依赖。
5.2 函数需要访问数据库的网络配置
如果 MySQL 在 VPC 内(如 RDS),Lambda 函数必须配置到同一 VPC,并放行安全组对应端口(默认 3306),否则会连接超时。
5.3 层有大小与数量限制
- 单个函数最多附加 5 个层
- 所有层 + 函数代码解压后总大小不超过 250 MB
6. 函数中使用示例
import pymysql
def lambda_handler(event, context): conn = pymysql.connect( host="your-db-host", user="your-user", password="your-password", database="your-db", connect_timeout=5, ) try: with conn.cursor() as cursor: cursor.execute("SELECT 1") result = cursor.fetchone() return {"statusCode": 200, "body": str(result)} finally: conn.close()数据库连接信息建议放到环境变量或 Secrets Manager 中,不要硬编码在代码里。
7. 小结
- Lambda 不含第三方包,
pymysql等依赖需通过层提供。 - 层的 zip 包内必须是
python/目录结构,否则加载失败。 - 打包环境与函数运行时版本保持一致。
- 连接 VPC 内数据库时,记得配置函数 VPC 与安全组。
AWS Lambda PyMySQL连接
https://blog.xeu.asia/posts/aws-lambda-pymysql/