DEV Community

Achmad Dinofaldi Firmansyah
Achmad Dinofaldi Firmansyah

Posted on

3

Deploying a Flask Application on AWS EC2

In this blog post, we will walk through the process of deploying a Flask application on an AWS EC2 instance. We will cover each step from setting up the environment to configuring Nginx as a reverse proxy. By following these steps, you will be able to successfully deploy your Flask application and make it accessible to the outside world.

Step 1: Update the System

To ensure that our system has the latest package information, run the following command:

sudo apt-get update
Enter fullscreen mode Exit fullscreen mode

This command updates the package lists for upgrades and new installations.

Step 2: Install Python Virtual Environment

To create an isolated Python environment for our project, we need to install the python3-venv package. Execute the following command:

sudo apt-get install python3-venv
Enter fullscreen mode Exit fullscreen mode

Python virtual environments allow us to manage dependencies and isolate our project's environment from the system Python installation.

Step 3: Clone or Create the Project Directory

You have two options here. Either clone an existing project from GitHub using the git clone command, or create a new project directory using the mkdir command followed by the desired project name.

Step 4: Navigate to the Project Directory

Change your current working directory to the project directory using the cd command:

cd project_name
Enter fullscreen mode Exit fullscreen mode
Step 5: Create a Virtual Environment

Now, let's create a virtual environment for our project. Execute the following command:

python3 -m venv venv
Enter fullscreen mode Exit fullscreen mode

This command creates a virtual environment named "venv" inside your project directory.

Step 6: Activate the Virtual Environment

To activate the virtual environment, run the following command:

. venv/bin/activate
Enter fullscreen mode Exit fullscreen mode

Once activated, your command prompt will reflect the virtual environment's name.

Step 7: Install Flask and Dependencies

Next, we need to install Flask and any other project dependencies. Use either of the following commands:

pip install -r requirements.txt
Enter fullscreen mode Exit fullscreen mode

or

pip install Flask
Enter fullscreen mode Exit fullscreen mode

The first command is used if you have a requirements.txt file listing all the dependencies. The second command installs Flask directly.

Step 8: Run the Flask Application

To ensure everything is working correctly, run the Flask application using the following command:

python app.py
Enter fullscreen mode Exit fullscreen mode

This command starts the Flask development server, allowing you to test your application locally.

Step 9: Install Gunicorn

Gunicorn is a production-ready web server for running Flask applications. Install it using the following command:

pip install gunicorn
Enter fullscreen mode Exit fullscreen mode
Step 10: Run Gunicorn

To run your Flask application with Gunicorn, execute the following command:

gunicorn -b 0.0.0.0:8000 app:app
Enter fullscreen mode Exit fullscreen mode

This command starts Gunicorn, binding it to all available network interfaces on port 8000.

Step 11: Create a Systemd Service File

To run the Flask application as a service, create a systemd service file using the following command:

sudo nano /etc/systemd/system/project_name.service
Enter fullscreen mode Exit fullscreen mode
Step 12: Add Code to the Service File

Inside the service file, add the following code:

[Unit]
Description=Gunicorn instance for a simple app
After=network.target

[Service]
User=ubuntu
Group=www-data
WorkingDirectory=/home/ubuntu/project_name
ExecStart=/home/ubuntu/project_name/venv/bin/gunicorn -b localhost:8000 app:app
Restart=always

[Install]
WantedBy=multi-user.target
Enter fullscreen mode Exit fullscreen mode

This code specifies the service description, user, group, working directory, and the Gunicorn command to start the Flask application.

Step 13: Reload Systemd Daemon

After creating the service file, reload the systemd daemon to make it aware of the new service:

sudo systemctl daemon-reload
Enter fullscreen mode Exit fullscreen mode
Step 14: Start the Service

To start the Flask application service, run the following command:

sudo systemctl start project_name
Enter fullscreen mode Exit fullscreen mode
Step 15: Enable the Service on System Startup

To ensure that the Flask application service starts automatically on system boot, execute the following command:

sudo systemctl enable project_name
Enter fullscreen mode Exit fullscreen mode
Step 16: Test the Application

To verify if the Flask application is running correctly, use the curl command to send a request to the local server:

curl localhost:8000
Enter fullscreen mode Exit fullscreen mode

If everything is set up properly, you should see the response from your Flask application.

Step 17: Install Nginx

To set up Nginx as a reverse proxy, install it using the following command:

sudo apt-get install nginx
Enter fullscreen mode Exit fullscreen mode
Step 18: Start Nginx

To start the Nginx service, run the following command:

sudo systemctl start nginx
Enter fullscreen mode Exit fullscreen mode
Step 19: Enable Nginx on System Startup

To ensure that Nginx starts automatically on system boot, execute the following command:

sudo systemctl enable nginx
Enter fullscreen mode Exit fullscreen mode
Step 20: Configure Nginx

Open the Nginx configuration file using the nano editor:

sudo nano /etc/nginx/sites-available/default
Enter fullscreen mode Exit fullscreen mode
Step 21: Add Upstream and Proxy Pass

Add the following code at the top of the file, below the default comments:

upstream flaskhelloworld {
    server 127.0.0.1:8000;
}
Enter fullscreen mode Exit fullscreen mode
Step 22: Configure Proxy Pass

Inside the location / block, add the following code:

location / {
    proxy_pass http://project_name;
}
Enter fullscreen mode Exit fullscreen mode

This code sets up the reverse proxy to forward requests to the Gunicorn server running on port 8000.

Step 23: Restart Nginx

To apply the Nginx configuration changes, restart the Nginx service:

sudo systemctl restart nginx
Enter fullscreen mode Exit fullscreen mode

Congratulations! You have successfully deployed a Flask application on an AWS EC2 instance using Gunicorn and Nginx as a reverse proxy. Your Flask application is now accessible through the Nginx server, providing a robust and scalable setup for your application.

Heroku

This site is built on Heroku

Join the ranks of developers at Salesforce, Airbase, DEV, and more who deploy their mission critical applications on Heroku. Sign up today and launch your first app!

Get Started

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay