【问题标题】:How to use AWS Lambda layer using Python?如何使用 Python 使用 AWS Lambda 层?
【发布时间】:2020-06-08 16:33:40
【问题描述】:

我有一个使用 numpy 库的简单 Lambda 函数,
我在本地搭建了一个虚拟环境,我的代码可以在本地获取和使用库。

我尝试使用 AWS Lambda 的层,并将 venv 文件夹压缩并上传到层,
然后我将正确的层和版本​​附加到我的函数中,
但该函数无法获取库

以下是在本地运行良好的代码 -

import numpy as np

def main(event, context):
    a = np.array([1, 2, 3])

    print("Your numpy array:")
    print(a)

下面是我压缩上传的venv结构-

我收到以下错误 -

{
  "errorMessage": "Unable to import module 'handler': No module named 'numpy'",
  "errorType": "Runtime.ImportModuleError"
}

我的 Lambda 部署如下所示 -

我想参考这个 -
https://towardsdatascience.com/introduction-to-amazon-lambda-layers-and-boto3-using-python3-39bd390add17

【问题讨论】:

  • requirements.txt 中包含 numpy 吗?
  • @Paolo 是 numpy==1.18.5
  • 这能回答你的问题吗? AWS Lambda, Python, Numpy and others as Layers
  • @Paradigm 不,我正在尝试遵循这一点-towardsdatascience.com/… 我也尝试过像 python/lib/python3.7/site-packages/ 这样的结构,但仍然没有工作,在哪里做你觉得问题出在哪里?
  • 我并不是说它在这种情况下是相关的,但对于未来的读者......作为一般规则,如果你不严格需要 numpy 或其他像 Pandas 这样的大型 Python 包,那么我会避免尝试在 Lambda 中使用它们。

标签: python amazon-web-services aws-lambda


【解决方案1】:

我发现使用pip 安装时,一些库(如 numpy 和 pandas)在 Lambda 中不起作用。我已经成功使用这些库的 .whl 包文件来创建 Lambda 层。参考以下步骤:

注意:这些步骤设置特定于 Python 3.7 运行时的库。如果使用任何其他版本,则需要下载与该 Python 版本对应的.whl 文件。

  1. 使用 Amazon Linux AMI 和 SSH 将 EC2 实例创建到此实例中。我们应该在 Amazon Linux AMI 中创建我们的层,因为 Lambda Python 3.7 运行时在此操作系统(doc) 上运行。

  2. 确保此实例已安装 Python3 和“pip”工具。

  3. 通过执行以下命令下载numpy .whl 文件以用于cp37 Python 版本和manylinux1_x86_64 OS:

$ wget https://files.pythonhosted.org/packages/d6/c6/58e517e8b1fb192725cfa23c01c2e60e4e6699314ee9684a1c5f5c9b27e1/numpy-1.18.5-cp37-cp37m-manylinux1_x86_64.whl
  1. 如果您不使用 pandas,请跳至下一步。通过执行以下命令,下载cp37 Python 版本和manylinux1_x86_64 OS 的pandas .whl 文件:
$ wget https://files.pythonhosted.org/packages/a4/5f/1b6e0efab4bfb738478919d40b0e3e1a06e3d9996da45eb62a77e9a090d9/pandas-1.0.4-cp37-cp37m-manylinux1_x86_64.whl
  1. 接下来,我们将创建一个名为“python”的目录并将这些文件解压缩到该目录中:
        $ mkdir python
        $ unzip pandas-1.0.4-cp37-cp37m-manylinux1_x86_64.whl -d python/
        $ unzip numpy-1.18.5-cp37-cp37m-manylinux1_x86_64.whl -d python/
  1. 我们还需要下载“pytz”库才能成功导入numpy和pandas库:
        $ pip3 install -t python/ pytz
  1. 接下来,我们将从包目录中删除“*.dist-info”文件以减小生成层的大小。
        $ cd python
        $ sudo rm -rf *.dist-info
  1. 这将安装我们运行 pandas 和 numpy 所需的所有库。

  2. 压缩当前的“python”目录并将其上传到您的 S3 存储桶。确保这些库存在于给定 here 的层次结构中。

        $ cd ..
        $ zip -r lambda-layer.zip python/
        $ aws s3 cp lambda-layer.zip s3://YOURBUCKETNAME
  1. 然后可以使用“lambda-layer.zip”文件从 Lambda 控制台创建新层。

【讨论】:

    【解决方案2】:

    基于 aws lamda 层文档,https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html 您的层的 zip 包必须具有此结构。

    my_layer.zip
      | python/numpy
      | python/numpy-***.dist-info
    

    所以你要做的是创建一个 python 文件夹,并将站点包的内容放入其中,然后压缩该 python 文件夹。我用一个简单的包尝试了这个,它似乎工作正常。

    另外请记住,某些包需要 c/c++ 编译,并且要使其工作,您必须在与 lambda 具有相似架构的机器上安装和打包。通常,您需要在 EC2 上执行此操作,并在其中安装和打包与 lambda 具有相似架构的地方。

    【讨论】:

      【解决方案3】:

      这有点误导性问题,因为您至少没有提到您使用serverless。我通过您提供的项目结构的快照发现它。这意味着您可能会使用 serverless 在 AWS 提供商中部署您的项目。

      其实lambda layer有多种排列方式。让我们来看看它们中的每一个。

      Native AWS

      导航到Add a layer 后,您会发现 3 个选项: [AWS Layers, Custom Layers, Specify an ARN;].

      Specify an ARN 伙计们,为你工作的人:KLayers

      所以,你需要numpy,好吧。在 lambda 函数中导航到层 --> 创建一个新层 --> 在 3 个选项中,选择 Specify an ARN 并作为值:arn:aws:lambda:eu-west-1:770693421928:layer:Klayers-python38-numpy:12。 它将解决您的问题,您将能够使用 numpy 命名空间。

      Custom Layers

      从您的 AWS 账户或组织创建的层列表中选择一个层。

      对于自定义层,实施方式可能会根据您在部署方面的要求而有所不同。 如果允许手动完成事情,您应该可以看到关注Medium article。我想它会对你有所帮助!

      AWS Layers

      对于 AWS 预构建层,一切都很简单。

      AWS 提供的与您的函数运行时兼容的层。 可以区分runtimes

      对我来说,我有以下列表:Perl5, SciPy, AppConfig Extension

      Serverless

      serverless 中,事情要容易得多,因为您可以直接在serverless.yml 文件中使用 lambda 定义来定义您的层。之后,如何定义它们也会有所不同。

      可以在以下位置找到示例:How to publish and use AWS Lambda Layers with the Serverless Framework

      如果您有任何问题,请随时展开讨论。 干杯!

      【讨论】:

        猜你喜欢
        • 2022-01-17
        • 2021-11-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-23
        • 2021-09-19
        • 2020-12-31
        • 1970-01-01
        • 2020-09-07
        相关资源
        最近更新 更多