You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为serverless.yml资源块中已定义的CloudFront分发关联触发函数?

解决方案:在Serverless resources中关联CloudFront与Lambda@Edge函数

当你需要在serverless.yml的resources区块自定义CloudFront分发,同时关联viewer-request和origin-response类型的Lambda函数时,核心是通过CloudFront分发配置中的LambdaFunctionAssociations字段绑定函数,并为CloudFront配置调用Lambda的权限。以下是具体实现步骤和示例:

1. 定义带别名的Lambda函数

首先在functions区块定义你的两个函数,确保开启版本管理并指定别名(Lambda@Edge要求必须使用版本或别名):

functions:
  viewerRequestFunc:
    handler: handler.viewerRequest # 替换为你的处理函数路径
    runtime: nodejs18.x
    region: us-east-1 # Lambda@Edge必须部署到us-east-1
    versionFunctions: true # 自动生成函数版本
    alias: prod # 指定分发要关联的别名

  originResponseFunc:
    handler: handler.originResponse
    runtime: nodejs18.x
    region: us-east-1
    versionFunctions: true
    alias: prod

2. 在CloudFront分发中关联Lambda函数

在resources区块的CloudFront Distribution资源里,找到对应的缓存行为(DefaultCacheBehavior或自定义CacheBehavior),添加LambdaFunctionAssociations配置,指定事件类型和带别名的Lambda ARN:

resources:
  Resources:
    MyCloudFrontDistribution:
      Type: AWS::CloudFront::Distribution
      Properties:
        DistributionConfig:
          # 替换为你的分发基础配置(源、价格类等)
          Origins:
            - Id: myOrigin # 自定义源ID
              DomainName: your-origin-domain.example.com
              CustomOriginConfig:
                HTTPPort: 80
                HTTPSPort: 443
                OriginProtocolPolicy: https-only
          DefaultCacheBehavior:
            TargetOriginId: myOrigin
            ViewerProtocolPolicy: redirect-to-https
            # 关联Lambda函数
            LambdaFunctionAssociations:
              - EventType: viewer-request
                LambdaFunctionARN: !Join
                  - ':'
                  - - !Sub 'arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function'
                    - !Ref ViewerRequestFuncLambdaFunction # Serverless自动生成的函数逻辑ID
                    - prod # 函数别名
              - EventType: origin-response
                LambdaFunctionARN: !Join
                  - ':'
                  - - !Sub 'arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function'
                    - !Ref OriginResponseFuncLambdaFunction
                    - prod
          Enabled: true
          PriceClass: PriceClass_100 # 替换为你的价格类

3. 配置CloudFront调用Lambda的权限

必须为每个Lambda函数添加权限,允许CloudFront服务调用它们。在resources中添加两个AWS::Lambda::Permission资源:

# 允许CloudFront调用viewer-request函数
    ViewerRequestLambdaPermission:
      Type: AWS::Lambda::Permission
      Properties:
        FunctionName: !Join
          - ':'
          - - !Ref ViewerRequestFuncLambdaFunction
            - prod
        Action: lambda:InvokeFunction
        Principal: cloudfront.amazonaws.com
        SourceArn: !Sub 'arn:aws:cloudfront::${AWS::AccountId}:distribution/${MyCloudFrontDistribution}'

    # 允许CloudFront调用origin-response函数
    OriginResponseLambdaPermission:
      Type: AWS::Lambda::Permission
      Properties:
        FunctionName: !Join
          - ':'
          - - !Ref OriginResponseFuncLambdaFunction
            - prod
        Action: lambda:InvokeFunction
        Principal: cloudfront.amazonaws.com
        SourceArn: !Sub 'arn:aws:cloudfront::${AWS::AccountId}:distribution/${MyCloudFrontDistribution}'

关键注意事项

  • Lambda@Edge函数必须部署到us-east-1区域,无论你的CloudFront分发面向哪个区域。
  • 必须使用带别名或版本的Lambda ARN,不能直接引用未版本化的函数(CloudFront不支持)。
  • SourceArn权限限制确保只有你的目标CloudFront分发能调用Lambda,避免权限过度开放。
  • 如果需要为特定路径绑定函数,可在CacheBehaviors数组中定义自定义缓存行为并添加对应的LambdaFunctionAssociations。

内容的提问来源于stack exchange,提问作者Wil S.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 17:17:12