Set up a Django App to Respond to S3 Events on AWS Lambda

I'm going to show you how to set up your Django app to respond to S3 events on AWS Lambda. The tool we're using to get Django running on AWS Lambda is Zappa. Follow along to see how responding to events works with this setup. ...

Event Driven Django Apps on AWS Lambda#

When running your Django app on AWS Lambda using Zappa, it's easy to send and receive events from other AWS services.

Zappa lets you get events from:

  • Changes to an S3 bucket

  • Messages in an SNS topic

  • Streams from DynamoDB and Kinesis

  • Messages added to SQS

  • and other AWS services

Let's configure our Django with Zappa project to detect when new files are uploaded to an S3 bucket.

Create an S3 Bucket#

You'll need a Django project configured with Zappa. You can create a Django project, then follow the guide for adding Zappa to your Django setup.

Once your project is set up properly, log into the AWS console and create an S3 bucket with a unique name. The bucket won't need public access for this tutorial since we'll upload files directly using the AWS console. Once the bucket is ready, click on 'Properties' and record the Amazon Resource Name (ARN) for the bucket.

Add the Event Handler to Your Django App#

At the root of your project, create a new file called aws_events.py. In this file, we'll add the handler function that will accept all our S3 events. When AWS invokes your function, two objects are passed in: the event object and the context object.

The context object contains metadata about the invocation, function, and execution environment.

The S3 event contains:

  • The bucket name

  • The object key (similar to filename)

  • The object size

  • The type of event (created, deleted, etc)

  • The time of the event

Here's the code to accept the event:

Our event handler code above prints out the event information and exits.

Edit your zappa_settings.json File#

Finally, we need to tell Zappa to register our event handler function with AWS so that AWS can start sending events.

Add the following to the project's zappa_settings.json file:

Update your Deployment#

With all the changes saved, go ahead and push these changes to the cloud.

Showing the Lambda Output Console#

In order to see the event details that our code prints out, let's activate the Zappa console log. You can do this by running:

This gets Zappa to show you what your Django project is printing. Leave it up and running and remember you can exit anytime by pressing Ctrl-C.

Testing: Upload a File to S3#

Head back over to your AWS console and find your S3 bucket page. Under the Objects tab, find the upload button. Go ahead and upload a file. Any file will do, but it's best to send a smaller one for expediency.

Check out the Event#

After a few seconds, you should see in the terminal window the full event information from S3. It should look something like the following:

A few things to note here. The filename is testfile.jpg and the bucket name is newline-upload-bucket. Of course, your file and bucket will be named differently. Also note the formatting is a little wonky, but still readable.

Next Steps#

You can try uploading a few more files. Maybe try two or three at once. You'll see each upload handled by your Django project as independent events.

At this point, we have many options. Maybe your app will create a thumbnail if an image was uploaded. Or scan a document for keywords. Alternatively, your app might send an email to the client that uploaded the file confirming the receipt of the file.

To dive in even more into setting up your Python apps to run serverless on AWS Lambda, check out our latest course, The newline Guide to Serverless Django with Zappa.