首页 > 解决方案 > SAM 模板事件类型

问题描述

如何将事件类型添加为 Lambda 函数的 Cloudfront for SAM 模板

我有一个 SAM 模板,其中将有一个 lambda 函数和 Api 网关作为触发器,现在我需要添加一个现有的 CLoudfront 分发而不是 Api 网关作为触发器。但我没有找到任何这样的选择来做到这一点。

cloudfrontlambda:    
    Type: AWS::Serverless::Function    
    Properties:    
      FunctionName: cloudfrontlambda   
      Handler: index.handler    
      Runtime: nodejs8.10    
      CodeUri: ./Lambda/cloudfrontlambda/   
      Description: Function is used for validating the id token    
      MemorySize: 128    
      Timeout: 30    
      Role: 'arn:aws:iam::1234567:role/DR_lambda_web_execution'    
      Events:
     --------- ## how to add an Existing cloudfront distribution here

标签: amazon-web-servicesamazon-cloudfrontserverless

解决方案


目前,SAM 模型 [1] 中没有 CloudFront 分配的事件源类型。假设您正在尝试创建一个边缘 lambda 函数,您将需要手动或通过您用于创建分发的 cloudformation 模板附加该函数 - 因为它需要直接针对云端分发进行声明。为简洁起见,我已对其进行了编辑,但例如 -

cloudfrontlambda:    
    Type: AWS::Serverless::Function    
    Properties:    
      FunctionName: cloudfrontlambda   
      Handler: index.handler    
      Runtime: nodejs8.10    
      CodeUri: ./Lambda/cloudfrontlambda/   
      Description: Function is used for validating the id token    
      MemorySize: 128    
      Timeout: 30    
      Role: 'arn:aws:iam::1234567:role/DR_lambda_web_exec’

  cloudfrontdistribution:
    Type: AWS::CloudFront::Distribution
    Properties:
      DistributionConfig:
        CacheBehaviors:
          - LambdaFunctionAssociations:
              - EventType: string-value
                LambdaFunctionARN: !Sub ‘${cloudfrontlambda.Arn}:${cloudfrontlambda.Version}’

例如

请注意,您的 lambda 函数必须部署在 us-east-1 中才能以这种方式工作。我可以确认您可以通过 cloudformation 模板在另一个区域部署云前端分发,并且仍然引用部署到 us-east-1 的 lambda 函数。

此外,您必须在 ARN 中指定 lambda 函数的版本。AWS::Lambda::Function cloudformation 类型本身不提供此功能(需要额外的 AWS::Lambda::Version 资源),因此如果您的 CloudFront 分发模板尚未包含在 SAM 模板中,这可能会使它变得复杂。

[1] https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#event-source-object


推荐阅读