如何将含已编译二进制文件的 Python 包添加到我的部署包,并使该包与 Lambda 兼容?

2 分钟阅读
0

我使用 pip 安装了一个包含已编译代码的 Python 包,现在我的 AWS Lambda 函数返回“无法导入模块”错误。

简短描述

默认情况下,包含已编译代码(例如 NumPy 和 pandas)的 Python 包并不总是与 Lambda 运行时系统兼容。如果您使用 pip 安装这些包,则这些包会下载并编译适用于本地机器架构的模块名称包。如果您未使用 Linux 操作系统(OS),这会使您的部署包与 Lambda Python 运行时系统不兼容。

要使您的部署包或层与非 Linux 操作系统上的 Lambda 兼容,请运行 pip install 命令,其中将 manylinux2014 用作 --platform 参数的值。

**注意:**macOS --platform 标签不起作用。例如,win_amd64macosx_10_6_intel 标签不安装与 Lambda 兼容的部署包。

解决方法

**注意:**以下示例过程显示了如何为在 x86_64 架构上运行的 Lambda Python 3.9 运行时系统安装 pandas。

  1. 打开命令提示符。然后,运行以下 pip 命令以确认您使用的 pip 版本为 19.3.0 或更高版本:

    pip --version

    如果您使用的 pip 版本比 pip 版本 19.3.0 旧,则升级到最新版本的 pip:

    python3.9 -m pip install --upgrade pip
  2. 将预编译的 Python 包的 .whl 文件作为依赖项安装在 Lambda 函数的项目目录中:

    **重要事项:**将 my-lambda-function 替换为您函数的项目目录的名称。

    pip install \    
        --platform manylinux2014_x86_64 \
        --target=my-lambda-function \
        --implementation cp \
        --python-version 3.9 \
        --only-binary=:all: --upgrade \
        pandas
  3. 打开您的 Lambda 函数的项目目录。如果您使用 macOS,则运行以下命令:

    cd my-lambda-function
  4. 在文本编辑器中,创建名为 lambda_function.py 的新文件。然后,将以下示例代码复制并粘贴到文件中:

    import numpy as np
    import pandas as pd
    def lambda_handler(event, context):
        df2 = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),columns=["a", "b", "c"])
        number = np.pi
        print(df2)
        print(number)

    将此文件保存在您的 Lambda 函数的项目目录中。

  5. 创建 Lambda 部署包 .zip 文件存档,其中包含所有已安装的库和源代码:

    zip -r ../my-deployment-package.zip .

    使用 my-deployment-package.zip 文件存档创建新的 Python 3.9 Lambda 函数或更新现有函数。有关说明,请参阅处理 Python Lambda 函数的 .zip 文件存档

    **注意:**您可以使用类似的过程来创建可用于多个函数的 Lambda 层。例如,以下命令创建了一个新的 Lambda 层,用于为在 arm64 架构上运行的 Lambda Python 3.9 运行时系统安装 pandas:

    pip install \
        --platform manylinux2014_aarch64 \
        --target=./python/lib/python3.9/site-packages \
        --implementation cp \
        --python-version 3.9 \
        --only-binary=:all: --upgrade \
        pandas

相关信息

创建和共享 Lambda 层

AWS 官方
AWS 官方已更新 10 个月前