【问题标题】:Multiple AWS Lambda functions using the same libraries使用相同库的多个 AWS Lambda 函数
【发布时间】:2018-12-12 18:24:08
【问题描述】:

我正在为我的 android 应用后端编写 AWS Lambda 函数。我在 AWS 上的 python 中有多个 Lambda 函数,它们需要相同的库。例如,我需要访问数据库,所以我在所有 lambda 函数中都使用了 pymysql 库。但我不确定我是否做得对。

我是否必须将这些库包含在我部署的每个函数包中,或者是否有更好的方法可以引用我在前一个函数中使用的库?

我关注Tutorial: Accessing Amazon RDS in an Amazon VPC。我有 2 个功能。我将每个函数及其依赖项分别上传到一个 zip 文件中。 Zip 包含代码和库。库占用了大部分空间,使 zip 尺寸变大。现在第二个函数也需要相同的库,所以再次使用相同的库制作 zip 感觉不对。

文档中提到的一些链接也很有帮助。我在文档中的任何地方都没有找到它。

【问题讨论】:

  • 您必须将库包含在您部署的每个 Lambda 函数中。没有在函数之间共享它们的机制。
  • @MarkB 不会让我的函数变得笨重吗?我的库大约需要 5mb,我有大约 20 个函数使用同一个库
  • 或者有什么方法可以将多个功能组合在一个 zip 中并上传
  • 它不会“简单地让你的函数变得庞大”。这也使他们独立。每个函数都必须在与其他函数完全分离的容器中运行,因此每个函数都必须包含所有依赖项。

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


【解决方案1】:

您可以使用AWS Lambda Layers 分享您的代码。例如使用AWS::Lambda::LayerVersionAWS::Serverless::LayerVersion 定义它们。然后,您可以在 Python Lambda 函数中引用它们。 这里使用AWS SAM

  MyLambdaFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: function_code/
      Handler: app.lambda_handler
      Runtime: python3.6
      Layers:
        - !Ref MySharedLayer
  MySharedLayer:
    Type: AWS::Serverless::LayerVersion
    Properties:
      LayerName: SharedLayerName
      Description: Some shared code
      ContentUri: layer_code/
      CompatibleRuntimes:
        - python3.6
      RetentionPolicy: Retain

每个 Lambda 函数都将在 /opt 中提供共享代码。然后可以在函数中使用它。

【讨论】:

    【解决方案2】:

    现在Lambda Layers 已发布,您可以轻松地在您的 Lambda 函数之间共享库和代码。

    您可以为图层创建 zip 文件,其方式与为函数创建 zip 文件的方式几乎相同。
    要共享pymysql 包,您需要基于以下函数创建一个 Lambda 层:

    pymysql-bundle.zip/
      python/lib/python3.7/site-packages/pymysql
    

    然后,您可以从您的 Lambda 函数的代码中像这样引用它:

    from pymysql import ...
    

    【讨论】:

      猜你喜欢
      • 2021-05-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-29
      • 2021-10-25
      • 1970-01-01
      • 2021-12-20
      • 2018-06-18
      • 2021-08-31
      相关资源
      最近更新 更多