Cloudfront Origin Group使用Lambda @ Edge

时间:2019-12-04 09:42:18

标签: amazon-web-services amazon-s3 aws-lambda amazon-cloudfront aws-lambda-edge

我的设置:

我有一个Cloudfront Origin Group,其中存储桶A是主存储桶,存储桶B是辅助存储桶。在origin-request上添加了Lambda @ Edge来执行特定的过程。

无论何时向Cloudfront发送请求,我的Lambda @ Edge都会对其进行修改以匹配存储桶的文件夹结构,并相应地返回文件。

如果存储桶A没有某个文件,则会引发错误,并且Cloudfront故障转移会从存储桶B请求该文件。存储桶B与存储桶B的结构不同,它应从未修改的文件路径中返回文件桶。

示例:

我的原始请求:/somefile.html Lambda @ Edge修改了此请求,以从存储桶A获取文件至:/en/somefile.html

如果存储桶A没有此somefile.html,则此请求将发送到存储桶B。它应从最初请求的路径:/somefile.html而不是/en/somefile.html返回文件

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

我想要的:

使用Lambda @ Edge如何检测请求是在存储区A还是存储区B上?

我尝试过的事情:

  • 我尝试在请求标头中添加某些标头,并检查标头是否存在,然后再向存储桶B发送它的请求。但这似乎不起作用。

1 个答案:

答案 0 :(得分:1)

在两个位置之一中找到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

这些可用于确定起源组中的两个起源中的哪一个下一步将接收请求。

https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-event-structure.html#lambda-event-structure-request