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#

Terminal window
$ mkdir python
$ pip install pymysql -t ./python
$ zip -r9 python-pymysql.zip ./python
  • pip install -t ./python-t 指定安装目标目录为 python/
  • zip -r9:递归压缩,9 为最高压缩级别

3.2 Windows#

  1. 创建 python 文件夹
  2. 进入该文件夹安装依赖:pip install pymysql -t .
  3. 回到上层目录,将整个 python 文件夹打包成 zip

打包后的结构应与上面第 2 节一致。

4. 创建并导入层#

  1. 进入 Lambda 控制台
  2. 左侧菜单选择 其他资源 → 层(Layers)
  3. 点击 创建层,填写:
    • 名称:自拟,如 pymysql-layer
    • 上传:选择刚打包的 zip 文件
    • 兼容运行时:选择打包环境对应的 Python 版本
  4. 创建完成后,进入目标函数,在 配置区点击 添加层 → 自定义层,选择刚创建的层

完成后函数即可正常 import pymysql

5. 注意事项#

5.1 运行时版本要一致#

打包环境的 Python 版本必须与 Lambda 函数运行时一致(如都用 Python 3.12)。版本不匹配可能导致依赖里的编译产物无法加载——pymysql 是纯 Python 实现影响较小,但涉及 C 扩展的库(如 cryptographymysqlclient)务必严格对齐。

建议在与 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/
作者
Xeu
发布于
2025-09-15
许可协议
CC BY-NC-SA 4.0