m0meni
m0meni

Reputation: 16435

CloudFront with S3 website as origin is not serving gzipped files

AWS now supports gzipping files through CloudFront

I've followed along with all of the instructions in Serving Compressed Files, and yet gzipping is not working.

I have an S3 bucket set up as a website that CloudFront is using as the origin.

Despite all this, I can't get gzipping to work. I have gotten everything else including SSL working perfectly, and you can visit the site here: https://formulagrid.com/

If you open up the chrome console, you'll notice that none of the files being served from S3 are being gzipped. The only gzipped files such as the google font are the ones I'm grabbing from other CDNs.

Upvotes: 37

Views: 13411

Answers (5)

Akshay
Akshay

Reputation: 3866

In my case, the S3 file had some metadata and it had Content-Encoding: utf-8 available.

So the cloudfront was just forwarding file as it is without compressing. enter image description here

Upvotes: 0

CefBoud
CefBoud

Reputation: 224

I had tried all of the above but CloudFront was still not compressing my S3 bucket content.

My problem was that I already had an existing Cloudfront distribution with compression disabled that I later turned on. This somehow didn't allow compression to be taken into account. After a lot of unsuccessful workarounds, I deleted the CloudFront distribution and recreated it with compression on from the get go. This solved my problem.

Upvotes: 0

Leon Braun
Leon Braun

Reputation: 415

As Cloudfront now only accepts JSON, you have to paste this:

[
    {
        "AllowedHeaders": [
            "Authorization",
            "Content-Length"
        ],
        "AllowedMethods": [
            "GET"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": [],
        "MaxAgeSeconds": 3000
    }
]

Upvotes: 17

dom
dom

Reputation: 876

My problem was that I uploaded the files specifically with utf-8 encoding. From the documentation:

CloudFront determines whether the file is compressible:

The file must be of a type that CloudFront compresses.

The file size must be between 1,000 and 10,000,000 bytes.

The response must include a Content-Length header so CloudFront can determine whether the size of the file is in the range that CloudFront compresses. If the Content-Length header is missing, CloudFront won't compress the file.

The response must not include a Content-Encoding header.

Upvotes: 8

Rodrigo
Rodrigo

Reputation: 1253

I hit the same error today and solved it by adding a CORS rule to the S3 bucket. This rule ensures the Content-Length header is sent to Cloudfront so content can be gzipped:

S3 > Bucket > Permissions > CORS Configuration

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>*</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <MaxAgeSeconds>3000</MaxAgeSeconds>
        <AllowedHeader>Authorization</AllowedHeader>
        <AllowedHeader>Content-Length</AllowedHeader>
    </CORSRule>
</CORSConfiguration>

Credit goes to Robert Ellison: http://ithoughthecamewithyou.com/post/enable-gzip-compression-for-amazon-s3-hosted-website-in-cloudfront

As far I know, this seems to be an undocumented requirement.

Upvotes: 53

Related Questions