【问题标题】:Unable to import module 'lambda_function': No module named 'flatten_json'无法导入模块“lambda_function”:没有名为“flatten_json”的模块
【发布时间】:2021-08-06 00:51:51
【问题描述】:

运行 lambda 代码时出现以下错误,我正在使用名为

的库
from flatten_json import flatten

我试图寻找一个 lambda 层,但没有在网上找到任何东西,请告诉我是否有人以前使用过这个或建议任何替代方法

【问题讨论】:

    标签: python aws-lambda aws-lambda-layers


    【解决方案1】:

    flatten_json 库丢失。

    使用pip install flatten_json获取

    【讨论】:

    • 但这对 AWS Lambda 没有帮助。您需要将其与 Lambda 打包或作为层打包。
    【解决方案2】:

    您需要执行四个步骤:

    1. 下载依赖项。
    2. 将其打包成 ZIP 文件。
    3. Create a new layer in AWS
    4. Associate the layer with your Lambda.

    我的回答将集中在 1. 和 2. 上,因为它们对您的问题最重要。不幸的是,打包 Python 依赖项可能比其他运行时复杂一些。

    主要问题是某些依赖项在后台使用 C 代码,尤其是性能关键库,例如机器学习等。

    C 代码需要编译,如果您在您的机器上运行pip install,代码将为您的计算机编译。 AWS Lambdas 使用linux 内核和amd64 架构。因此,如果您在具有 AMD 或 Intel 处理器的 Linux 机器上运行pip install,您确实可以只使用pip install。但如果你使用 macOS 或 Windows,你最好的选择是 Docker。

    没有 Docker

    pip install --target python flatten_json
    zip -r layer.zip python
    

    使用 Docker

    lambci project 为构建和运行 Lambda 提供了出色的 Docker 容器。在以下示例中,我使用了他们的 build-python3.8 图像。

    docker run --rm -v $(pwd):/var/task lambci/lambda:build-python3.8 pip install --target python flatten_json
    zip -r layer.zip python
    

    请注意,$(pwd) 是您当前的目录。在 macOS 和 WSL 上这应该可以工作,但如果它不起作用,您可以将其替换为当前目录的绝对路径。

    说明

    这些命令会将依赖项安装到名为pythontarget 文件夹中。名字很重要,因为它是one of two folders of a layer where Lambda looks for dependencies

    python 文件夹会递归地 (-r) 归档在名为 layer.zip 的文件中。

    您的下一步是在 AWS 中创建一个新层并将您的函数与该层相关联。

    【讨论】:

    • 我真的不知道如何使用 docker ,我有 windows 机器,所以我需要安装 WSL 并使用上述命令?如果您提供一个链接,其中有人已经为大熊猫创建了 Layer.zip 的链接,那就太好了github.com/awslabs/aws-data-wrangler/releases
    【解决方案3】:

    有两个选项可供选择

    选项 1) 您可以使用部署包将函数代码部署到 Lambda。

    • 部署包(例如 zip)将包含您的函数代码以及用于运行函数代码的任何依赖项。
    • 因此,您可以将 flatten_json 作为代码打包到 Lambda。
    • 查看 aws 文档中的 Creating a function with runtime dependencies 页面,它解释了拥有请求库的用例。在您的场景中,图书馆将是 flatten_json

    选项 2) 创建一个具有所需库依赖项的层,在您的情况下为 flatten_json。然后将该层附加到您的 Lambda。

    如何在 1) 和 2) 之间做出选择?

    • 当您只需要一个 Lambda 中的依赖项时,请使用 选项 1)。无需创建图层的额外步骤。
    • 如果您有一些想要在不同 Lambda 之间共享的通用代码,层会非常有用。因此,如果您还需要可在其他 Lambda 中访问的库,那么最好有一个可以附加到不同 lambda 的层[选项 2)]。

    【讨论】:

      猜你喜欢
      • 2019-11-21
      • 2020-04-29
      • 2021-08-16
      • 2019-05-12
      • 2021-02-22
      • 2021-09-02
      • 2019-08-20
      • 2020-01-01
      • 1970-01-01
      相关资源
      最近更新 更多