Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

32 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

πŸš€ Flask DevOps Pipeline β€” Docker | Kubernetes | CI/CD | AWS ECS | Terraform | Ansible | Monitoring

Docker Kubernetes GitHub Actions AWS Terraform Ansible Prometheus Grafana Python

A production-style DevOps project built from scratch β€” a Python Flask app containerized with Docker, orchestrated with Kubernetes, deployed to AWS ECS Fargate, with static files on S3, secure access via IAM roles, infrastructure provisioned using Terraform, server configuration automated with Ansible, and live metrics tracked via Prometheus + Grafana.


πŸ—οΈ Architecture

Developer (git push)
        β”‚
        β–Ό
GitHub Actions (CI/CD Pipeline)
        β”‚
        β”œβ”€β”€ Install dependencies
        β”œβ”€β”€ Build Docker image
        └── Push to Docker Hub
                β”‚
                β”œβ”€β”€β–Ί AWS ECS Fargate (Live Deployment)
                β”‚         β”œβ”€β”€ Pulls image from Docker Hub
                β”‚         β”œβ”€β”€ Runs Flask container (port 5000)
                β”‚         └── Serves static files from AWS S3
                β”‚                   └── IAM Role β†’ secure S3 access
                β”‚
                β”œβ”€β”€β–Ί Terraform β†’ Provisions EC2 + Security Group
                β”‚         └── Ansible β†’ Installs Docker + Deploys container
                β”‚
                └──► Prometheus + Grafana β†’ Live Monitoring Dashboard

πŸ› οΈ Tech Stack

Layer Technology
Application Python 3.10, Flask
Containerization Docker
Orchestration Kubernetes (Minikube)
CI/CD GitHub Actions
Container Registry Docker Hub
Cloud Deployment AWS ECS Fargate
Static Files AWS S3
Access Control AWS IAM Roles
Infrastructure as Code Terraform
Configuration Management Ansible
Monitoring Prometheus + Grafana

✨ Features

  • βœ… Flask app containerized with Docker
  • βœ… Kubernetes deployment with 2 replicas (local)
  • βœ… Automated CI/CD β€” every push triggers build & push to Docker Hub
  • βœ… Live deployment on AWS ECS Fargate
  • βœ… Static assets served from AWS S3
  • βœ… IAM role attached to ECS task for secure S3 access
  • βœ… EC2 + Security Group provisioned via Terraform (IaC)
  • βœ… Ansible playbook automates Docker install and container deployment
  • βœ… Prometheus + Grafana monitoring with live dashboards

πŸ“ Project Structure

β”œβ”€β”€ app/
β”‚   β”œβ”€β”€ app.py                  # Flask application with Prometheus metrics
β”‚   β”œβ”€β”€ requirements.txt        # Python dependencies
β”‚   └── Dockerfile              # Docker image definition
β”œβ”€β”€ k8s/
β”‚   β”œβ”€β”€ deployment.yaml         # Kubernetes deployment (2 replicas)
β”‚   └── service.yaml            # Kubernetes NodePort service
β”œβ”€β”€ terraform/
β”‚   β”œβ”€β”€ main.tf                 # EC2 + Security Group resources
β”‚   β”œβ”€β”€ variables.tf            # Input variables
β”‚   └── outputs.tf              # Output values (public IP)
β”œβ”€β”€ ansible/
β”‚   β”œβ”€β”€ inventory.ini           # Target hosts
β”‚   └── playbook.yml            # Automate Docker + container deployment
β”œβ”€β”€ monitoring/
β”‚   └── prometheus.yml          # Prometheus scrape config
β”œβ”€β”€ docker-compose.yml          # Flask + Prometheus + Grafana stack
β”œβ”€β”€ .github/
β”‚   └── workflows/
β”‚       └── ci.yml              # GitHub Actions CI/CD pipeline
└── README.md

βš™οΈ CI/CD Pipeline

Triggered automatically on every push to main:

git push β†’ Install deps β†’ Build Docker image β†’ Push to Docker Hub

Secrets required in GitHub β†’ Settings β†’ Actions:

Secret Value
DOCKER_USERNAME Docker Hub username
DOCKER_PASSWORD Docker Hub access token

🐳 Docker

cd app
docker build -t sna-app .
docker run -p 5000:5000 sna-app

Visit: http://localhost:5000

Live image: docker.io/syedmaaz001/sna-app:latest


☸️ Kubernetes (Local)

minikube start
kubectl apply -f k8s/deployment.yaml
kubectl apply -f k8s/service.yaml
minikube service sna-service

☁️ AWS ECS Fargate Deployment

Service Purpose
ECS Fargate Serverless container hosting
ECR Private Docker image registry
S3 (sna-static-files) Static file storage
IAM (sna-ecs-s3-role) Secure S3 read access for ECS
Security Group Allow inbound traffic on port 5000

πŸ—οΈ Terraform (Infrastructure as Code)

cd terraform
terraform init
terraform plan
terraform apply
terraform destroy  # cleanup when done

What Terraform creates:

  • EC2 instance (t3.micro) with Docker pre-installed
  • Security Group allowing port 5000 and SSH
  • Auto-pulls Docker image and starts Flask app via user_data

πŸ€– Ansible (Configuration Management)

cd ansible
ansible-galaxy collection install community.docker
ansible-playbook -i inventory.ini playbook.yml --ask-become-pass

What Ansible automates:

  • Installs Docker and dependencies
  • Starts Docker service
  • Pulls Flask image from Docker Hub
  • Runs container with auto-restart policy

πŸ“Š Monitoring β€” Prometheus + Grafana

docker compose up --build
Service URL
Flask App http://localhost:5000
Prometheus http://localhost:9090
Grafana http://localhost:3000 (admin/admin)

Metrics tracked:

  • flask_http_request_total β€” total requests by endpoint and status
  • flask_http_request_duration_seconds β€” response latency

πŸ“Έ Screenshots

Ansible Playbook β€” Successful Run

Ansible

Grafana β€” Request Latency Dashboard

Grafana Latency

Grafana β€” Total Flask Requests

Grafana Requests

Prometheus β€” Flask Target UP

Prometheus


πŸš€ Quick Start

git clone https://github.com/MaazAhmed47/devops-flask-aws.git
cd devops-flask-aws
cd app
docker build -t sna-app .
docker run -p 5000:5000 sna-app

πŸ‘¨β€πŸ’» Author

Syed Maaz Ahmed β€” IT Student, SSUET Karachi, Pakistan

LinkedIn GitHub

About

Flask app deployed using Docker and Kubernetes (Minikube)

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages