【问题标题】:How do I centralize reused custom Python functions in AWS SAM?如何在 AWS SAM 中集中重用自定义 Python 函数?
【发布时间】:2021-07-20 08:28:53
【问题描述】:

我创建了一个带有 template.yaml 文件的 AWS Cloudformation 堆栈,该文件实现了多个 lambda 函数。有几个 Python 函数可供部分/全部 lambda 函数使用。有没有可以存放常用功能的地方?如果您认为答案涉及层,请说明如何包含和使用 custom 函数(因为 main workflow for layers 支持通常的 pip python 站点包 - 我很好奇重用我自己的函数)。

我的项目目录:

/lambda_functions
/statemachine
samconfig.toml
template.yaml

Layer zip 看起来像这样

python/lib/python3.8/site-packages

site-packages 中,我有我的其他模块——比如/requests——可以被lambda 函数访问(即import requests)。但是,如果我将自己的目录放在 /custom_functions__init__.py 文件中 - lambda 函数找不到它。

【问题讨论】:

  • Python 中没有自定义函数。 Lambda 层也与pip 无关。只是将您的代码放在python 根目录下的一个包中,将其压缩,然后部署为一个层。没问题。您甚至链接了参考。
  • 你怎么称呼我定义的def function_name(arguement1, arguement2):?这就是问题所在——我想重用我自己的函数。
  • 是的,这是一个函数。现在图层有什么问题?
  • 我如何import custom_function?使用图层,我可以将请求库添加到图层,然后执行import requests。但我似乎无法用我自己的custom_functions.py
  • 请求库是一个包。在 python 中,包是包含__init__.py 文件的文件夹。因此,请阅读包,创建自己的包,然后愉快地导入您的函数。

标签: python amazon-web-services amazon-cloudformation aws-cli


【解决方案1】:

您可以在内部将您的 python 库发布到 pypi repository 并将它们添加到 requirements.txt 的函数中。还要确保您的pypi repository 代理您在requirements.txt 中定义的任何其他外部库。如果您还没有内部pypi repository,这可能会有点复杂。

或者您可以使用 Lambda 层。让我们看一个使用 Python 层的简单示例。

假设您要创建的层的文件夹结构是 mylib1 和 mylib2 是 2 个包含一些 python 代码的目录。此外,对于 mylib1/mylib2 中的代码或在 requirements.txt 文件中定义的 Lambda 函数中的代码,您还有一些第三方依赖项。

my-layer-1
├── mylib1
│   ├── __init__.py
│   └── response.py
├── mylib2
│   ├── __init__.py
│   └── response.py
└── requirements.txt

您可以将以下内容添加到您的 SAM 模板中

 MyDependencyLayer1:
    Type: AWS::Serverless::LayerVersion
    Properties:
        LayerName: my-dependency-layer
        Description: Dependencies required for my Python lambdas
        ContentUri: my-layer-1/
        CompatibleRuntimes:
          - python3.8
        LicenseInfo: 'Apache License 2.0'
        RetentionPolicy: Retain
    Metadata: 
        BuildMethod: python3.8

添加更新您的函数以引用图层

HelloWorldFunction:
    Type: AWS::Serverless::Function 
    Properties:
      CodeUri: hello_world/
      Handler: app.lambda_handler
      Runtime: python3.8
      Layers:
        - !Ref MyDependencyLayer1

现在,当您执行sam build 时,它将同时构建函数和 Lambda 层。

现在您可以在mylib1 文件夹中导入response.py 中定义的函数my_response1,例如

from mylib1 import my_response1

假设mylib1文件夹中的__init__.py有以下行

from .response import my_response1

Here 是一个 repo,它显示了这一点。

以上示例将层和函数定义保留在同一个 SAM 模板中。您可以使用 SAM 模板将 Lambda 层代码保存在不同的存储库中,并仅在 CI/CD 管道中构建该层。为此,如果您有任何自定义要求(例如从内部工件中提取依赖项),您还可以使用makefile 来构建您的 Lambda 层。有关使用 makefile here 和根据不同运行时为层打包代码here 的更多信息。

【讨论】:

  • 这通常是一个非常好的、彻底的答案。它拥有任何人需要的所有组件:AWS 端和 Python 端。对我来说,我不知道from .response import my_response1。现在我可以导入自己重用的代码 - 我将能够大大减少总行数!
  • 很高兴,它有帮助!
猜你喜欢
  • 2020-10-23
  • 2020-07-05
  • 2022-10-06
  • 2020-06-30
  • 1970-01-01
  • 1970-01-01
  • 2020-09-08
  • 2021-04-11
  • 2018-05-27
相关资源
最近更新 更多