如何解决我在 Python 中运行 Lambda 代码时遇到的“Unable to import module”错误?

2 分钟阅读
0

当我尝试在 Python 中运行 AWS Lambda 代码时,我遇到了“Unable to import module”错误。

简短描述

当 AWS Lambda 环境找不到您的 Lambda 部署包中的指定库时,您会遇到“Unable to import module”错误。

要解决此错误,请创建包含所有必需库的部署包。或者,使用所需的库创建一个 Lambda 层并将其附加到您的 Lambda 函数。Lambda 层方法允许您在多个 Lambda 函数中重复使用该层。

解决方法

创建一个 Lambda 层以附加到多个 Lambda 函数

**注意:**创建 Lambda 层时,将库放在 /pythonpython/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。

  1. 使用 Amazon EC2 控制台使用 Amazon Linux 2023 AMI 创建一个实例。或者,使用 AWS Cloud9 控制台

  2. 创建 AWS Identity and Access Management(IAM)策略,授予调用 PublishLayerVersion API 操作的权限。
    IAM 策略语句示例:

    {
     "Version": "2012-10-17",
     "Statement": [
     {
     "Sid": "VisualEditor0",
     "Effect": "Allow",
     "Action": "lambda:PublishLayerVersion",
     "Resource": "*"
     }
     ]
    }
  3. 创建一个 IAM 角色,然后将 IAM 策略附加到该角色。

  4. 将 IAM 角色附加到实例。

  5. 连接到您的实例Cloud9 环境

  6. 运行以下命令创建新文件夹,并使用 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 版本。

  7. 执行以下命令将 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 区域。

  8. 将该层添加到您的 Lambda 函数中。

  9. 要测试您的 Lambda 函数,请导入部署包并打印版本信息。
    成功输出的示例:

    import json
    import numpy
    
    
    def lambda_handler(event, context):
     print(numpy.__version__)
     return {
     'statusCode': 200,
     'body': json.dumps('Hello from Lambda!')
     }	
AWS 官方
AWS 官方已更新 3 个月前