如何为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.
相关产品推荐
相关产品推荐

