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

时间:2021-05-16 15:01:07

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

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

的库
//Buttons
const videoElement = document.querySelector('Video');
const startBtn = document.getElementById('startBtn');
const stopBtn = document.getElementById('stopBtn');
const videoSelectBtn = document.getElementById('videoSelectBtn');
videoSelectBtn.onclick = getVideoSources;


const {
  desktopCapturer
} = require("electron");
const {
  remote
} = require('@electron/remote')
const {
  Menu
} = remote


//Getting all available Video Sources
async function getVideoSources() {
  const inputSources = await desktopCapturer.getSources({
    types: ['window', 'screen']
  });

  const videoOptionsMenu = Menu.buildFromTemplate(
    inputSources.map(source => {
      return {
        label: source.name,
        click: () => selectSource(source)
      };
    })
  );

  videoOptionsMenu.popup();
}

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

3 个答案:

答案 0 :(得分:0)

flatten_json 库丢失。

使用pip install flatten_json获取它

答案 1 :(得分:0)

您需要执行四个步骤:

  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 中创建一个新层并将您的函数与该层相关联。

答案 2 :(得分:0)

有两种选择

选项 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)]。