微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 AWS SAM 中集中重复使用的自定义 Python 函数?

如何解决如何在 AWS SAM 中集中重复使用的自定义 Python 函数?

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

我的项目目录:

/lambda_functions
/statemachine
samconfig.toml
template.yaml

图层 zip 看起来像这样

python/lib/python3.8/site-packages

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

解决方法

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

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

假设您要创建的层的文件夹结构是 mylib1 和 mylib2 是包含一些 python 代码的 2 个目录。此外,对于 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 层。

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

from mylib1 import my_response1

前提是 __init__.py 文件夹中的 mylib1 具有以下行

from .response import my_response1

Here 是一个存储库,显示了这一点。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。