About Me
Hi, I'm Charles Cunningham Jr.
Projects
Azure Serverless Portfolio & DevOps Pipeline
Deployed an Azure Serverless Portfolio & DevOps Pipeline. Built as a capstone to the Cloud Resume Challenge, this project is a production-grade, end-to-end serverless application hosted on Azure. The architecture features a static website—developed with HTML/CSS and hosted via Azure Storage—and a global delivery layer managed through Azure Front Door for high availability and HTTPS security. The backend utilizes a Python-based Azure Function API that securely interacts with a Cosmos DB NoSQL database to manage real-time visitor tracking. To ensure code reliability, I implemented unit testing using Pytest to validate logic before deployment.
Moving beyond manual configuration, I managed the entire environment as Infrastructure as Code (IaC) using Terraform. I refactored initial resource exports into a modular, multi-folder structure that separates two resource groups, utilizing variables for enhanced security and portability. To enable a professional DevOps workflow, I migrated the Terraform state from a local environment to a Remote Backend in Azure Blob Storage. This centralized the "source of truth," ensuring that my local development environment in VS Code stays perfectly synced with Azure. Currently, I use GitHub Actions to automate the deployment of my application code, ensuring that every push from VS Code is seamlessly updated in the live environment, while maintaining a stable, "zero-drift" infrastructure through controlled Terraform updates.
To align with industry best practices, I refactored my infrastructure from a flat structure into two distinct logical layers: a Frontend tier for static assets and a Backend tier for API logic and data. By moving the Azure Cosmos DB into the same Resource Group as the Azure Function, I created a cohesive "Data & Logic" service boundary that simplified IAM (Identity and Access Management) and improved overall manageability. Since moving resources in the Azure Portal creates "state drift" in Terraform, I executed a complex State Migration Workflow to prevent data loss; this involved using terraform state rm to release the database from the Frontend state and terraform import to re-parent the account, SQL containers, and RBAC roles into the Backend module. Despite shell-specific path conversion challenges in Git Bash, I successfully achieved a 100% stable, zero-downtime migration that preserved all existing visitor data while establishing a professional, service-oriented architecture.
Click for more detailsFrom Local Flask App to Docker Compose on Ubuntu VM
Successfully migrated a local Python Flask application to a production-ready, containerized environment hosted on an Ubuntu VM. This project serves as a comprehensive exploration of the modern DevOps lifecycle—transitioning a simple development script into a scalable, orchestrated service. I containerized the application using Docker, ensuring environment parity across development and production, and utilized Docker Compose to manage multi-container orchestration. This setup allowed for seamless management of the application service alongside its dependencies, providing a robust foundation for automated deployment.
Moving beyond basic containerization, I focused on the practical challenges of remote deployment and infrastructure management. I provisioned and configured a Linux-based Ubuntu VM, managing the server environment through SSH and implementing security best practices to protect the exposed application. A core theme of this journey was "AI collaboration"; I leveraged LLMs to troubleshoot complex networking hurdles, optimize my Dockerfiles, and streamline the debugging process. This collaborative approach allowed me to rapidly iterate through configuration errors—specifically surrounding port mapping and service connectivity—resulting in a highly efficient development workflow that bridges the gap between manual coding and AI-assisted systems engineering.
To ensure the deployment was both resilient and maintainable, I implemented a structured workflow for environment variables and persistent storage. By decoupling the application logic from the underlying infrastructure, I created a portable architecture that can be easily replicated or scaled. This project marks a significant milestone in my transition toward Cloud Engineering, demonstrating my ability to navigate the complexities of Linux administration, container orchestration, and the integration of AI tools to solve real-world architectural challenges.
Click for more detailsPhase 2: Local to Cloud Migration - Auto-Scaling Flask APP with Terraform & Docker
In Phase 2, I evolved the project from a single-point-of-failure VM into a highly available, distributed architecture on AWS. This phase focused on transitioning from manual server management to Infrastructure as Code (IaC), using Terraform to architect a production-grade environment. By defining the entire stack—including a custom VPC, multi-AZ subnets, and an Application Load Balancer (ALB). I shifted the focus from merely "running an app" to "orchestrating a resilient system."
A key achievement of this phase was the implementation of a sophisticated deployment pipeline. I moved to a registry-based workflow by pushing versioned images to Docker Hub and utilizing Docker Compose with production-specific overrides. To bridge the gap between infrastructure and software, I utilized EC2 User Data scripts to automate the "Day 0" operations: updating the OS, installing the Docker engine, and pulling containers upon instance launch. This ensures that every server in the Auto Scaling Group is an identical, disposable unit, eliminating "configuration drift."
Technical Milestones & Resilience
- Infrastructure as Code: Provisioned 13+ interconnected resources (IGW, Route Tables, Security Groups) using modular Terraform code.
- Elasticity: Configured a Launch Template and Auto Scaling Group to maintain a desired state of two EC2 instances, ensuring the app stays online even if a data center or instance fails.
- Network Security: Implemented a secure networking layer where the application remains in private-facing subnets, accessible only through a managed ALB.
- Standardized Deployment: Integrated the AWS CLI for secure credential management and SSH key pair automation, streamlining the transition from local development to cloud-scale deployment.
This milestone represents a pivot from traditional sysadmin tasks to Cloud Engineering. It demonstrates my ability to build self-healing infrastructure that decouples application logic from hardware, providing a professional, DNS-accessible entry point for users while maintaining a robust, automated backend.
Click for more detailsProfessional
I transitioned into IT about 4 years ago and have since worked as a MSP technician, an IT Analyst and a Project Engineer. Skilled in Infrastructure-as-Code (IaC), containerization (Docker, Kubernetes), CI/CD, and cloud migrations. Experienced in optimizing infrastructure costs and improving system performance. Certified in Azure and continuously expanding expertise in AWS, scripting, monitoring, and DevOps best practices. I am always eager to adopt new technologies and contribute to innovative cloud solutions.
Leisure
When I’m not labbing, I prioritize staying active and spending time with my family. I’m a firm believer in continuous learning, whether it's mastering a new scripting language or exploring a new culture. My wife, Jackie, and I share a passion for travel; our annual adventures have taken us from the historical streets of France to the coasts of Mexico and the Dominican Republic. In the summer, you’ll likely find me at a pool, playing badminton or enjoying a long walk with friends and family.