CloudFront同事件触发多Lambda@Edge的执行流程与方案选型咨询
同CloudFront事件绑定多Lambda@Edge执行逻辑及方案建议
多Lambda@Edge同事件的执行工作流
绑定到同一CloudFront事件类型的多个Lambda@Edge,执行规则如下:
- 优先按照你在CloudFront控制台配置的优先级数值排序执行:数值越小,执行顺序越靠前
- 优先级数值相同的场景下,按照Lambda绑定到事件的先后顺序执行
- 只要任意一个前置Lambda直接返回了客户端响应(比如403访问拒绝、重定向响应等),后续所有优先级更低的Lambda都会被终止执行,不会触发
你当前的故障风险完全成立:如果下载统计Lambda的优先级高于权限限制Lambda,就会出现无权限用户的请求被统计后才被拦截的问题,导致计数不准。
可选解决方案
方案1:调整Lambda优先级(推荐,改造成本最低)
不需要修改业务代码,仅在CloudFront控制台调整两个Lambda的优先级即可:
- 将访问权限限制Lambda的优先级数值设为更小的值(比如设为
1) - 将单用户下载量统计Lambda的优先级数值设为更大的值(比如设为
2)
调整后权限校验会先执行,校验不通过直接返回拒绝响应,统计逻辑完全不会被触发,符合业务预期。
方案2:合并为单个Lambda
如果需要避免后续运维中优先级配置错误的风险,可以把所有逻辑合并到同一个Lambda中,注意遵循Lambda@Edge的执行时长限制:
- viewer类事件(viewer request / viewer response):最大执行时长5秒
- origin类事件(origin request / origin response):最大执行时长30秒
只要合并后的逻辑总耗时不超过对应事件的时长上限,就可以正常运行。合并时注意逻辑顺序必须为:先执行所有访问校验、下载计数校验逻辑,所有校验通过后再执行下载量统计更新。
补充说明
如果你的业务需要统计所有访问请求(包括被拦截的异常请求),可以在统计逻辑中增加响应状态码判断,仅当请求返回200/206等正常下载状态时,再执行计数累加,避免无效数据污染统计结果。
内容的提问来源于stack exchange,提问作者Rey4eel
相关产品推荐
相关产品推荐

