🚀 DevOps & Cloud Blogs by HARSHHAA
158 |Discover high-quality insights on DevOps, Cloud, and Automation.
159 |Follow me on Hashnode:
160 | 164 | Read My Blogs 165 | 166 |├── appspec.yml ├── scripts ├── validate_deployment.sh ├── install_nginx.sh ├── start_nginx.sh └── validate_environment.sh ├── README.md └── index.html /appspec.yml: -------------------------------------------------------------------------------- 1 | # AWS CodeDeploy Application Specification 2 | # This file defines the deployment configuration for the DevOps blog application 3 | version: 0.0 4 | os: linux 5 | 6 | # Define files to be deployed 7 | files: 8 | - source: / 9 | destination: /var/www/html 10 | owner: root 11 | group: root 12 | mode: 755 13 | 14 | # Set proper permissions for web content 15 | permissions: 16 | - object: /var/www/html 17 | pattern: "**" 18 | owner: www-data 19 | group: www-data 20 | mode: 755 21 | 22 | # Deployment lifecycle hooks 23 | hooks: 24 | # Pre-deployment validation 25 | BeforeInstall: 26 | - location: scripts/validate_environment.sh 27 | timeout: 300 28 | runas: root 29 | runorder: 1 30 | 31 | # Install and configure Nginx 32 | AfterInstall: 33 | - location: scripts/install_nginx.sh 34 | timeout: 300 35 | runas: root 36 | runorder: 1 37 | 38 | # Start the application 39 | ApplicationStart: 40 | - location: scripts/start_nginx.sh 41 | timeout: 300 42 | runas: root 43 | runorder: 1 44 | 45 | # Optional: Add validation after deployment 46 | AfterStart: 47 | - location: scripts/validate_deployment.sh 48 | timeout: 60 49 | runas: root 50 | runorder: 1 51 | -------------------------------------------------------------------------------- /scripts/validate_deployment.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Deployment validation script 4 | # This script validates that the deployment was successful 5 | 6 | set -e # Exit immediately on error 7 | set -o pipefail # Fail on first command error in a pipeline 8 | 9 | echo "=== DEPLOYMENT VALIDATION STARTED ===" 10 | 11 | # Check if Nginx is running 12 | echo "Checking Nginx service status..." 13 | if systemctl is-active --quiet nginx; then 14 | echo "✅ Nginx is running" 15 | else 16 | echo "❌ Nginx is not running!" 17 | exit 1 18 | fi 19 | 20 | # Check if index.html exists and is accessible 21 | echo "Validating web content..." 22 | if [ -f /var/www/html/index.html ]; then 23 | echo "✅ index.html exists" 24 | else 25 | echo "❌ index.html not found!" 26 | exit 1 27 | fi 28 | 29 | # Test HTTP response 30 | echo "Testing HTTP response..." 31 | HTTP_STATUS=$(curl -s -o /dev/null -w "%{http_code}" http://localhost) 32 | if [ "$HTTP_STATUS" = "200" ]; then 33 | echo "✅ HTTP 200 response received" 34 | else 35 | echo "❌ HTTP $HTTP_STATUS response received" 36 | exit 1 37 | fi 38 | 39 | # Test content delivery 40 | echo "Testing content delivery..." 41 | if curl -s http://localhost | grep -q ""; then 42 | echo "✅ HTML content is being served correctly" 43 | else 44 | echo "❌ HTML content is not being served correctly" 45 | exit 1 46 | fi 47 | 48 | # Check file permissions 49 | echo "Checking file permissions..." 50 | if [ -r /var/www/html/index.html ]; then 51 | echo "✅ index.html is readable" 52 | else 53 | echo "❌ index.html is not readable" 54 | exit 1 55 | fi 56 | 57 | echo "✅ Deployment validation completed successfully!" 58 | echo "=== DEPLOYMENT VALIDATION COMPLETED ===" 59 | -------------------------------------------------------------------------------- /scripts/install_nginx.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Nginx Installation Script 4 | # This script installs and configures Nginx for the DevOps blog application 5 | 6 | set -e # Exit on error 7 | set -o pipefail # Fail pipeline if any command fails 8 | 9 | # Configuration variables 10 | NGINX_VERSION="nginx" 11 | LOG_FILE="/var/log/nginx-install.log" 12 | 13 | # Function to log messages with timestamp 14 | log_message() { 15 | echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE" 16 | } 17 | 18 | # Function to check if Nginx is installed 19 | is_nginx_installed() { 20 | dpkg -l | grep -qw nginx 21 | } 22 | 23 | # Function to check system requirements 24 | check_system_requirements() { 25 | log_message "Checking system requirements..." 26 | 27 | # Check available disk space (minimum 100MB) 28 | AVAILABLE_SPACE=$(df / | tail -1 | awk '{print $4}') 29 | if [[ $AVAILABLE_SPACE -lt 100000 ]]; then 30 | log_message "❌ Error: Insufficient disk space (minimum 100MB required)" 31 | exit 1 32 | fi 33 | 34 | # Check if running on supported OS 35 | if ! command -v apt-get &> /dev/null; then 36 | log_message "❌ Error: This script requires a Debian/Ubuntu-based system" 37 | exit 1 38 | fi 39 | 40 | log_message "✅ System requirements check passed" 41 | } 42 | 43 | # Function to install Nginx 44 | install_nginx() { 45 | log_message "=== NGINX INSTALLATION STARTED ===" 46 | 47 | # Update package lists 48 | log_message "Updating package lists..." 49 | sudo apt-get update -y 50 | 51 | # Install Nginx if not already installed 52 | if is_nginx_installed; then 53 | log_message "✅ Nginx is already installed" 54 | nginx -v 55 | else 56 | log_message "Installing Nginx..." 57 | sudo apt-get install -y nginx 58 | 59 | # Verify installation 60 | if is_nginx_installed; then 61 | log_message "✅ Nginx installed successfully" 62 | nginx -v 63 | else 64 | log_message "❌ Error: Nginx installation failed" 65 | exit 1 66 | fi 67 | fi 68 | } 69 | 70 | # Function to configure and start Nginx 71 | configure_nginx() { 72 | log_message "Configuring Nginx..." 73 | 74 | # Enable Nginx service 75 | sudo systemctl enable nginx 76 | 77 | # Start Nginx service 78 | log_message "Starting Nginx service..." 79 | sudo systemctl start nginx 80 | 81 | # Wait for service to start 82 | sleep 2 83 | 84 | # Check Nginx status 85 | if systemctl is-active --quiet nginx; then 86 | log_message "✅ Nginx is running successfully" 87 | else 88 | log_message "❌ Error: Nginx failed to start" 89 | log_message "Checking Nginx status:" 90 | sudo systemctl status nginx --no-pager 91 | exit 1 92 | fi 93 | } 94 | 95 | # Function to validate Nginx configuration 96 | validate_nginx_config() { 97 | log_message "Validating Nginx configuration..." 98 | 99 | if sudo nginx -t; then 100 | log_message "✅ Nginx configuration is valid" 101 | else 102 | log_message "❌ Error: Nginx configuration is invalid" 103 | exit 1 104 | fi 105 | } 106 | 107 | # Main execution 108 | main() { 109 | log_message "=== NGINX INSTALLATION SCRIPT STARTED ===" 110 | 111 | check_system_requirements 112 | install_nginx 113 | validate_nginx_config 114 | configure_nginx 115 | 116 | log_message "✅ Nginx installation and configuration completed successfully!" 117 | log_message "=== NGINX INSTALLATION SCRIPT COMPLETED ===" 118 | } 119 | 120 | # Run main function 121 | main "$@" 122 | -------------------------------------------------------------------------------- /scripts/start_nginx.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Nginx Start Script 4 | # This script starts and configures Nginx for the DevOps blog application 5 | 6 | set -e # Exit immediately if a command fails 7 | set -o pipefail # Fail on first command error in a pipeline 8 | 9 | # Configuration variables 10 | LOG_FILE="/var/log/nginx-start.log" 11 | MAX_RETRIES=3 12 | RETRY_DELAY=2 13 | 14 | # Function to log messages with timestamp 15 | log_message() { 16 | echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE" 17 | } 18 | 19 | # Function to check if Nginx is installed 20 | check_nginx_installation() { 21 | log_message "Checking Nginx installation..." 22 | 23 | if ! command -v nginx &>/dev/null; then 24 | log_message "❌ Error: Nginx is not installed. Please install it first." 25 | exit 1 26 | fi 27 | 28 | log_message "✅ Nginx is installed: $(nginx -v 2>&1)" 29 | } 30 | 31 | # Function to validate Nginx configuration 32 | validate_nginx_config() { 33 | log_message "Validating Nginx configuration..." 34 | 35 | if sudo nginx -t; then 36 | log_message "✅ Nginx configuration is valid" 37 | else 38 | log_message "❌ Error: Nginx configuration is invalid" 39 | log_message "Configuration test output:" 40 | sudo nginx -t 2>&1 | tee -a "$LOG_FILE" 41 | exit 1 42 | fi 43 | } 44 | 45 | # Function to start Nginx with retry logic 46 | start_nginx_service() { 47 | log_message "Starting Nginx service..." 48 | 49 | # Enable Nginx to start on boot 50 | sudo systemctl enable nginx 51 | 52 | # Start Nginx service with retry logic 53 | for attempt in $(seq 1 $MAX_RETRIES); do 54 | log_message "Attempt $attempt/$MAX_RETRIES: Starting Nginx..." 55 | 56 | if sudo systemctl start nginx; then 57 | log_message "✅ Nginx start command executed successfully" 58 | break 59 | else 60 | log_message "⚠️ Nginx start attempt $attempt failed" 61 | if [ $attempt -eq $MAX_RETRIES ]; then 62 | log_message "❌ Error: Failed to start Nginx after $MAX_RETRIES attempts" 63 | exit 1 64 | fi 65 | sleep $RETRY_DELAY 66 | fi 67 | done 68 | } 69 | 70 | # Function to verify Nginx is running 71 | verify_nginx_running() { 72 | log_message "Verifying Nginx is running..." 73 | 74 | # Wait for service to fully start 75 | sleep 2 76 | 77 | # Check if Nginx is active 78 | if systemctl is-active --quiet nginx; then 79 | log_message "✅ Nginx is running successfully" 80 | else 81 | log_message "❌ Error: Nginx is not running" 82 | log_message "Nginx status:" 83 | sudo systemctl status nginx --no-pager | tee -a "$LOG_FILE" 84 | exit 1 85 | fi 86 | 87 | # Check if Nginx is listening on port 80 88 | if netstat -tlnp | grep -q ":80 "; then 89 | log_message "✅ Nginx is listening on port 80" 90 | else 91 | log_message "⚠️ Warning: Nginx may not be listening on port 80" 92 | fi 93 | } 94 | 95 | # Function to test HTTP response 96 | test_http_response() { 97 | log_message "Testing HTTP response..." 98 | 99 | # Wait a bit more for Nginx to be fully ready 100 | sleep 3 101 | 102 | # Test HTTP response 103 | if curl -s -f http://localhost > /dev/null; then 104 | log_message "✅ HTTP response test passed" 105 | else 106 | log_message "⚠️ Warning: HTTP response test failed (this may be normal if no content is deployed yet)" 107 | fi 108 | } 109 | 110 | # Function to display Nginx status 111 | display_nginx_status() { 112 | log_message "=== NGINX STATUS SUMMARY ===" 113 | log_message "Service Status: $(systemctl is-active nginx)" 114 | log_message "Service State: $(systemctl is-enabled nginx)" 115 | log_message "Process Info:" 116 | ps aux | grep nginx | grep -v grep | tee -a "$LOG_FILE" 117 | log_message "Port Status:" 118 | netstat -tlnp | grep nginx | tee -a "$LOG_FILE" 119 | } 120 | 121 | # Main execution 122 | main() { 123 | log_message "=== NGINX START SCRIPT STARTED ===" 124 | 125 | check_nginx_installation 126 | validate_nginx_config 127 | start_nginx_service 128 | verify_nginx_running 129 | test_http_response 130 | display_nginx_status 131 | 132 | log_message "✅ Nginx started successfully!" 133 | log_message "=== NGINX START SCRIPT COMPLETED ===" 134 | } 135 | 136 | # Run main function 137 | main "$@" 138 | -------------------------------------------------------------------------------- /scripts/validate_environment.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Environment Validation Script 4 | # This script validates the system environment before deployment 5 | 6 | set -e # Exit immediately on error 7 | set -o pipefail # Fail on first command error in a pipeline 8 | 9 | # Configuration variables 10 | LOG_FILE="/var/log/environment-validation.log" 11 | MIN_DISK_SPACE=500000 # 500MB in KB 12 | MIN_MEMORY=512 # 512MB in MB 13 | REQUIRED_PACKAGES=("curl" "tar" "wget" "unzip") 14 | 15 | # Function to log messages with timestamp 16 | log_message() { 17 | echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE" 18 | } 19 | 20 | # Function to check if running as root 21 | check_root_privileges() { 22 | log_message "Checking root privileges..." 23 | 24 | if [[ $EUID -ne 0 ]]; then 25 | log_message "❌ Error: This script must be run as root. Use sudo." 26 | exit 1 27 | fi 28 | 29 | log_message "✅ Running with root privileges" 30 | } 31 | 32 | # Function to check system information 33 | check_system_info() { 34 | log_message "=== SYSTEM INFORMATION ===" 35 | log_message "OS: $(lsb_release -d 2>/dev/null | cut -f2 || echo 'Unknown')" 36 | log_message "Kernel: $(uname -r)" 37 | log_message "Architecture: $(uname -m)" 38 | log_message "Hostname: $(hostname)" 39 | log_message "Uptime: $(uptime -p 2>/dev/null || uptime)" 40 | } 41 | 42 | # Function to check disk space 43 | check_disk_space() { 44 | log_message "Checking disk space..." 45 | 46 | # Get available disk space in KB 47 | AVAILABLE_SPACE=$(df / | tail -1 | awk '{print $4}') 48 | AVAILABLE_SPACE_MB=$((AVAILABLE_SPACE / 1024)) 49 | 50 | log_message "Available disk space: ${AVAILABLE_SPACE_MB}MB" 51 | 52 | if [[ $AVAILABLE_SPACE -lt $MIN_DISK_SPACE ]]; then 53 | log_message "❌ Error: Insufficient disk space (${AVAILABLE_SPACE_MB}MB available, ${MIN_DISK_SPACE}MB required)" 54 | exit 1 55 | fi 56 | 57 | log_message "✅ Sufficient disk space available" 58 | } 59 | 60 | # Function to check memory 61 | check_memory() { 62 | log_message "Checking system memory..." 63 | 64 | # Get available memory in MB 65 | AVAILABLE_MEMORY=$(free -m | awk 'NR==2{printf "%.0f", $7}') 66 | 67 | log_message "Available memory: ${AVAILABLE_MEMORY}MB" 68 | 69 | if [[ $AVAILABLE_MEMORY -lt $MIN_MEMORY ]]; then 70 | log_message "⚠️ Warning: Low memory (${AVAILABLE_MEMORY}MB available, ${MIN_MEMORY}MB recommended)" 71 | else 72 | log_message "✅ Sufficient memory available" 73 | fi 74 | } 75 | 76 | # Function to check required packages 77 | check_required_packages() { 78 | log_message "Checking required packages..." 79 | 80 | MISSING_PACKAGES=() 81 | 82 | for pkg in "${REQUIRED_PACKAGES[@]}"; do 83 | if ! dpkg -l | grep -qw "$pkg"; then 84 | MISSING_PACKAGES+=("$pkg") 85 | else 86 | log_message "✅ Package '$pkg' is installed" 87 | fi 88 | done 89 | 90 | if [ ${#MISSING_PACKAGES[@]} -gt 0 ]; then 91 | log_message "❌ Error: Missing required packages: ${MISSING_PACKAGES[*]}" 92 | log_message "Please install missing packages with: sudo apt-get install ${MISSING_PACKAGES[*]}" 93 | exit 1 94 | fi 95 | 96 | log_message "✅ All required packages are installed" 97 | } 98 | 99 | # Function to check network connectivity 100 | check_network_connectivity() { 101 | log_message "Checking network connectivity..." 102 | 103 | # Test internet connectivity 104 | if ping -c 1 8.8.8.8 > /dev/null 2>&1; then 105 | log_message "✅ Internet connectivity is available" 106 | else 107 | log_message "⚠️ Warning: Internet connectivity may be limited" 108 | fi 109 | 110 | # Test DNS resolution 111 | if nslookup google.com > /dev/null 2>&1; then 112 | log_message "✅ DNS resolution is working" 113 | else 114 | log_message "⚠️ Warning: DNS resolution may have issues" 115 | fi 116 | } 117 | 118 | # Function to check system services 119 | check_system_services() { 120 | log_message "Checking system services..." 121 | 122 | # Check if systemd is running 123 | if systemctl --version > /dev/null 2>&1; then 124 | log_message "✅ systemd is available" 125 | else 126 | log_message "❌ Error: systemd is not available" 127 | exit 1 128 | fi 129 | 130 | # Check if apt is available 131 | if command -v apt-get > /dev/null 2>&1; then 132 | log_message "✅ Package manager (apt) is available" 133 | else 134 | log_message "❌ Error: Package manager (apt) is not available" 135 | exit 1 136 | fi 137 | } 138 | 139 | # Function to check file system permissions 140 | check_file_permissions() { 141 | log_message "Checking file system permissions..." 142 | 143 | # Check if we can write to /var/www/html 144 | if [ -d "/var/www/html" ]; then 145 | if [ -w "/var/www/html" ]; then 146 | log_message "✅ /var/www/html is writable" 147 | else 148 | log_message "⚠️ Warning: /var/www/html is not writable" 149 | fi 150 | else 151 | log_message "ℹ️ /var/www/html directory does not exist (will be created during deployment)" 152 | fi 153 | } 154 | 155 | # Function to display validation summary 156 | display_validation_summary() { 157 | log_message "=== VALIDATION SUMMARY ===" 158 | log_message "✅ Root privileges: OK" 159 | log_message "✅ Disk space: OK" 160 | log_message "✅ Required packages: OK" 161 | log_message "✅ System services: OK" 162 | log_message "✅ Environment validation completed successfully!" 163 | } 164 | 165 | # Main execution 166 | main() { 167 | log_message "=== ENVIRONMENT VALIDATION STARTED ===" 168 | 169 | check_root_privileges 170 | check_system_info 171 | check_disk_space 172 | check_memory 173 | check_required_packages 174 | check_network_connectivity 175 | check_system_services 176 | check_file_permissions 177 | display_validation_summary 178 | 179 | log_message "=== ENVIRONMENT VALIDATION COMPLETED ===" 180 | } 181 | 182 | # Run main function 183 | main "$@" 184 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 🚀 AWS DevOps Real-Time Deployment | Dev → Pre-PROD → Production 2 | 3 |  4 |  5 |  6 |  7 | 8 |  9 | 10 | ## 📌 Overview 11 | 12 | This repository demonstrates a **real-time AWS DevOps deployment pipeline** designed to streamline application releases across three environments: 13 | 14 | - **Development (Dev)** – Continuous integration and testing 15 | - **Pre-Production (Pre-PROD)** – Staging for validation and QA 16 | - **Production** – Final deployment for end users 17 | 18 | By leveraging AWS services and modern DevOps tools, this setup ensures a seamless, automated, and scalable CI/CD workflow. 19 | 20 | --- 21 | 22 | ## 🏗️ Features & Tech Stack 23 | 24 | ### 🚀 **Core Technologies** 25 | ✅ **Infrastructure as Code (IaC)** – Terraform & AWS CloudFormation 26 | ✅ **Version Control & Source Code Management** – GitHub/Azure DevOps 27 | ✅ **CI/CD Pipeline** – AWS CodePipeline & Jenkins 28 | ✅ **Containerization & Orchestration** – Docker & Kubernetes (EKS) 29 | ✅ **Monitoring & Logging** – AWS CloudWatch & Prometheus 30 | ✅ **Security & Compliance** – IAM, AWS Secrets Manager, and best DevSecOps practices 31 | 32 | ### 📋 **Project Structure** 33 | ``` 34 | ├── appspec.yml # AWS CodeDeploy application specification 35 | ├── buildspec.yml # AWS CodeBuild build specification 36 | ├── index.html # Main application file 37 | ├── scripts/ 38 | │ ├── install_nginx.sh # Nginx installation script 39 | │ ├── start_nginx.sh # Nginx startup script 40 | │ ├── validate_environment.sh # Environment validation 41 | │ └── validate_deployment.sh # Deployment validation 42 | └── README.md # Project documentation 43 | ``` 44 | 45 | ### 🔧 **Scripts Overview** 46 | - **`validate_environment.sh`** - Pre-deployment system validation 47 | - **`install_nginx.sh`** - Automated Nginx installation and configuration 48 | - **`start_nginx.sh`** - Nginx service management with retry logic 49 | - **`validate_deployment.sh`** - Post-deployment verification 50 | 51 | This project is designed to enhance agility, reduce manual interventions, and ensure reliable software delivery. 52 | 53 | --- 54 | 55 | ## 🚀 Quick Start 56 | 57 | ### Prerequisites 58 | - AWS Account with appropriate permissions 59 | - AWS CLI configured 60 | - Git installed 61 | - Basic understanding of DevOps concepts 62 | 63 | ### Deployment Steps 64 | 1. **Clone the repository** 65 | ```bash 66 | git clone https://github.com/NotHarshhaa/AWS-DevOps_Real-Time_Deployment.git 67 | cd AWS-DevOps_Real-Time_Deployment 68 | ``` 69 | 70 | 2. **Configure AWS CodeDeploy** 71 | - Set up CodeDeploy application 72 | - Configure deployment groups 73 | - Update `appspec.yml` if needed 74 | 75 | 3. **Deploy the application** 76 | - Trigger deployment through AWS Console 77 | - Monitor deployment logs 78 | - Verify application is running 79 | 80 | ### 🧪 **Testing** 81 | The deployment includes comprehensive testing: 82 | - Environment validation 83 | - Service health checks 84 | - HTTP response testing 85 | - Content delivery verification 86 | 87 | --- 88 | 89 | ## 📖 Step-by-Step Guide 90 | 91 | For a complete walkthrough with **detailed screenshots**, visit the blog post: 92 | 📌 [AWS DevOps Real-Time Deployment – Full Guide](https://blog.prodevopsguytech.com/aws-devops-real-time-deployment-dev-pre-prod-production) 93 | 94 | --- 95 | 96 | ## 🔍 **Monitoring & Logging** 97 | 98 | ### Log Files 99 | - `/var/log/nginx-install.log` - Nginx installation logs 100 | - `/var/log/nginx-start.log` - Nginx startup logs 101 | - `/var/log/environment-validation.log` - Environment validation logs 102 | 103 | ### Health Checks 104 | - Service status monitoring 105 | - HTTP response validation 106 | - Content delivery verification 107 | - System resource monitoring 108 | 109 | --- 110 | 111 | ## 🤝 Contributing 112 | 113 | We welcome contributions! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change. 114 | 115 | ### Development Guidelines 116 | 1. Fork the repository 117 | 2. Create a feature branch (`git checkout -b feature/AmazingFeature`) 118 | 3. Commit your changes (`git commit -m 'Add some AmazingFeature'`) 119 | 4. Push to the branch (`git push origin feature/AmazingFeature`) 120 | 5. Open a Pull Request 121 | 122 | --- 123 | 124 | ## 🛠️ Author & Credits 125 | 126 |  127 | 128 | This project is built and maintained by **[Harshhaa](https://github.com/NotHarshhaa)** 💡. 129 | Feel free to contribute, suggest improvements, or reach out for discussions! 130 | 131 | ### 📧 **Contact & Links** 132 | - **GitHub**: [@NotHarshhaa](https://github.com/NotHarshhaa) 133 | - **Blog**: [Hashnode](https://blog.prodevopsguy.xyz) 134 | - **LinkedIn**: [Connect with me](https://linkedin.com/in/harshhaa) 135 | 136 | ### 🔖 **License** 137 | This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details. 138 | 139 | --- 140 | 141 | ## 📊 **Project Stats** 142 | 143 |  144 |  145 |  146 |  147 | 148 | --- 149 | 150 | ## 🙏 **Acknowledgments** 151 | 152 | - AWS for providing excellent cloud services 153 | - The DevOps community for continuous learning and support 154 | - All contributors who help improve this project 155 | 156 | --- 157 | 158 |
Discover high-quality insights on DevOps, Cloud, and Automation.
159 |Follow me on Hashnode:
160 | 164 | Read My Blogs 165 | 166 |