Search code examples
amazon-web-servicesamazon-s3aws-lambdaamazon-cloudfrontaws-lambda-edge

Cloudfront Origin Group detect failver using Lambda@Edge


My setup:

I have a Cloudfront Origin Group where Bucket A is a primary bucket and Bucket B is a secondary bucket. Lambda@Edge is added on origin-request to do a certain process.

Whenever a request comes to Cloudfront, my Lambda@Edge modifies it to match the folder structure of my bucket and returns file accordingly.

If Bucket A doesn't have a certain file it throws an error and Cloudfront failover requests the file from Bucket B. Bucket B doesn't have the same structure as Bucket it, it should return the file from unmodified file path in the bucket.

Example:

My Original Request: /somefile.html Lambda@Edge modifies this request to get the file from Bucket A to: /en/somefile.html

If Bucket A doesn't have this somefile.html then this request goes to Bucket B. It should return file from the originally requested path: /somefile.html and not /en/somefile.html

The above scenario is very simple, my original scenario is much complex. Basically Bucket A file path is processed path while Bucket B should return file from an originally requested path.

What I want:

Using Lambda@Edge how can I detect if the request is on Bucket A or bucket B?

What I have tried:

  • I tried adding certain header in request headers and check if the header exists then its request to Bucket B. But this doesn't seem to be working.

Solution

  • The hostname of the origin that CloudFront will try to contact after an origin-request trigger returns control can be found in one of two places.

    If you are using what CloudFront calls an S3 origin (the REST interface to S3) it will be here:

    event.Records[0].cf.request.origin.s3.domainName 
    

    If you are using what CloudFront calls a custom origin -- which includes S3 website hosting endpoints as well as any other origin server that isn't S3 REST, it's here:

    event.Records[0].cf.request.origin.custom.domainName
    

    These can be used to determine which of two origins in an origin group will receive the request, next.

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