One of the largest costs of AWS is bandwidth—it’s expensive, especially if your app is dependant on serving content. Compressing the images you serve can reduce your bill significantly, as well as save you money on the storage costs.

Why Lower the Size?

The simplest way to lower bandwidth is to lower the size of the objects you’re serving with compression and encoding. It can also reduce your storage costs as well, which can save a lot of money over time. JPEG has quality built into the standard; JPEGs encoded at 70% or so are still sharp and nearly indistinguishable from 100% quality (at which no JPEG intended for web distribution should be encoded).

Also, if you’re enabing users to upload their own images and aren’t processing them in some way, you’re opening yourself up to abuse from users uploading multiple gigabytes of gigantic photos and slowing down your application.

AWS doesn’t have a built in tool for doing this, so you’ll have to use Lambda, AWS’s service for running code in response to triggers without provisioning servers. If you’d like to encode video as well, AWS has a service for this, as it’s a more CPU-intensive task.

Getting Started

Head over to the Lambda Management Console, and click “Create Function.”

Luckily, there’s already a prebuilt app on the Lambda serverless app repository that can handle basic image compression and is perfect for this task. Select “Browse Serverless App Repository.”

Then, search for “compress,” by evanchiu:

This application uses transforms, which owns an S3 bucket and watch it for uploaded files. When a file is uploaded, the function runs, compresses the image, and puts it in a destination bucket.

The input bucket is created by the function, but the output bucket will need to be created from the S3 Management Console:

Then, back in the Lambda Console, enter in the name of your destination bucket in the Application Settings, then give a name for the source bucket that will be created. Make sure this doesn’t exist already, as the app must own the bucket.

You can specify the JPEG quality here. While 70% or so should be a good number, you can do your own testing to see what works best for your application.

Click on “Deploy,” and the app should be up and running. Within a few minutes, you’ll see the newly created source bucket owned by the application. If you upload an image into it, you’ll quickly see the compressed image created in the destination bucket.

If you’d like to modify the application or add your own functionality, you can do so by clicking on the “Functions” tab to the right:

Here, you can also modify the triggers that cause the function to run, and edit the settings you set when creating the function.