如何解决 "Runtime.ImportModuleError" No module named 'mysql' in AWS lambda?

How to solve "Runtime.ImportModuleError" No module named 'mysql' in AWS lambda?

我正在 Lambda 中测试 Python 脚本,它给了我一个错误:

{
  "errorMessage": "Unable to import module 'pythonfilename': No module named 'mysql'",
  "errorType": "Runtime.ImportModuleError"
}

我该如何解决这个问题?当我在本地测试脚本时我得到了同样的错误,但是当我升级 pip 到 20.2.2 然后 pip install mysql-connector 这个错误已经在本地解决了,我如何在 Lambda env 中解决这个问题?谢谢。

如果您要将函数部署到 AWS lambda,则需要捆绑您的依赖项: https://docs.aws.amazon.com/lambda/latest/dg/python-package.html#python-package-dependencies

您可以使用您的包创建 Lambda custom layer

为了检查这个解决方案,我创建了这样一个图层,可以确认它有效

使用的技术包括 docker 工具 在最近的 AWS 博客:

中描述

所以对于这个问题,我验证如下:

  1. 创建空文件夹,例如mylayer.

  2. 转到文件夹并创建 requirements.txt 文件,内容为

boto3==1.14.49
mock==4.0.2
moto==1.3.14
mysql-connector-python==8.0.21
  1. 运行 以下 docker 命令:
docker run -v "$PWD":/var/task "lambci/lambda:build-python3.8" /bin/sh -c "pip install -r requirements.txt -t python/lib/python3.8/site-packages/; exit"
  1. 将图层创建为 zip:
zip -r -9 mylayer.zip python 
  1. 在 AWS 控制台中基于 mylayer.zip 创建 lambda 层。 不要忘记将 Compatible runtimes 指定为 python3.8。该层将 总的来说,大约 48 MB。因此,最好检查一下您是否 真的需要所有这些包。

  2. 使用以下 lambda 函数在 lambda 中测试层:

import mysql

def lambda_handler(event, context):
    
    print(dir(mysql))

函数正确执行:

['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__']