Amazon web services Cloudfront原始组使用检测故障切换程序Lambda@Edge

Amazon web services Cloudfront原始组使用检测故障切换程序Lambda@Edge,amazon-web-services,amazon-s3,aws-lambda,amazon-cloudfront,aws-lambda-edge,Amazon Web Services,Amazon S3,Aws Lambda,Amazon Cloudfront,Aws Lambda Edge,我的设置: 我有一个Cloudfront原始组,其中Bucket a是主Bucket,Bucket B是辅助Bucket。Lambda@Edge添加到原始请求以执行特定流程 每当Cloudfront收到请求时,我的Lambda@Edge修改它以匹配我的bucket的文件夹结构,并相应地返回文件 如果Bucket A没有特定的文件,它会抛出一个错误,Cloudfront故障切换会从Bucket B请求该文件。Bucket B与Bucket B的结构不同,它应该从Bucket中未修改的文件路径返回该

我的设置:

我有一个Cloudfront原始组,其中Bucket a是主Bucket,Bucket B是辅助Bucket。Lambda@Edge添加到
原始请求
以执行特定流程

每当Cloudfront收到请求时,我的Lambda@Edge修改它以匹配我的bucket的文件夹结构,并相应地返回文件

如果Bucket A没有特定的文件,它会抛出一个错误,Cloudfront故障切换会从Bucket B请求该文件。Bucket B与Bucket B的结构不同,它应该从Bucket中未修改的文件路径返回该文件

示例:

我的原始请求:
/somefile.html
Lambda@Edge将此请求修改为将文件从Bucket A获取到:
/en/somefile.html

如果Bucket A没有这个somefile.html,那么这个请求将转到Bucket B。它应该从最初请求的路径返回文件:
/somefile.html
,而不是
/en/somefile.html

上面的场景非常简单,我原来的场景非常复杂。基本上,Bucket A文件路径是处理路径,而Bucket B应该从最初请求的路径返回文件

我想要什么:

使用Lambda@Edge如何检测请求是在Bucket A还是Bucket B上

我尝试过的:

  • 我尝试在请求头中添加某些头,并检查头是否存在,然后将其请求发送到Bucket B。但这似乎不起作用

在两个位置中的一个可以找到CloudFront在原点请求触发器返回控制后尝试联系的原点的主机名

如果您使用的是CloudFront所称的S3源(S3的REST接口),它将在这里:

event.Records[0].cf.request.origin.s3.domainName 
如果您使用的是CloudFront所称的自定义源站,其中包括承载端点的S3网站以及任何其他非S3 REST的源站服务器,它位于以下位置:

event.Records[0].cf.request.origin.custom.domainName
下一步,这些可用于确定源组中的两个源中的哪一个将接收请求


查看Lambda函数中的
事件记录[0].cf.request.origin.s3.domainName
。它应该是bucket的端点主机名,例如
example bucket.s3.amazonaws.com
,因此您可以使用它来区分第一个和第二个来源。当然,这是我尝试过但不确定的一件事。谢谢您的提醒,我没有收到
event.Records[0].cf.request.origin.s3.domainName
,而是
event.Records[0].cf.request.origin.custom.domainName
。它似乎正在发挥作用。非常感谢。