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

简短描述

通常情况下收到此错误的原因是 Lambda 环境在 Python 代码中找不到指定的库。这是因为 Lambda 没有预先封装所有 Python 库。

要解决此错误,请创建一个部署程序包或 Lambda 层,其中包含要在 Lambda 的 Python 代码中使用的库。

重要提示:确保把为 Python 导入的库放在 /python 文件夹中。

解决方法

注意:以下步骤展示的是如何创建 Lambda 层,并非部署程序包。这是因为您可以跨多个 Lambda 函数重复使用 Lambda 层。每个 Lambda 运行时将特定的 /opt 目录文件夹添加到 PATH 变量中。如果该层使用相同的文件夹结构,则 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.    在 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 函数添加层

Share