How to reduce Amazon Cloudfront costs?

I have a site that has exploded in traffic the last few days. I’m using WordPress with W3 Total Cache plugin and Amazon Cloudfront to deliver the images and files from the site.

The problem is that the cost of Cloudfront is quite huge, near $500 just the past week. Is there a way to reduce the costs? Maybe using another CDN service?

Read More

I’m new to CDN, so I might not be implementing this well. I’ve created a cloudfront distribution and configured it on W3 Total Cache Plugin. However, I’m not using S3 and don’t know if I should or how. To be honest, I’m not quite sure what’s the difference between Cloudfront and S3.

Can anyone give me some hints here?

Related posts

Leave a Reply

5 comments

  1. I’m not quite sure what’s the difference between Cloudfront and S3.

    That’s easy. S3 is a data store. It stores files, and is super-scalable (easily scaling to serving 1000’s of people at once.) The problem is that it’s centralized (i.e. served from one place in the world.)

    CloudFront is a CDN. It caches your files all over the world so they can be served faster. If you squint, it looks like they are ‘storing’ your files, but the cache can be lost at any time (or if they boot up a new node), so you still need the files at your origin.

    CF may actually hurt you if you have too few hits per file. For example, in Tokyo, CF may have 20 nodes. It may take 100 requests to a file before all 20 CF nodes have cached your file (requests are randomly distributed). Of those 100 requets, 20 of them will hit an empty cache and see an additional 200ms latency as it fetches the file. They generally cache your file for a long time.

    I’m not using S3 and don’t know if I should

    Probably not. Consider using S3 if you expect your site to massively grow in media. (i.e. lots of use photo uploads.)

    Is there a way to reduce the costs? Maybe using another CDN service?

    That entirely depends on your site. Some ideas:

    1) Make sure you are serving the appropriate headers. And make sure your expires time isn’t too short (should be days or weeks, or months, ideally).

    The “best practice” is to never expire pages, except maybe your index page which should expire every X minutes or hours or days (depending on how fast you want it updated.) Make sure every page/image says how long it can be cached.

    2) As stated above, CF is only useful if each page is requested > 100’s of times per cache time. If you have millions of pages, each requested a few times, CF may not be useful.

    3) Requests from Asia are much more expensive than the from the US. Consider launching your server in Toyko if you’re more popular there.

    4) Look at your web server log and see how often CF is requesting each of your assets. If it’s more often than you expect, your cache headers are setup wrong. If you setup “cache this for months”, you should only see a handful of requests per day (as they boot new servers, etc), and a few hundred requests when you publish a new file (i.e. one request per CF edge node).

    Depending on your setup, other CDNs may be cheaper. And depending on your server, other setups may be less expensive. (i.e. if you serve lots of small files, you might be better off doing your own caching on EC2.)

  2. What components make up your bill? One thing to check with W3 Total Cache plugin is the number of invalidation requests it is sending to CloudFront. It’s known to send a large amount of invalidations paths on each change, which can add up.

    Aside from that, if your spend is predictable, one option is to use CloudFront Security Savings Bundle to save up to 30% by committing to a minimum amount for a one year period. It’s self-service, so you can sign up in the console and purchase additional commitments as your usage grows.

    https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/savings-bundle.html

  3. Don’t forget that cloudfront has 3 different price classes, which will influence how far your data is being replicated, but at the same time, it will make it cheaper.

    https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/PriceClass.html

    The key here is this:
    “If you choose a price class that doesn’t include all edge locations, CloudFront might still occasionally serve requests from an edge location in a region that is not included in your price class. When this happens, you are not charged the rate for the more expensive region. Instead, you’re charged the rate for the least expensive region in your price class.”

    It means that you could use price class 100 (the cheapest one) and still get replication on regions you are not paying for <3