如何在本地使用 SAM 以及在部署时重用 AWS 上的图层?
How to reuse Layers on AWS both locally using SAM and when they're deployed?
到目前为止我有这个 template.yml
:
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
My Lambda for doing something
Resources:
FirstLayer:
Type: AWS::Serverless::LayerVersion
Properties:
LayerName: FirstLayer
Description: First layer of dependencies
ContentUri: layers/first-layer/
CompatibleRuntimes:
- nodejs14.x
Metadata:
BuildMethod: nodejs14.x
SecondLayer:
Type: AWS::Serverless::LayerVersion
Properties:
LayerName: SecondLayer
Description: Second layer of dependencies
ContentUri: layers/second-layer/
CompatibleRuntimes:
- nodejs14.x
Metadata:
BuildMethod: nodejs14.x
MyLambda:
Type: AWS::Serverless::Function
Properties:
FunctionName: "MyLambda"
Policies:
- AmazonS3FullAccess
CodeUri: src/
Handler: lambda.handler
Timeout: 30
MemorySize: 2048 # Chrome will require higher memory
Runtime: nodejs14.x
Layers:
- !Ref FirstLayer
- !Ref SecondLayer
使用此模板,我可以在本地启动和调用 MyLambda
并将其部署到 AWS。我遇到的问题是我也想在其他 Lambda 上重用这些相同的层,因此为此我可以简单地将这些层提取到另一个 yml
文件,单独部署它们,然后将层 ARN 包含在Layers
属性 我的 Lambda,但是,我怎么能 运行 在本地使用 sam
呢?我不希望我的 Lambda 有 2 个 template.yml
文件,一个包括 Resources
上的层(就像我已经拥有的那个)到 运行 本地,另一个包含 refs到要在 AWS 上部署的实际层 ARN,但这是我现在看到的唯一解决方案。
您需要问的第一个问题是这些 lambda 是否属于同一个应用程序。如果不是这种情况,您应该使用不同的模板,以便部署不同的堆栈,以拥有隔离的环境。
但是,如果你想共享资源,你必须有非常相似的选项:
- 在父模板中配置图层并将 ARN 作为参数传递。
template.yml
Resources:
SharedLayer:
Type: AWS::Serverless::LayerVersion
Properties:
LayerName: shared_layer
Description: Some code to share with the other lambda functions
ContentUri: ./layer
CompatibleRuntimes:
- nodejs14.x
RetentionPolicy: Delete
Application:
Type: "AWS::Serverless::Application"
Properties:
Location: "./app.template.yml"
Parameters:
SharedLayer: !Ref SharedLayer
app.template.yml
Parameters:
SharedLayer:
Type: String
Description: ARN of the SharedLayer
LambdaFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: ./
Handler: index.handler
Layers:
- !Ref SharedLayer
- 在嵌套模板中配置层,将 ARN 设置为输出,然后将其输出作为参数传递给其他模板。
层数。template.yml
Resources:
SharedLayer:
Type: AWS::Serverless::LayerVersion
Properties:
LayerName: shared_layer
Description: Some code to share with the other lambda functions
ContentUri: ./layer
CompatibleRuntimes:
- nodejs14.x
RetentionPolicy: Delete
Outputs:
SharedLayerARN:
Description: ARN of the Shared Layer
Value: !Ref SharedLayer
template.yml
Layer:
Type: "AWS::Serverless::Application"
Properties:
Location: "./layers.template.yml"
Application:
Type: "AWS::Serverless::Application"
Properties:
Location: "./app.template.yml"
Parameters:
SharedLayer: !GetAtt Layer.Outputs.SharedLayerARN
AWS SAM 支持这两种情况。
到目前为止我有这个 template.yml
:
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
My Lambda for doing something
Resources:
FirstLayer:
Type: AWS::Serverless::LayerVersion
Properties:
LayerName: FirstLayer
Description: First layer of dependencies
ContentUri: layers/first-layer/
CompatibleRuntimes:
- nodejs14.x
Metadata:
BuildMethod: nodejs14.x
SecondLayer:
Type: AWS::Serverless::LayerVersion
Properties:
LayerName: SecondLayer
Description: Second layer of dependencies
ContentUri: layers/second-layer/
CompatibleRuntimes:
- nodejs14.x
Metadata:
BuildMethod: nodejs14.x
MyLambda:
Type: AWS::Serverless::Function
Properties:
FunctionName: "MyLambda"
Policies:
- AmazonS3FullAccess
CodeUri: src/
Handler: lambda.handler
Timeout: 30
MemorySize: 2048 # Chrome will require higher memory
Runtime: nodejs14.x
Layers:
- !Ref FirstLayer
- !Ref SecondLayer
使用此模板,我可以在本地启动和调用 MyLambda
并将其部署到 AWS。我遇到的问题是我也想在其他 Lambda 上重用这些相同的层,因此为此我可以简单地将这些层提取到另一个 yml
文件,单独部署它们,然后将层 ARN 包含在Layers
属性 我的 Lambda,但是,我怎么能 运行 在本地使用 sam
呢?我不希望我的 Lambda 有 2 个 template.yml
文件,一个包括 Resources
上的层(就像我已经拥有的那个)到 运行 本地,另一个包含 refs到要在 AWS 上部署的实际层 ARN,但这是我现在看到的唯一解决方案。
您需要问的第一个问题是这些 lambda 是否属于同一个应用程序。如果不是这种情况,您应该使用不同的模板,以便部署不同的堆栈,以拥有隔离的环境。
但是,如果你想共享资源,你必须有非常相似的选项:
- 在父模板中配置图层并将 ARN 作为参数传递。
template.yml
Resources:
SharedLayer:
Type: AWS::Serverless::LayerVersion
Properties:
LayerName: shared_layer
Description: Some code to share with the other lambda functions
ContentUri: ./layer
CompatibleRuntimes:
- nodejs14.x
RetentionPolicy: Delete
Application:
Type: "AWS::Serverless::Application"
Properties:
Location: "./app.template.yml"
Parameters:
SharedLayer: !Ref SharedLayer
app.template.yml
Parameters:
SharedLayer:
Type: String
Description: ARN of the SharedLayer
LambdaFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: ./
Handler: index.handler
Layers:
- !Ref SharedLayer
- 在嵌套模板中配置层,将 ARN 设置为输出,然后将其输出作为参数传递给其他模板。
层数。template.yml
Resources:
SharedLayer:
Type: AWS::Serverless::LayerVersion
Properties:
LayerName: shared_layer
Description: Some code to share with the other lambda functions
ContentUri: ./layer
CompatibleRuntimes:
- nodejs14.x
RetentionPolicy: Delete
Outputs:
SharedLayerARN:
Description: ARN of the Shared Layer
Value: !Ref SharedLayer
template.yml
Layer:
Type: "AWS::Serverless::Application"
Properties:
Location: "./layers.template.yml"
Application:
Type: "AWS::Serverless::Application"
Properties:
Location: "./app.template.yml"
Parameters:
SharedLayer: !GetAtt Layer.Outputs.SharedLayerARN
AWS SAM 支持这两种情况。