当我尝试在 Python 中运行 AWS Lambda 代码时,我遇到了“Unable to import module”错误。
简短描述
当 AWS Lambda 环境找不到您的 Lambda 部署包中的指定库时,您会遇到“Unable to import module”错误。
要解决此错误,请创建包含所有必需库的部署包。或者,使用所需的库创建一个 Lambda 层并将其附加到您的 Lambda 函数。Lambda 层方法允许您在多个 Lambda 函数中重复使用该层。
解决方法
创建一个 Lambda 层以附加到多个 Lambda 函数
**注意:**创建 Lambda 层时,将库放在 /python 或 python/lib/python3.x/site-packages 文件夹中。最佳实践是在 Lambda 运行时系统所基于的操作系统(OS)上创建 Lambda 层。例如,Python 3.12 基于 Amazon Linux 2023 亚马逊机器映像(AMI)。因此,在 Amazon Linux 2023 OS 上创建该层。
如果您的 Amazon Elastic Compute Cloud(Amazon EC2)实例无权通过 PublishLayerVersion API 调用上传 Lambda 层,请按照步骤 1-3 进行操作。如果您的实例已经拥有上传权限,则继续执行步骤 4。
-
使用 Amazon EC2 控制台使用 Amazon Linux 2023 AMI 创建一个实例。或者,使用 AWS Cloud9 控制台。
-
创建 AWS Identity and Access Management(IAM)策略,授予调用 PublishLayerVersion API 操作的权限。
IAM 策略语句示例:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "lambda:PublishLayerVersion",
"Resource": "*"
}
]
}
-
创建一个 IAM 角色,然后将 IAM 策略附加到该角色。
-
将 IAM 角色附加到实例。
-
连接到您的实例或 Cloud9 环境。
-
运行以下命令创建新文件夹,并使用 pip 安装名为“numpy”的库:
mkdir -p lambda-layer/python
cd lambda-layer/python
pip3 install --platform manylinux2014_x86_64 --target . --python-version 3.12 --only-binary=:all: numpy
**注意:**更新您的函数类型的 platform 参数。对于 x86_64 Lambda 函数,将该值设置为 manylinux2014_x86_64。对于 arm64 函数,将该值设置为 manylinux2014_aarch64。将 python-version 参数更新为您的 Lambda 函数使用的 Python 版本。
-
执行以下命令将 python 文件夹中的内容放入 layer.zip 文件中:
cd ..
zip -r layer.zip python
执行以下命令发布 Lambda 层:
aws lambda publish-layer-version --layer-name numpy-layer --zip-file fileb://layer.zip --compatible-runtimes python3.12 --region us-east-1
**注意:**将 us-east-1 替换为您的 Lambda 函数的 AWS 区域。
-
将该层添加到您的 Lambda 函数中。
-
要测试您的 Lambda 函数,请导入部署包并打印版本信息。
成功输出的示例:
import json
import numpy
def lambda_handler(event, context):
print(numpy.__version__)
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}