繁体   English   中英

无法导入模块“lambda_function”:没有名为“flatten_json”的模块

[英]Unable to import module 'lambda_function': No module named 'flatten_json'

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

from flatten_json import flatten

我试图寻找一个 lambda 层,但没有在网上找到任何层,请让我知道是否有人以前使用过它或建议任何替代方案

缺少 flatten_json 库。

使用pip install flatten_json获取

您需要执行以下四个步骤:

  1. 下载依赖。
  2. Package 在 ZIP 文件中。
  3. 在 AWS 中创建一个新层
  4. 将图层与您的 Lambda 关联

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

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

C 代码需要编译,如果您在您的机器上运行pip install ,代码将为您的计算机编译。 AWS Lambda 使用linux kernel 和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 项目为构建和运行 Lambdas 提供了出色的 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 上,这应该可以工作,但如果它不起作用,您可以将其替换为当前目录的绝对路径。

解释

这些命令会将依赖项安装到名为python目标文件夹中。 名称很重要,因为它是Lambda 查找依赖项的层的两个文件夹之一

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

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

有两个选项可供选择

选项 1)您可以使用部署 package 将 function 代码部署到 Lambda。

  • 部署 package(例如 zip)将包含您的函数代码和用于运行函数代码的任何依赖项。
  • 因此,您可以将 package flatten_json作为 Lambda 的代码。
  • 检查在 aws 文档中创建具有运行时依赖项页面的 function ,它解释了具有请求库的用例。 在您的场景中,该库将是flatten_json

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

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

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

如果您不想创建图层,可以在 Lambda 中执行此操作。 请记住,它会运行得更慢,因为它必须在每次运行时安装库:

import sys
import subprocess
subprocess.call('pip install flatten_json -t /tmp/ --no-cache-dir'.split(), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
sys.path.insert(1, '/tmp/')
import flatten_json

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM