AWS SAM:跨 Lambda 函数共享文件
AWS SAM: Shared files across Lambda functions
我正在使用 AWS SAM(无服务器应用程序模型)在 API 网关设置中构建 Python 3.6 lambda 代码。
因此,我有一个创建多个 Lambda 函数的 template.yaml
文件。它们由项目中各自的子目录中的 lambda 函数组织而成。 lambda 还共享几个我保存在共享文件夹中的常用文件。
project-home
-lambda_a_dir
-lambda_a.py
-lambda_b_dir
-lambda_b.py
-shared_dir
-shared.py
问题是虽然 Pycharm 可以清楚地看到 shared.py
,但 SAM 不能并拒绝识别共享文件,并出现以下错误:Unable to import module 'lambdaA': No module named 'shared'
如果我移动副本shared.py
文件到每个 lambda 目录中,Pycharm 和 SAM 都很高兴,我可以 build/deploy 到 AWS。
我的问题:如何使用共享目录中的共享文件构建 SAM 模板?
到目前为止,我已经尝试过:
- 符号 link 和 MacOS 别名。
CodeUri
备选方案的各种组合
- 带有
__init__
和 setup.py
的本地包。 (我不能使用 public 包,因为代码是私有的,不能放在 public 存储库中。)
这是我的模板文件:
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Resources:
lambdaA:
Type: AWS::Serverless::Function
Properties:
CodeUri: ./lambda_a_dir/
Handler: lambda_a.lambda_handler
Runtime: python3.6
lambdaB:
Type: AWS::Serverless::Function
Properties:
CodeUri: ./lambda_b_dir/
Handler: lambda_b.lambda_handler
Runtime: python3.6
根据@Dunedan 的建议,我使用共享代码为每个 lambda 函数创建了一个 Layers 对象,这有效地将这些例程添加到这些函数的 PythonPath 中。我还使用新的 Layers
属性将以下内容添加到 API 模板定义中:
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Resources:
lambdaA:
Type: AWS::Serverless::Function
Properties:
CodeUri: ./lambda_a_dir/
Handler: lambda_a.lambda_handler
Runtime: python3.6
Layers:
- arn:aws:lambda:us-west-1:012345678:layer:my_shared_zip:1
lambdaB:
Type: AWS::Serverless::Function
Properties:
CodeUri: ./lambda_b_dir/
Handler: lambda_b.lambda_handler
Runtime: python3.6
Layers:
- arn:aws:lambda:us-west-1:012345678:layer:my_shared_zip:1
请注意,代码在上传之前需要压缩,并且需要具有以下目录结构,代码位于具有语言名称的目录中。在这种情况下,因为我使用的是 Python,代码需要在 python
目录中,然后 python
目录被压缩:
my_shared_zip.zip
-python
-shared.py
-other_shared.py
-more_shared.py
最后一个音符。虽然理想情况下,应该通过 sam deploy
命令将此共享 python 目录直接部署到层对象中,但我发现 AWS SAM CLI 中对 Layers
的支持仍然很新如此错误,以至于此时它无法正常工作。希望在接下来的几个月里它会得到修复。同时,我需要自己手动安装新版本的 shared-zip 文件。唉。
图层解决方案看起来像一个 hack。
我尝试创建指向 "shared" 文件夹的符号链接并且成功了 - 共享文件夹与我的 lambda 函数一起成功打包。
cd lambda_a_dir
ln -s ../shared
您尝试过使用 Rocketsam CLI 吗?它恰好解决了这个问题(使用在构建时自动创建的符号链接在 lambda 之间共享代码)。
它还允许拆分 YAML 文件,以便每个 lambda 可以有一个单独的 YAML 文件。
我正在使用 AWS SAM(无服务器应用程序模型)在 API 网关设置中构建 Python 3.6 lambda 代码。
因此,我有一个创建多个 Lambda 函数的 template.yaml
文件。它们由项目中各自的子目录中的 lambda 函数组织而成。 lambda 还共享几个我保存在共享文件夹中的常用文件。
project-home
-lambda_a_dir
-lambda_a.py
-lambda_b_dir
-lambda_b.py
-shared_dir
-shared.py
问题是虽然 Pycharm 可以清楚地看到 shared.py
,但 SAM 不能并拒绝识别共享文件,并出现以下错误:Unable to import module 'lambdaA': No module named 'shared'
如果我移动副本shared.py
文件到每个 lambda 目录中,Pycharm 和 SAM 都很高兴,我可以 build/deploy 到 AWS。
我的问题:如何使用共享目录中的共享文件构建 SAM 模板?
到目前为止,我已经尝试过:
- 符号 link 和 MacOS 别名。
CodeUri
备选方案的各种组合- 带有
__init__
和setup.py
的本地包。 (我不能使用 public 包,因为代码是私有的,不能放在 public 存储库中。)
这是我的模板文件:
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Resources:
lambdaA:
Type: AWS::Serverless::Function
Properties:
CodeUri: ./lambda_a_dir/
Handler: lambda_a.lambda_handler
Runtime: python3.6
lambdaB:
Type: AWS::Serverless::Function
Properties:
CodeUri: ./lambda_b_dir/
Handler: lambda_b.lambda_handler
Runtime: python3.6
根据@Dunedan 的建议,我使用共享代码为每个 lambda 函数创建了一个 Layers 对象,这有效地将这些例程添加到这些函数的 PythonPath 中。我还使用新的 Layers
属性将以下内容添加到 API 模板定义中:
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Resources:
lambdaA:
Type: AWS::Serverless::Function
Properties:
CodeUri: ./lambda_a_dir/
Handler: lambda_a.lambda_handler
Runtime: python3.6
Layers:
- arn:aws:lambda:us-west-1:012345678:layer:my_shared_zip:1
lambdaB:
Type: AWS::Serverless::Function
Properties:
CodeUri: ./lambda_b_dir/
Handler: lambda_b.lambda_handler
Runtime: python3.6
Layers:
- arn:aws:lambda:us-west-1:012345678:layer:my_shared_zip:1
请注意,代码在上传之前需要压缩,并且需要具有以下目录结构,代码位于具有语言名称的目录中。在这种情况下,因为我使用的是 Python,代码需要在 python
目录中,然后 python
目录被压缩:
my_shared_zip.zip
-python
-shared.py
-other_shared.py
-more_shared.py
最后一个音符。虽然理想情况下,应该通过 sam deploy
命令将此共享 python 目录直接部署到层对象中,但我发现 AWS SAM CLI 中对 Layers
的支持仍然很新如此错误,以至于此时它无法正常工作。希望在接下来的几个月里它会得到修复。同时,我需要自己手动安装新版本的 shared-zip 文件。唉。
图层解决方案看起来像一个 hack。 我尝试创建指向 "shared" 文件夹的符号链接并且成功了 - 共享文件夹与我的 lambda 函数一起成功打包。
cd lambda_a_dir
ln -s ../shared
您尝试过使用 Rocketsam CLI 吗?它恰好解决了这个问题(使用在构建时自动创建的符号链接在 lambda 之间共享代码)。 它还允许拆分 YAML 文件,以便每个 lambda 可以有一个单独的 YAML 文件。