我想解决在 AWS Lambda 函数中运行 Python 代码时出现的“无法导入模块”错误。
简短描述
当 Lambda 环境找不到您的 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 层,请继续执行步骤 5。
完成以下步骤:
-
在 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 角色附加到实例。
-
连接到您的实例或 AWS Cloud9 环境。
-
运行以下命令创建新文件夹,并使用 pip 安装名为“numpy”的库:
mkdir -p lambda-layer/pythoncd 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 jsonimport numpy
def lambda_handler(event, context):
print(numpy.__version__)
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
相关信息
如何在 Amazon EMR 和 Amazon EMR Serverless 集群中安装 Python 库并对其进行故障排除?