CloudFront与Lambda Edge适配新缓存行为失败,旧缓存行为可正常运行
CloudFront新缓存行为下Lambda@Edge路径修改失效问题排查与解决
问题背景
此前使用旧版CloudFront缓存行为,搭配Lambda@Edge修改源路径,实现单S3存储桶托管多站点。旧缓存行为下Lambda代码运行正常,但切换至新缓存行为后,配置无法正常工作。
原Lambda@Edge代码
'use strict'; const env = '${Environment}'; const origin_hostname = 'yourwebsite-${Environment}.s3.amazonaws.com'; exports.handler = (event, context, callback) => { const request = event.Records[0].cf.request; const headers = request.headers; const host_header = headers.host[0].value; var remove_suffix = '.yourwebsite.com'; if(env == "dev"){ remove_suffix = '-dev.yourwebsite.com'; } if(host_header.endsWith(remove_suffix)) { request.uri = '/' + host_header.substring(0,host_header.length - remove_suffix.length) + request.uri; } // fix the host header so that S3 understands the request headers.host[0].value = origin_hostname; // return control to CloudFront with the modified request return callback(null,request); };
当前CloudFormation配置
LambdaFunctionAssociations: - EventType: origin-request LambdaFunctionARN: !Ref HotSitesEdgeFunctionVersion CachePolicyId: "658327ea-f89d-4fab-a63d-7e88639e58f6" ResponseHeadersPolicyId: "67f7725c-6f97-4210-82d7-5512b31e9d03"
原因分析
默认缓存策略的缓存键未包含Host头
你使用的658327ea-f89d-4fab-a63d-7e88639e58f6是CloudFront托管的Managed-CachingOptimized策略,该策略默认缓存键仅包含查询字符串,不包含Host头。由于你的Lambda逻辑依赖Host头区分不同站点,CloudFront会将不同Host的请求视为相同缓存键,导致缓存命中时跳过Lambda执行,或返回错误的站点路径。缓存命中跳过origin-request事件
Lambda@Edge的origin-request事件仅在缓存未命中时触发。如果缓存键不区分Host,不同站点的请求会命中同一缓存条目,Lambda代码根本不会执行,自然无法修改源路径。
解决方法
1. 创建自定义缓存策略,将Host头纳入缓存键
自定义缓存策略需明确将Host头加入缓存键,确保CloudFront为不同Host生成独立缓存条目:
CustomMultiSiteCachePolicy: Type: AWS::CloudFront::CachePolicy Properties: CachePolicyConfig: Name: MultiSite-Cache-Policy DefaultTTL: 86400 MaxTTL: 31536000 MinTTL: 0 ParametersInCacheKeyAndForwardedToOrigin: CookiesConfig: CookieBehavior: none HeadersConfig: HeaderBehavior: whitelist Headers: - Host QueryStringsConfig: QueryStringBehavior: none
2. 更新缓存行为配置,引用自定义缓存策略
将原默认缓存策略替换为自定义策略,确保缓存键包含Host:
LambdaFunctionAssociations: - EventType: origin-request LambdaFunctionARN: !Ref HotSitesEdgeFunctionVersion CachePolicyId: !Ref CustomMultiSiteCachePolicy ResponseHeadersPolicyId: "67f7725c-6f97-4210-82d7-5512b31e9d03"
3. 验证Lambda@Edge部署与执行
- 确认Lambda@Edge已部署至us-east-1区域(CloudFront全局事件要求)
- 检查CloudFront分发的Lambda关联事件类型为
origin-request - 通过CloudFront日志验证Host头是否被正确纳入缓存键,Lambda代码是否正常执行
内容的提问来源于stack exchange,提问作者Michel Borges
相关产品推荐
相关产品推荐

