Deploying a Django REST API on AWS EC2 is essential for businesses and developers looking to scale applications efficiently. This guide covers the entire deployment process, from local development to a fully operational cloud-based solution using AWS EC2.

Why Deploy Django REST API on AWS EC2?

Amazon Web Services (AWS) EC2 offers a powerful, scalable, and cost-effective environment for hosting Django REST applications. With flexible compute capacity and integrated security features, EC2 ensures high availability and seamless performance.

Prerequisites

  • An AWS account
  • Basic knowledge of Django and REST framework
  • Installed Python and Django on the local machine
  • SSH client (e.g., PuTTY or Terminal)

Step 1: Setting Up an AWS EC2 Instance

  1. Login to AWS – Navigate to the AWS EC2 dashboard.
  2. Launch a New Instance – Select an Amazon Machine Image (AMI) such as Ubuntu.
  3. Choose an Instance Type – t2.micro is ideal for small applications.
  4. Configure Security Group – Allow inbound HTTP, HTTPS, and SSH connections.
  5. Generate and Download Key Pair – Save the .pem file securely for SSH access.
  6. Launch the Instance – Start the server and obtain its public IP address.

Step 2: Connecting to the EC2 Instance

Using SSH, connect to the instance with the following command:

ssh -i your-key.pem ubuntu@your-ec2-public-ip

Once connected, update and install required packages:

sudo apt update && sudo apt upgrade -y

sudo apt install python3-pip python3-venv nginx -y

Step 3: Deploying the Django REST API

1. Transfer Project Files to EC2

Use scp or Git to transfer Django project files to the server.

scp -i your-key.pem -r /local/path/to/django ubuntu@your-ec2-public-ip:/home/ubuntu/

Alternatively, clone the repository:

git clone https://github.com/your-repo.git

2. Setting Up a Virtual Environment

cd your-django-project

python3 -m venv venv

source venv/bin/activate

pip install -r requirements.txt

3. Configure Django Settings

Edit settings.py to allow external access:

ALLOWED_HOSTS = [‘your-ec2-public-ip’, ‘your-domain.com’]

Run database migrations:

python manage.py migrate

Step 4: Setting Up Gunicorn and Supervisor

Install Gunicorn:

pip install gunicorn

Test the application with:

gunicorn –bind 0.0.0.0:8000 your_project.wsgi:application

Configure Supervisor to manage Gunicorn:

sudo apt install supervisor -y

sudo nano /etc/supervisor/conf.d/django.conf

Add the following:

[program:django]

command=/home/ubuntu/your-django-project/venv/bin/gunicorn –workers 3 –bind unix:/home/ubuntu/your-django-project/django.sock your_project.wsgi:application

directory=/home/ubuntu/your-django-project

autostart=true

autorestart=true

stderr_logfile=/var/log/django.err.log

stdout_logfile=/var/log/django.out.log

Restart Supervisor:

sudo supervisorctl reread

sudo supervisorctl update

sudo supervisorctl start django

Step 5: Configuring Nginx as a Reverse Proxy

Create an Nginx configuration file:

sudo nano /etc/nginx/sites-available/django

Add the following:

server {

    listen 80;

    server_name your-ec2-public-ip;

    location / {

        include proxy_params;

        proxy_pass http://unix:/home/ubuntu/your-django-project/django.sock;

    }

}

Enable the Nginx configuration:

sudo ln -s /etc/nginx/sites-available/django /etc/nginx/sites-enabled

sudo systemctl restart nginx

Allow HTTP traffic:

sudo ufw allow ‘Nginx Full’

Step 6: Setting Up a Domain and SSL (Optional but Recommended)

For a custom domain, update DNS records to point to the EC2 IP address. To enable HTTPS using Let’s Encrypt:

sudo apt install certbot python3-certbot-nginx -y

sudo certbot –nginx -d yourdomain.com -d www.yourdomain.com

Final Testing and Deployment

Access the Django REST API from the browser using the EC2 public IP or domain:

http://your-ec2-public-ip

Check for errors using logs:

sudo journalctl -u nginx –no-pager -n 50

sudo journalctl -u supervisor –no-pager -n 50

Conclusion

Deploying a Django REST API on AWS EC2 provides a scalable and reliable hosting solution. With proper configuration of Gunicorn, Supervisor, and Nginx, applications can run securely and efficiently. Implementing HTTPS further enhances security and trustworthiness.