如何在 AWS SAM 中集中重用的自定义 Python 函数?
How do I centralize reused custom Python functions in AWS SAM?
我创建了一个 AWS Cloudformation 堆栈,其中包含一个 template.yaml
文件,该文件实现了多个 lambda 函数。 some/all 的 lambda 函数使用了几个 Python 函数。有地方可以存放常用函数吗?如果您认为答案涉及图层,请解决如何包含和使用 custom 函数(因为 main workflow for layers 支持通常的 pip python 站点包 - 我对重用我自己的函数感到好奇)。
我的项目目录:
/lambda_functions
/statemachine
samconfig.toml
template.yaml
层 zip 看起来像这样
python/lib/python3.8/站点包
在 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 层。
现在您可以在 mylib1
文件夹中导入 response.py
中定义的函数 my_response1
,例如
from mylib1 import my_response1
假设 mylib1
文件夹中的 __init__.py
包含以下行
from .response import my_response1
Here 是一个展示此操作的回购协议。
以上示例将图层和功能定义保留在同一个 SAM 模板中。您可以使用 SAM 模板将 Lambda 层代码保存在不同的存储库中,并仅在 CI/CD 管道中构建该层。为此,如果您有任何自定义要求(例如从内部工件中提取依赖项),您还可以使用 makefile
来构建 Lambda 层。有关使用 makefile here and packaging your code for a layer based on different runtimes here.
的更多信息
我创建了一个 AWS Cloudformation 堆栈,其中包含一个 template.yaml
文件,该文件实现了多个 lambda 函数。 some/all 的 lambda 函数使用了几个 Python 函数。有地方可以存放常用函数吗?如果您认为答案涉及图层,请解决如何包含和使用 custom 函数(因为 main workflow for layers 支持通常的 pip python 站点包 - 我对重用我自己的函数感到好奇)。
我的项目目录:
/lambda_functions
/statemachine
samconfig.toml
template.yaml
层 zip 看起来像这样
python/lib/python3.8/站点包
在 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 层。
现在您可以在 mylib1
文件夹中导入 response.py
中定义的函数 my_response1
,例如
from mylib1 import my_response1
假设 mylib1
文件夹中的 __init__.py
包含以下行
from .response import my_response1
Here 是一个展示此操作的回购协议。
以上示例将图层和功能定义保留在同一个 SAM 模板中。您可以使用 SAM 模板将 Lambda 层代码保存在不同的存储库中,并仅在 CI/CD 管道中构建该层。为此,如果您有任何自定义要求(例如从内部工件中提取依赖项),您还可以使用 makefile
来构建 Lambda 层。有关使用 makefile here and packaging your code for a layer based on different runtimes here.