1

I have a CloudFront distribution. The origin is an S3 bucket that uses OAI.

I have created a lambda@edge function following directions from https://aws.amazon.com/blogs/compute/implementing-default-directory-indexes-in-amazon-s3-backed-amazon-cloudfront-origins-using-lambdaedge/

Basically, I want the lambda@edge function to redirect URLs ending in / to /index.html. Acting like Apache DirectroyIndex.

The CloudFront distribution works for URLs without the redirect requirement. But CloudFront does not seem to invoke my lamba@edge function.

I have ensured, there is a correct association between the CloudFront distribution and the labda@edge function version.

I made several test requests:

curl -I https://www.sudheer.net/blog/
HTTP/2 403 
content-type: application/xml
date: Sat, 19 Feb 2022 14:35:38 GMT
server: AmazonS3
x-cache: Error from cloudfront
via: 1.1 5d840d432727e3561fd1a3de915212ca.cloudfront.net (CloudFront)
x-amz-cf-pop: EWR53-C2
x-amz-cf-id: leub-Kgu4Bh9xH4Rn5o7bxs62B1NBO4ViEu6hv-_xtGG7DSQlBFEXw=

I get 403. I did not find any lambda@edge logs in any region.

What could be the issue? How do I go about finding it?

The Lambda@Edge function has the principals:

    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "edgelambda.amazonaws.com",
                    "lambda.amazonaws.com"
                ]
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

1 Answers1

0

You can actually do this with CloudFront Functions. Shameless self-promotion, but I encountered exactly this issue and wrote about it on my blog.

Effectively:

I found this SO post, which showed me I needed to create this function:

function handler(event) {
    var request = event.request;
    var uri = request.uri;
    
    // Check whether the URI is missing a file name.
    if (uri.endsWith('/')) {
        request.uri += 'index.html';
    } 
    // Check whether the URI is missing a file extension.
    else if (!uri.includes('.')) {
        request.uri += '/index.html';
    }

    return request;
}

Use the Functions item on the left-hand menu in the CloudFront service to save + publish this function, then edit the default behaviour of your distribution, and changed the Viewer request function association to your new function.

shearn89
  • 3,403
  • 2
  • 15
  • 39
  • 1
    Thank you @shearn89. Actually, my issue was incorrect order of cache behaviours. But I did simplify the setup, thanks to CloudFront functions. I ditched Lambda@Edge in favor of simpler solution. – Sudheer Satyanarayana Mar 06 '22 at 08:53
  • Feel free to share your solution and accept it for upvotes! – shearn89 Mar 07 '22 at 08:47