Deploying a Django project on AWS Lambda using Serverless (Part 2)

How to prepare AWS infrastructure for deploying a Django project

Deploying a Django project on AWS Lambda using Serverless (Part 2)

After my previous blog post Deploy Django App on AWS Lambda using Serverless (Part 1), people started asking me about AWS infrastructure for Django projects, so I decided to share my experience with this.

It is not obvious (for people who don't have enough experience with AWS resources) how to create and configure all the necessary AWS resources to deploy a Django project on AWS Lambda using Serverless.

Here are a list of ways of how to do this:

In this blog post, I will show you how to do it manually via AWS console.

Update configuration for existing AWS resource and create new ones

Step 1: Create your own AWS account (if you don't have one). Here is a link to a manual for creating and activating an AWS account.

Step 2: Go to the AWS Management Console

image.png

Step 3: Select your region. In my case, it is US East (N. Virginia)us-east-1

image.png

Step 4: Update Security Group with rules for AWS RDS service (PostgreSQL)

  • Type EC2 in the search bar and click on the EC2 service in the search results image.png

  • Choose the Security Groups option in the Network & Security section

image.png

  • Click on your security group id

image.png

  • Click on Edit inbound rules

image.png

  • Click on Add rule. Then, select the PostgreSQL option in the Type column. Next, choose the Anywhere option in the Source column. Finally, click on the Save rules button

image.png

  • Go to the Outbound rules tab and add the same rules that were described in the previous section

Step 5: Create an IAM role

  • Type IAM in the search bar and click on the IAM service in the search results

image.png

  • Click on Roles in the IAM side bar or in the IAM dashboard

image.png

  • Click on the Create Role button

image.png

  • Select AWS service, Lambda, and click on the Next: Permissions button

image.png

  • Type Lambda in the search bar, select the AWSLambda_FullAccess policy, click on the Next: Tags button

image.png

  • Click on the Next: Review button

image.png

  • Type Role name, Role description, and click on the Create role button

image.png

  • Click on the created role name

image.png

  • Click on the Copy Role ARN button

image.png

Next, you should add the role ARN to the Serverless configuration directly or using environment variables (for example .env file)

ROLE=arn:aws:iam::<your-aws-account-id>:role/exec_lambda

Step 6: Create S3 buckets for static assets and deployment

  • Type S3 in the search bar and click on the S3 service in the search results

image.png

  • Click on the Create bucket button

image.png

  • Type Bucket name, select your AWS region, unselect Block all public access and click on the Create bucket button

image.png

image.png

Then, you should repeat all the steps mentioned above to create an S3 bucket for deployment.

Next, you should add your bucket names to your Django and Serverless configurations directly or using environment variables (for example .env file)

AWS_STORAGE_BUCKET_NAME='django-react-static-assets'
DEPLOYMENT_BUCKET='django-react-deployments'

Step 7: Create a CloudFront distribution

  • Type CloudFront in the search bar and click on the CloudFront service in the search results

image.png

  • Click on the Create Distribution button

image.png

  • Click on the Get started button

image.png

  • Select your S3 bucket

image.png

  • Select: Yes for Restrict Bucket Access, Create a New Identity for Origin Access Identity, Yes, Update Bucket Policy for Grant Read Permissions on Bucket, HTTP and HTTPS for Viewer Protocol Policy

image.png

  • Type "some comment" (optional) and click on the Create Distribution button

image.png

  • Go to the distributions list and copy the Domain Name

image.png

Then, you should add CloudFront distribution Domain Name to your Django and Serverless configurations directly or using environment variables (for example .env file)

AWS_S3_CDN_DOMAIN="<domain-id>.cloudfront.net"

Step 8: Create RDS

  • Type RDS in the search bar and click on the RDS service in the search results

image.png

  • Click on the Create database button

image.png

  • Select Standard create, PostgreSQL, and Version (in my example, it is PostgreSQL 12.5-R1)

image.png

  • Select Free Tier as a Template, fill in DB instance identifier, Master username, Master password, Confirm password

image.png

  • Select Burstable classes (includes t classes) and db.t2.micro for DB instance class, General Purpose (SSD) as Storage type, and 20 as Allocated storage, unselect Enable storage autoscaling

image.png

  • Skip the Availability & durability section

  • Configure Connectivity:

    • Select your default VPC as Virtual private cloud (VPC)

      After a database is created, you can't change the VPC selection.

    • Select default as Subnet group
    • Select Yes for Public access
    • Select Choose existing for VPC security group, and select default for Existing VPC security groups section
    • Select Availability Zone (in my example us-east-1a)

image.png

  • Select Password authentication or any other you want to use as Database authentication options, unselect all check boxes in Additional configuration and type Initial database name (in my example, it is django_aws)

image.png

image.png

  • Click on the Create database button

image.png

  • Go to the RDS dashboard and click on Databases in the RDS side bar or on DB instances

image.png

  • Click on the created database identifier

image.png

  • Copy the database endpoint, the subnets, and the security groups

image.png

Then, you should add this info to your Django and Serverless configurations directly or using environment variables (for example .env file)

DB_HOST='django-aws.<db-domain-id>.us-east-1.rds.amazonaws.com'
DB_USER='<your-master-db-user>'
DB_PASSWORD='<password-for-your-master-db-user>'
DB_NAME='<your-db-name>'
SECURITY_GROUPS=sg-<security-group-id>
SUBNETS=subnet-<subnet-id>,subnet-<subnet-id>,subnet-<subnet-id>,subnet-<subnet-id>,subnet-<subnet-id>,subnet-<subnet-id>

NOTE: This is just an example of AWS configuration I use in my example. You may use your own configuration.

Automate managing your AWS infrastructure

I showed you how to configure all the necessary AWS resources for a Django project manually using the AWS Management Console. There are some ways to automate this process. I'll show how to manage AWS resources using Terraform (infrastructure as code) in my next blog post. Follow me on Twitter @vadim_khodak or on LinkedIn so you do not miss the next posts.