如何在本地使用 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 是否属于同一个应用程序。如果不是这种情况,您应该使用不同的模板,以便部署不同的堆栈,以拥有隔离的环境。

但是,如果你想共享资源,你必须有非常相似的选项:

  1. 在父模板中配置图层并将 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
  1. 在嵌套模板中配置层,将 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 支持这两种情况。