当我尝试在 Python 中运行 AWS Lambda 代码时,收到了一个“Unable to import module”(无法导入模块)错误。
简短描述
通常情况下收到此错误的原因是 Lambda 环境在 Python 代码中找不到指定的库。这是因为 Lambda 没有预先封装所有 Python 库。
要解决此错误,请创建一个部署包或 Lambda 层,其中包含要在 Lambda 的 Python 代码中使用的库。
**重要提示:**确保把为 Python 导入的库放在 /python 文件夹中。
解决方法
**注意:**以下步骤展示的是如何创建 Lambda 层,并非部署程序包。这是因为您可以跨多个 Lambda 函数重复使用 Lambda 层。每个 Lambda 运行时都会在 PATH 变量引用的 /opt 目录中添加特定的文件夹。如果该层使用相同的文件夹结构,则 Lambda 函数的代码可以在不指定路径的情况下访问该层内容。
最佳实践是在建立 Lambda 运行时的同一操作系统上创建 Lambda 层。例如,Python 3.8 基于 Amazon Linux 2 Amazon Machine Image (AMI)。但是,Python 3.7 和 Python 3.6 以 Amazon Linux AMI 为基础。
要为 Python 3.8 库创建 Lambda 层,请执行以下操作:
**注意:**步骤 1-3 是可选的。
1. 在 AWS Cloud9 控制台中,使用 Amazon Linux 2 AMI 创建一个 Amazon Elastic Compute Cloud (Amazon EC2) 实例。有关说明,请参阅《AWS Cloud9 用户指南》中的创建 EC2 环境。
2. 创建一个 AWS Identity and Access Management (IAM) 策略,其将赋予调用 PublishLayerVersion API 操作的权限。
示例,IAM 策略语句将赋予调用 PublishLayerVersion API 操作的权限
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "lambda:PublishLayerVersion",
"Resource": "*"
}
]
}
3. 创建一个 IAM 角色并将 IAM 策略附上到该角色。然后,将 IAM 角色附上到 Amazon EC2 实例。
**注意:**您的 EC2 实例现在拥有权限,可为 PublishLayerVersion API 调用上载 Lambda 层。
4. 打开您的 AWS Cloud9 Amazon EC2 环境。然后,通过运行以下命令安装 Python 3.8 和 pip3:
$ sudo amazon-linux-extras install python3.8
$ curl -O https://bootstrap.pypa.io/get-pip.py
$ python3.8 get-pip.py --user
5. 通过运行以下命令,创建一个 python 文件夹:
$ mkdir python
6. 通过运行以下命令,将 Pandas 库文件安装到 python 文件夹中:
**重要提示:**将 Pandas 替换为您要导入的 Python 库的名称。
$ python3.8 -m pip install pandas -t python/
7. 通过运行以下命令,将 python 文件夹的内容压缩到 layer.zip 文件中:
$ zip -r layer.zip python
8. 通过运行以下命令发布 Lambda 层:
**重要提示:**将 us-east-1 替换为您的 Lambda 函数所在的 AWS 区域。
$ aws lambda publish-layer-version --layer-name pandas-layer --zip-file fileb://layer.zip --compatible-runtimes python3.8 --region us-east-1
9. 向您的 Lambda 函数添加层。
相关信息
我在上传 Lambda 部署程序包时遇到“permission denied”或“unable to import module”错误,如何进行问题排查?