Skip to content

its-tapas/buddydome

Repository files navigation

buddydome

newlogo

Highly Available Django Application implemented using Blue/Green deployment on AWS Elastic Beanstalk resulting in a seamless deployment process and enabling cloud enthusiasts to share and access learning resources.

Technology: AWS, Django, HTML/CSS, JavaScript, PostgreSQL

Major AWS Services used :-

  • RDS
  • S3
  • ELASTICBEANSTALK
  • ROUTE53

Step-1: Create an AWS database instance of postgreSql database ( Compulsory in both )

    -Login to AWS console and head toward for RDS Service
    -Launch an Postgresql Database instance and note down the username,master username and password of the instance ( it will be shown one time only so make sure to note them down very carefully)
    -Wait for the database instance to be in running state ( Takes approximately 10 min)
    -After Launched, click on the instance and it will show the details of your database
    -Open Django project's Settings.py file, there you will see a section "DATABASE" IN LINE 85 
          >>> Change name to the username to saved earlier
          >>> Change Username to master username
          >>> Change Password to new Password
          >>> Change Host to new host which is shown exactly on aws console database instance page
    -SAVE CHANGES

Step-2: (Follow only if you are working with BuddyDome with s3 only otherwise ignore this step) Setting up S3 bucket

Create an s3 bucket ( with unchecking the box of " Block all public access" )
Change the bucket policy as follows
//S3 Policy//

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AddPerm",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::s3-bucket/*"
        }
    ]
} 

Create an IAM user

        >>>In AWS Look for IAM service 
        >>>Create an IAM user with S3 Policy
        >>>Generate Access key and secret key and note them down

Go to your Django project and first install two libraries using following command

         pip install boto3 django-storages

Add Following in settings.py file

          import boto3
          from storages.backends.s3boto3 import S3Boto3Storage


          INSTALLED_APPS = [ 
                  'storages'
                  ]

          //Write Corresponding Values//
          AWS_ACCESS_KEY_ID =
          AWS_SECRET_ACCESS_KEY = 
          AWS_STORAGE_BUCKET_NAME = 
          AWS_S3_REGION_NAME='ap-south-1'

          AWS_QUERYSTRING_AUTH = False


          # Set the static files storage backend to S3
          STATICFILES_STORAGE = "storages.backends.s3boto3.S3Boto3Storage"

          # Set the URL for static files
          STATIC_URL = f"https://{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com/static/"

          AWS_LOCATION = 'media'

          DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

          # Set the URL for media files
          MEDIA_URL = f"https://{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com/{AWS_LOCATION}/"

          STATIC_ROOT = "https://s3.amazonaws.com/my-static-bucket/"
          MEDIA_ROOT = "https://s3.amazonaws.com/my-media-bucket/"

Some Changes in all urls.py file
//urls.py//

          from Buddy import settings
          from django.conf.urls.static import static

//In URL_patterns ending Square bracket Add below code as it is//

           +static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Step-3: Deployment Using AWS Elastic Beanstalk( Compulsory in Both)

Install Elastic Beanstalk CLI using following:-

     pip install awsebcli

Create a Config file to speicify settings file and .conf file to specify upload limit for your elasticbeasntalk environment in following format

    ~/BuddyDome/
    |-- .ebextensions
    |   `-- django.config
    |-- .platform
    |   --nginx
    |        --conf.d
    |                `--proxy.conf

Write the following in django.config file

    container_commands:
      01_collectstatic:
        command: "source $PYTHONPATH/activate && python manage.py collectstatic --noinput"
    option_settings:
      aws:elasticbeanstalk:container:python:
        WSGIPath: Buddy.wsgi:application
      aws:elasticbeanstalk:environment:proxy:staticfiles:
        static: "static"

Write the Following in proxy.conf

    client_max_body_size 400M;        

In terminal initialize the application for elasticbeanstalk using awsebcli
Make sure you are in main directory where you can access manage.py file ( Use dir or ls command to verify)

    eb init -i

    Select a default region 
    (Default is 3): 6  

    application name: Buddydome

    Enter Application Name
    (default is "BuddyDome "): BuddyDome

    Select a platform
    (make a selection): 9       //Python

    Select a platform branch. 3

In Terminal Create Elastic beanstalk environment:-

    eb create Buddydome-env

use the following to get the status and to open the deployed application:-

    eb status
    eb open

Use the following only in case you make some changes after environment creation

    eb deploy

Step-4 : Setting Up DNS (Route53 and Hostinger)

  1. Go to Route53 and create a "Hosted Zone" with corresponding Hostinger domain name ( e.g. buddydome.cloud)
  2. Change Hostinger Nameservers to Route53 Generated Nameservers (changes might take upto 24hr)
  3. In Hosted Zone, create a "A" type Record
    • Leave Subdomain as blank
    • Toggle "Alias"
    • In Endpoint, choose Alias to "Elastic Beanstalk environment"
    • CHoose Corresponding Region, ap-south-1 "Asia Pacific (Mumbai)"
    • Choose Environment, select the corresponding elasticbeanstalk environment that directs to Buddydome Project

    • Click "Add another record"
    • > > Write "www" in subdomain
    • > > Choose Type as "CNAME"
    • > > In Value write original domain i.e. buddydome.cloud

    • Click "Create Records"


With this your application has been successfully deployed and hosted with a Domain

About

Highly Available Django Application deployed using AWS Elastic Beanstalk, EC2, RDS, S3 Bucket and Route53

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published