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:
- manually via the AWS console
- automatically using Terraform
- automatically using AWS SDK
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
Step 3: Select your region. In my case, it is US East (N. Virginia)us-east-1
Step 4: Update Security Group with rules for AWS RDS service (PostgreSQL)
- Type
EC2in the search bar and click on theEC2service in the search results
- Choose the
Security Groupsoption in theNetwork & Securitysection
- Click on your security group id
- Click on
Edit inbound rules
- Click on
Add rule. Then, select thePostgreSQLoption in theTypecolumn. Next, choose theAnywhereoption in theSourcecolumn. Finally, click on theSave rulesbutton
- Go to the
Outbound rulestab and add the same rules that were described in the previous section
Step 5: Create an IAM role
- Type
IAMin the search bar and click on theIAMservice in the search results
- Click on
Rolesin theIAMside bar or in theIAM dashboard
- Click on the
Create Rolebutton
- Select
AWS service,Lambda, and click on theNext: Permissionsbutton
- Type
Lambdain the search bar, select theAWSLambda_FullAccesspolicy, click on theNext: Tagsbutton
- Click on the
Next: Reviewbutton
- Type
Role name,Role description, and click on theCreate rolebutton
- Click on the created role name
- Click on the
Copy Role ARNbutton
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
S3in the search bar and click on theS3service in the search results
- Click on the
Create bucketbutton
- Type
Bucket name, select yourAWS region, unselectBlock all public accessand click on theCreate bucketbutton
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
CloudFrontin the search bar and click on theCloudFrontservice in the search results
- Click on the
Create Distributionbutton
- Click on the
Get startedbutton
- Select your
S3 bucket
- Select:
YesforRestrict Bucket Access,Create a New IdentityforOrigin Access Identity,Yes, Update Bucket PolicyforGrant Read Permissions on Bucket,HTTP and HTTPSforViewer Protocol Policy
- Type "some comment" (optional) and click on the
Create Distributionbutton
- Go to the distributions list and copy the
Domain Name
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
RDSin the search bar and click on theRDSservice in the search results
- Click on the
Create databasebutton
- Select
Standard create,PostgreSQL, andVersion(in my example, it is PostgreSQL 12.5-R1)
- Select
Free Tieras aTemplate, fill inDB instance identifier,Master username,Master password,Confirm password
- Select
Burstable classes (includes t classes)anddb.t2.microforDB instance class,General Purpose (SSD)asStorage type, and20asAllocated storage, unselectEnable storage autoscaling
Skip the
Availability & durabilitysection-
Configure
Connectivity:- Select your default VPC as
Virtual private cloud (VPC)> After a database is created, you can't change the VPC selection. - Select
defaultasSubnet group - Select
YesforPublic access - Select
Choose existingforVPC security group, and selectdefaultforExisting VPC security groupssection - Select
Availability Zone(in my exampleus-east-1a)
- Select your default VPC as
- Select
Password authenticationor any other you want to use asDatabase authentication options, unselect all check boxes inAdditional configurationand typeInitial database name(in my example, it isdjango_aws)
- Click on the
Create databasebutton
- Go to the
RDSdashboard and click onDatabasesin theRDSside bar or onDB instances
- Click on the created database identifier
- Copy the database endpoint, the subnets, and the security groups
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.







































Top comments (1)
mate , i really appreciate the time and effort you have put in . very detailed and helpful