借助Lambda Edge将爬虫流量路由至不同服务器
解决CloudFront将爬虫流量路由到Elastic Beanstalk服务器的问题
我明白你的困惑——你找到的示例都是指向S3存储桶的,但其实CloudFront的request.origin对象支持多种源类型,S3只是其中一种。要路由到你的Elastic Beanstalk服务器(比如api.<domainname>.com),你需要使用自定义HTTP/HTTPS源的配置格式,而不是s3属性。
先解释下request.origin的结构
CloudFront根据你配置的源类型,会在request.origin里设置对应的属性:
s3:当源是S3存储桶时使用custom:当源是HTTP/HTTPS服务器(比如你的Elastic Beanstalk实例、EC2或者外部API)时使用
修改后的代码示例
下面是调整后的Lambda@Edge代码,会把爬虫流量转发到你的API服务器:
exports.handler = (event, context, callback) => { const request = event.Records[0].cf.request; let is_crawler = undefined; // 检查请求头里的"is-crawler"标记 if ('is-crawler' in request['headers']) { is_crawler = request['headers']['is-crawler'][0].value.toLowerCase(); } if (is_crawler === 'true') { // 替换为自定义源(你的Elastic Beanstalk服务器) request.origin = { custom: { domainName: 'api.<domainname>.com', // 替换成你的实际API域名 port: 443, // 如果用HTTPS就是443,HTTP是80 protocolPolicy: 'https-only', // 可选:强制HTTPS,或者"http-only"/"match-viewer" path: '', // 如果需要给请求加前缀可以在这里设置,比如'/crawler' customHeaders: {} } }; // 可选:如果需要修改Host头,确保源服务器能正确识别请求 request.headers['host'] = [{ key: 'Host', value: 'api.<domainname>.com' }]; } callback(null, request); };
关键注意事项
- 源配置权限:确保你的Elastic Beanstalk服务器的安全组/防火墙允许CloudFront的IP访问(或者配置CloudFront作为源的可信访问者)
- HTTPS配置:如果你的API服务器用HTTPS,要确保CloudFront能验证证书(建议使用AWS证书管理器颁发的证书)
- Host头设置:有些服务器依赖Host头来路由请求,所以上面的代码里加上了修改Host头的逻辑,根据你的实际情况调整
- 触发器位置:这个Lambda函数要设置为CloudFront的Viewer Request触发器,这样能在请求到达CloudFront后立即修改路由
内容的提问来源于stack exchange,提问作者Xen_mar
相关产品推荐
相关产品推荐

