Strata-Ops is a complete, production-grade DevSecOps engineering journey β documenting the full transformation of a 5-tier Java application from a local Vagrant setup into a hardened, auto-scaling Kubernetes platform on AWS EKS, with GitOps delivery, OIDC authentication, multi-layer security scanning, and zero manual steps.
Like the geological layers of the Earth, each phase builds on the previous one. This README reads top-down β starting from the most advanced production system and descending through every architectural layer to the original foundation.
- What is Strata-Ops?
- The Application β VProfile
- The Geological Model β Phase Overview
- DevSecOps at Every Layer
- Phase 6.1 β Production EKS + GitOps + OIDC
- Phase 5.2 β Helm Packaging & Templating
- Phase 5.1 β Self-Managed Kubernetes on EC2
- Phase 4.2 β ECS Fargate + Datadog APM
- Phase 4.1 β Docker Compose + Ansible
- Phase 3 β AWS Cloud-Native PaaS + DevSecOps
- Phase 2 β AWS Lift & Shift + CI/CD + Monitoring
- Phase 1 β Local Foundation
- Evolution Metrics
- Repository Structure
Strata-Ops is not a tutorial. It is a fully deployable, living architecture portfolio β every phase is real infrastructure code you can terraform apply and git push to production today.
- 8 complete phases, each fully self-contained and production-deployable
- Zero hardcoded credentials across the entire repository β SSM, OIDC, and Secrets Manager handle everything
- Shift-left DevSecOps integrated from Phase 2 onward: SAST, container scanning, IaC security, dependency CVE analysis
- Three CI/CD systems covered in depth: Jenkins with JCasC, AWS CodePipeline, and GitHub Actions with OIDC
- Full observability stack per phase: Prometheus/Grafana β CloudWatch β Datadog APM with distributed tracing and JVM metrics
- Infrastructure as Code throughout β Terraform provisions every AWS resource, Ansible handles configuration, Helm packages every Kubernetes workload
A 5-tier Java application that runs consistently across every phase, from local VMs to managed EKS:
ββββββββββββββββββββββββββββββββββββββββββββββββ
β π Nginx (Web / Reverse Proxy) β :80
ββββββββββββββββββββββββ¬ββββββββββββββββββββββββ
β
ββββββββββββββββββββββββΌββββββββββββββββββββββββ
β β Tomcat (Java Application) β :8080
ββββββββββ¬ββββββββββββββ¬βββββββββββββββ¬ββββββββββ
β β β
ββββββΌβββββ ββββββΌβββββ ββββββΌβββββ
β MySQL β βMemcachedβ βRabbitMQ β
β :3306 β β :11211 β β :5672 β
βββββββββββ βββββββββββ βββββββββββ
The same application is deployed in every phase β what evolves is how it is provisioned, secured, deployed, and observed.
The project is structured like the Earth's layers: the deepest layer is the foundation you must understand first, but the outermost layer β Phase 6.1 β is where engineering excellence lives.
ββββββββββββββββββββββββββββββββββββββββββββββ
π Phase 6.1 β EKS + GitOps + OIDC β The Surface β Production Grade
ββββββββββββββββββββββββββββββββββββββββββββββ
πͺ¨ Phase 5.2 β Helm Packaging β Upper Crust
ββββββββββββββββββββββββββββββββββββββββββββββ
πͺ¨ Phase 5.1 β Self-Managed Kubernetes β Mid Crust
ββββββββββββββββββββββββββββββββββββββββββββββ
π₯ Phase 4.2 β ECS Fargate + Datadog APM β Lower Crust
ββββββββββββββββββββββββββββββββββββββββββββββ
π₯ Phase 4.1 β Docker Compose + Ansible β Upper Mantle
ββββββββββββββββββββββββββββββββββββββββββββββ
π Phase 3 β AWS Cloud-Native + CodePipeline β Lower Mantle
ββββββββββββββββββββββββββββββββββββββββββββββ
βοΈ Phase 2 β AWS Lift & Shift + Jenkins β Outer Core
ββββββββββββββββββββββββββββββββββββββββββββββ
βοΈ Phase 1 β Local VMs (Vagrant) β Inner Core β The Foundation
ββββββββββββββββββββββββββββββββββββββββββββββ
| Phase | Platform | CI/CD | Security | Observability | Deploy Time |
|---|---|---|---|---|---|
| 6.1 | AWS EKS | GitHub Actions + OIDC | Checkov + Kube-score + Trivy | CloudWatch | ~3 min |
| 5.2 | Minikube + Helm | Ansible | Helm RBAC + b64enc Secrets | Metrics Server | ~10 min |
| 5.1 | Self-Managed K8s | Ansible | Network Policies + initContainers | Metrics Server | ~25 min |
| 4.2 | ECS Fargate | GitHub Actions | Trivy + SARIF | Datadog APM | ~8 min |
| 4.1 | Docker Compose on EC2 | Ansible | Container Linting | Docker Stats | ~12 min |
| 3 | Elastic Beanstalk | AWS CodePipeline | TruffleHog + tfsec + SonarCloud | CloudWatch | ~15 min |
| 2 | EC2 (IaaS) | Jenkins + JCasC | OWASP + SAST + Quality Gates | Prometheus + Grafana | ~20 min |
| 1 | VirtualBox / Vagrant | Manual | SSH Keys | Log Files | 45β60 min |
Security is not an afterthought in Strata-Ops β it is architecturally enforced at each phase as a hard gate before deployment.
Phase 2 βββΊ OWASP Dependency Check + SonarQube SAST + Quality Gate (abort on fail)
Phase 3 βββΊ TruffleHog (secrets scan) + tfsec (IaC scan) + SonarCloud (24k lines)
Phase 4.2 βββΊ Trivy FS Scan + Trivy Config Scan + Trivy Image Scan + SARIF β GitHub Security
Phase 6.1 βββΊ Checkov (Terraform + Helm) + Kube-score (manifests) + Trivy (image) + OIDC Auth
Zero long-lived credentials anywhere:
- Phase 2β3: AWS SSM Parameter Store with least-privilege IAM Instance Profiles
- Phase 4.2β6.1: GitHub Actions OIDC β temporary tokens per job, zero stored keys
Secret management progression:
- Phase 2:
random_passwordβ SSM SecureString β EC2 user-data polling loop - Phase 3: SSM auto-generated on
terraform apply, injected at pipeline runtime - Phase 4.2: SSM + ECS task environment injection
- Phase 6.1: OIDC + IRSA (IAM Roles for Service Accounts) β per-pod permissions
The pinnacle of the journey. One
git pushtriggers a 3-job pipeline that scans infrastructure, builds and scans the container, and deploys to a multi-AZ EKS cluster β with zero stored AWS credentials, zero manual steps, and full GitHub Security integration.
π Full Phase 6.1 Documentation β
Production EKS architecture β GitHub Actions OIDC pipeline, ECR, EKS cluster with ALB Ingress Controller, and the full 5-tier application stack
git push β main
β
βΌ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β JOB 1 β Infrastructure & Manifest Security Scan β
β βββ Checkov β scans Terraform + Helm charts β
β βββ Kube-score β validates K8s manifest best practicesβ
βββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββ
βΌ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β JOB 2 β Build, Scan & Push to ECR β
β βββ AWS credentials via OIDC (no stored keys) β
β βββ Multi-stage Docker build β
β βββ Trivy image scan β SARIF β GitHub Security tab β
β βββ Push image tagged with git SHA (immutable) β
βββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββ
βΌ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β JOB 3 β Helm Deploy to EKS β
β βββ OIDC β aws eks update-kubeconfig β
β βββ helm upgrade --install vproapp β
β βββ Wait for deployment stability (5m timeout) β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
{
"Condition": {
"StringEquals": {
"token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
},
"StringLike": {
"token.actions.githubusercontent.com:sub": "repo:amramer101/Strata-Ops:*"
}
}
}GitHub Actions requests temporary STS credentials per job. No AWS_ACCESS_KEY_ID stored anywhere. Credentials expire the moment the job completes.
| Feature | Detail |
|---|---|
| EKS Version | 1.29, multi-AZ control plane |
| Security Scanners | 3 β Checkov, Kube-score, Trivy |
| Image Tagging | Git SHA (immutable in ECR) |
| Ingress | AWS ALB Ingress Controller (IP target type) |
| Autoscaling | Node group: 2β4 nodes (Cluster Autoscaler) |
| Manual Steps | 0 β full GitOps |
| Hardcoded Credentials | 0 β OIDC + IRSA |
| Deployment Time | ~3 minutes end-to-end |
Same Kubernetes cluster, zero hardcoding. The entire 5-tier application is packaged into a single Helm chart with all configuration centralized in one
values.yaml.
π Full Phase 5.2 Documentation β
Phase 5.1 β kubectl apply -f kubernetes/ (12 static YAML files, hardcoded values)
Phase 5.2 β helm upgrade --install eprofile (1 chart, 1 values.yaml, full templating)
The echo -n | base64 corruption bug that broke MySQL auth in Phase 5.1 is eliminated entirely:
# templates/db-secrets.yaml
data:
root-password: {{ .Values.db.rootPassword | b64enc | quote }}
username: {{ .Values.db.username | b64enc | quote }}
password: {{ .Values.db.password | b64enc | quote }}Plain text in values.yaml, correctly encoded at render time β no manual base64, no newline corruption.
eprofile-chart/
βββ Chart.yaml
βββ values.yaml β single source of truth
βββ templates/
βββ db-pv.yaml / db-pvc.yaml / db-secrets.yaml / db-statefulset.yaml
βββ rabbitmq-deployment.yaml / rabbitmq-service.yaml
βββ memcached-deployment.yaml / memcached-service.yaml
βββ tomcat-deployment.yaml / tomcat-service.yaml
βββ ingress.yaml
No EKS. No managed control plane. A real Kubernetes cluster running on a single EC2 instance β fully provisioned by Terraform, fully configured by Ansible, with persistent MySQL storage backed by a real EBS volume.
π Full Phase 5.1 Documentation β
Full self-managed Kubernetes architecture β IaC layer, EC2 + EBS, Minikube cluster, all K8s workloads, and persistent storage chain
terraform apply β EC2 + EBS + VPC + SG + auto-generates ansible/inventory.ini
β
βΌ
ansible-playbook β Docker β Minikube β kubectl β all manifests β systemd port-forward service
β
βΌ
kubectl get pods β All 4 pods Running 1/1, 0 restarts
EBS Volume (2GiB) attached as /dev/sdh
βββ Nitro NVMe rename β /dev/nvme1n1
βββ Ansible formats + mounts β /mnt/vprofile-db
βββ K8s PersistentVolume (storageClass: manual, Retain policy)
βββ PVC β MySQL StatefulSet β /var/lib/mysql
| Problem | Root Cause | Solution |
|---|---|---|
| EBS not found | Nitro NVMe renames /dev/sdh β nvme1n1 |
Hardcoded correct kernel name |
| MySQL auth failure | echo | base64 appends \n |
Always echo -n |
| Docker group not applying | Group change needs new session | meta: reset_connection in Ansible |
| Port-forward dies on disconnect | Foreground process | Registered as systemd service |
| App crashes before DB ready | Race condition | initContainers with nc probes |
| Ansible runs twice, reformats EBS | Not idempotent | filesystem module handles it natively |
Containerized. Serverless. Fully observed. The application runs on ECS Fargate with a 6-stage GitHub Actions pipeline β Trivy scanning at both code and image level, GitHub Advanced Security integration, and Datadog APM with distributed tracing, JVM metrics, and log routing via Firelens.
π Full Phase 4.2 Documentation β
ECS Fargate architecture β VPC, ALB, private subnets, managed data services, and the full Datadog observability sidecar pattern
6-stage GitHub Actions pipeline β 8m 45s from git push to live ECS deployment with full security scanning
git push β main
β
βββ 1. Get SSM Params 15s β ECR, ECS names pulled at runtime (zero hardcoding)
βββ 2. Trivy Code + Config 1m11s β FS scan + Dockerfile/Terraform misconfiguration scan
βββ 3. Docker Build 1m44s β Multi-stage (Maven β Tomcat + Datadog Java agent)
βββ 4. Trivy Image Scan 54s β Full image layer CVE scan β SARIF β GitHub Security
βββ 5. Push to ECR 45s β Tagged with git SHA + latest
βββ 6. Deploy to ECS 3m26s β Force new deployment + wait-for-service-stability
Scan 1: trivy fs . β pom.xml, Maven dependencies, Java CVEs
Scan 2: trivy config . β Dockerfile misconfigs, Terraform security issues
Scan 3: trivy image <ecr-image> β OS packages, all image layers
All results β SARIF β GitHub Advanced Security tab with full CVE traceability.
ECS Fargate Task (1024 CPU / 2048 MB)
βββ datadog-log-router (64 CPU / 128 MB) β Fluent Bit: routes stdout β Datadog Logs
βββ datadog-agent (256 CPU / 512 MB) β Collects infrastructure metrics + APM traces
βββ vproapp (512 CPU / 1024 MB) β Tomcat + Datadog Java agent (unix socket APM)
Shared dd-sockets volume allows APM traces to flow via unix socket β faster and more reliable than network.
| Signal | Tool | What is Captured |
|---|---|---|
| APM Traces | Datadog Agent (unix socket) | Every HTTP request end-to-end, p95 latency, error rate |
| JVM Metrics | Datadog Java Agent | Heap, Non-Heap, GC Old/New Gen, Thread count, Classes loaded |
| Logs | Firelens (Fluent Bit) | Structured container stdout β Datadog Logs Explorer |
| Infrastructure | Datadog Agent | CPU, Memory, Network per container |
The first containerization layer. Five services, two Docker networks, two persistent volumes β deployed to a fresh AWS EC2 instance with zero manual SSH. Ansible automates everything after Terraform provisions the instance.
π Full Phase 4.1 Documentation β
Full infrastructure view β developer machine through Terraform, Ansible automation, and the Docker Compose stack running on EC2
docker-compose.yml β Development: builds images from source (requires source code)
docker-compose.prod.yml β Production: pulls pre-built images from Docker Hub β
(Ansible ships this file only β zero source code on server)
1. Update APT + install dependencies
2. Add Docker GPG key
3. Add Docker APT repository
4. Install docker-ce + docker-compose-plugin
5. Add ubuntu user to docker group
6. Copy docker-stack/ folder to EC2
7. docker compose -f docker-compose.prod.yml up -dTerraform writes the EC2 IP directly into ansible/inventory.ini via local_file β zero manual edits between terraform apply and ansible-playbook.
vproapp:
depends_on:
vprodb: { condition: service_healthy } # mysqladmin ping
vprocache01: { condition: service_healthy } # bash /dev/tcp probe (no nc binary)
vpromq01: { condition: service_healthy } # rabbitmq-diagnostics pingNotable fix: Memcached's minimal Alpine image has no nc binary. Pure bash TCP probe used instead:
test: ["CMD-SHELL", "bash -c '</dev/tcp/127.0.0.1/11211' || exit 1"]| Metric | Value |
|---|---|
| EC2 Instances | 1 (vs 5 in Phase 2) |
| Monthly Cost | ~$20 (1Γ t2.medium) |
| Manual SSH Required | Zero |
| Ansible Result | ok=8 changed=7 failed=0 |
One
terraform apply. Elastic Beanstalk, RDS, ElastiCache, Amazon MQ, AWS CodePipeline β and three independent security gates standing between code and production. Zero hardcoded credentials. KMS-encrypted secrets generated at apply time.
π Full Phase 3 Documentation β
Cloud-native PaaS architecture β CodePipeline with 3 security gates, Elastic Beanstalk auto-scaling group, and all managed data services in private subnets
Eprofile-VPC (10.0.0.0/16) across 3 Availability Zones β 3 public + 3 private subnets, all backend services unreachable from internet
git push
β
βΌ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β SECURITY STAGE (CodeBuild) β
β β
β GATE 1: TruffleHog ββ 507 chunks scanned, 0 verified secrets β
β
β β β
β GATE 2: tfsec ββ Scans ./terraform/ for HIGH findings β οΈ loggedβ
β β β
β GATE 3: SonarCloud ββ 24,000 lines analyzed, Quality Gate API β
β β β
ββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββ
β All gates pass
βΌ
BUILD β DEPLOY (Elastic Beanstalk, 74 seconds)
All Maven dependencies are proxied through a private CodeArtifact repository β builds are faster and independent of Maven Central availability. Authentication uses short-lived IAM tokens, never stored credentials.
/strata-ops/mysql-password β random_password (Terraform), KMS-encrypted
/strata-ops/rabbitmq-password β random_password (Terraform), KMS-encrypted
/strata-ops/sonar-token β injected at pipeline runtime only
/strata-ops/sonar-org β String
/strata-ops/sonar-project β String
Terraform provisions 67 AWS resources in ~12 minutes. terraform destroy removes everything cleanly.
The first cloud phase. Ten EC2 instances, a complete Jenkins CI/CD pipeline with security scanning and quality gates, Prometheus + Grafana observability β all provisioned by Terraform and configured by EC2 user-data scripts coordinated through SSM Parameter Store.
π Full Phase 2 Documentation β
AWS Lift & Shift architecture β 3 independent layers: Application Tier, CI/CD Pipeline, and Observability, wired through Route53 Private DNS and SSM Parameter Store
ββββββββββ βββββββββ ββββββββ ββββββββββββββββ
β Test ββββΆβ OWASP ββββΆβ SAST ββββΆβ Quality Gate β
β mvn β β Dep. β βSonar β β abortPipelineβ
β test β β Check β βQube β β on failure β
ββββββββββ βββββββββ ββββββββ ββββββββ¬ββββββββ
β PASS only
βΌ
βββββββββββ ββββββββββββββββ ββββββββββββββ
β Package βββΆβ Nexus Upload βββΆβ SSH Deploy ββββΆ Slack
β .war β β versioned by β β to Tomcat β
βββββββββββ β BUILD_ID β ββββββββββββββ
ββββββββββββββββ
Quality Gate is a hard gate β abortPipeline: true prevents any deployment from code that does not pass SonarQube's quality bar.
Jenkins is never configured manually. The entire state lives in jenkins.yaml committed to Git:
- Users, credentials, tool installations
- Pipeline definitions
- SonarQube and Slack integrations
- SSH keys fetched from SSM and appended to YAML before start
wait_for_ssm_param() {
while true; do
VAL=$(aws ssm get-parameter --name "$1" --with-decryption ...)
if [[ "$VAL" != "pending" && -n "$VAL" ]]; then echo "$VAL" && break; fi
sleep 10
done
}
NEXUS_PASS=$(wait_for_ssm_param "/strata-ops/nexus-password")
SONAR_TOK=$(wait_for_ssm_param "/strata-ops/sonar-token")Jenkins polls SSM until Nexus and SonarQube have written their real values. SSM becomes the coordination bus for the entire boot sequence across 10 instances.
All internal services use hostnames, never IP addresses. If the MySQL server is replaced and gets a new IP, only the Route53 A record changes β Tomcat config is untouched.
| DNS Record | Service | Port |
|---|---|---|
app01.eprofile.in |
Tomcat | 8080 |
db01.eprofile.in |
MySQL | 3306 |
jenkins.eprofile.in |
Jenkins | 8080 |
nexus.eprofile.in |
Nexus | 8081 |
sonarqube.eprofile.in |
SonarQube | 9000 |
Prometheus scrapes Node Exporter on port 9100 from all 5 application servers every 15 seconds. The Node Exporter Security Group only accepts traffic from the Prometheus Security Group β no other source can query metrics. Grafana's Prometheus datasource is provisioned automatically on first boot via YAML β no manual "Add datasource" step.
Where it all begins. No automation, no shortcuts β manual provisioning of all 5 services across 5 Vagrant VMs. Understanding every command, every configuration, and every connection by hand is the prerequisite that makes every subsequent phase meaningful.
1οΈβ£ MySQL (db01) β Database foundation
2οΈβ£ Memcached (mc01) β Caching layer
3οΈβ£ RabbitMQ (rmq01) β Message broker
4οΈβ£ Tomcat (app01) β Application server
5οΈβ£ Nginx (web01) β Frontend gateway (last β depends on everything above)
The automated Vagrantfile (1.2) runs all 5 provisioning scripts on vagrant up, cutting setup from 45β60 minutes to 10β15 minutes while teaching IaC principles.
- Service dependencies and initialization order
- Manual firewall rules and network configuration
- Database schema initialization
- Reverse proxy configuration
- The debugging skills that save you when automation fails
Phase 1 (Manual) ββββββββββββββββββββββββββββββββββββββββ 45β60 min
Phase 2 (Jenkins) ββββββββββββββββββββ ~20 min
Phase 3 (CodePipeline)ββββββββββββββββ ~15 min
Phase 4.1 (Ansible) ββββββββββββ ~12 min
Phase 4.2 (ECS) ββββββββ ~8 min
Phase 5.1 (K8s Manual) βββββββββββββββββββββββββ ~25 min
Phase 5.2 (Helm) ββββββββββ ~10 min
Phase 6.1 (EKS+GitOps) βββ ~3 min β
| Phase | Manual Steps | Automation Level |
|---|---|---|
| 1 | 15+ | 0% β fully manual |
| 2 | 8 | ~40% β IaC + scripts |
| 3 | 5 | ~70% β managed services |
| 4.1 | 2 | ~85% β Ansible-driven |
| 4.2 | 2 | ~95% β CI/CD-driven |
| 5.1 | 4 | ~75% β K8s learning overhead |
| 5.2 | 2 | ~90% β Helm-templated |
| 6.1 | 0 | 100% β Full GitOps |
| Phase | Secrets | Scanning | Auth |
|---|---|---|---|
| 1 | Hardcoded | None | SSH Keys |
| 2 | SSM SecureString | OWASP + SonarQube | IAM Instance Profile |
| 3 | SSM + KMS | TruffleHog + tfsec + SonarCloud | IAM + CodeBuild Role |
| 4.2 | SSM + ECS Secrets | Trivy Γ 3 + SARIF | GitHub Secrets |
| 6.1 | IRSA + OIDC | Checkov + Kube-score + Trivy + SARIF | OIDC per-job |
Strata-Ops/
β
βββ README.md β You are here
β
βββ 1.1-Local-Setup-Manual/
β βββ README.md
β βββ Vagrantfile
β
βββ 1.2-Local-Setup-Automated-Vagrand/
β βββ README.md
β βββ Vagrantfile
β βββ mysql.sh / memcache.sh / rabbitmq.sh
β βββ tomcat_ubuntu.sh / nginx.sh
β βββ application.properties
β
βββ 2-AWS-Lift-Shift-with-CICD-Monitoring/
β βββ README.md
β βββ Jenkinsfile
β βββ terraform/
β β βββ main.tf / vpc.tf / secgrp.tf / iam.tf / ssm.tf
β β βββ templates/
β βββ userdata-EC2/
β βββ jenkins.sh / jenkins.yaml
β βββ nexus.sh / sonar.sh
β βββ tomcat_ubuntu.sh / nginx.sh
β βββ mysql.sh / rabbitmq.sh / memcache.sh
β βββ setup-prometheus.sh
β
βββ 3-AWS-Cloud-Native-with-DevSecOps/
β βββ README.md
β βββ buildspec-build.yml / buildspec-sec.yml
β βββ terraform/
β βββ vpc.tf / secgrp.tf / SSM.tf
β βββ Data-services.tf / bean-env.tf
β βββ CodeArtifact.tf / code-build.tf / code-pipline.tf
β βββ cloudwatch.tf
β
βββ 4.1-Docker-Compose-Lift-Shift-with-Ansible/
β βββ README.md
β βββ terraform/
β βββ ansible/
β β βββ playbook.yml
β β βββ inventory.ini β auto-generated by Terraform
β βββ docker-stack/
β βββ Docker-files/
β β βββ db/Dockerfile
β β βββ nginx/Dockerfile
β β βββ tomcat/Dockerfile β multi-stage build
β βββ docker-compose.yml
β βββ docker-compose.prod.yml
β
βββ 4.2-Docker-Cloud-Native-Serverless-with-Datadog/
β βββ README.md
β βββ Dockerfile-with-Datadog β production: includes Datadog Java APM agent
β βββ terraform/
β β βββ ECS.tf / ALB.tf / ECR.tf
β β βββ Data-services.tf / IAM.tf / SSM.tf
β β βββ templates/bastion-init.sh
β βββ .github/workflows/
β βββ docker-image.yml
β
βββ 5.1-Self-Managed-Kubernetes-on-EC2/
β βββ README.md
β βββ terraform/
β β βββ vpc.tf / ec2.tf / ebs.tf / secgrp.tf
β βββ ansible/
β β βββ playbook.yml
β β βββ inventory.ini β auto-generated by Terraform
β βββ kubernetes/
β βββ db/ β PV, PVC, Secret, StatefulSet, Service
β βββ mq/ β Secret, Deployment, Service
β βββ cache/ β Deployment, Service
β βββ app/ β Deployment (+ initContainers), Service
β βββ ingress/
β
βββ 5.2-Application-Packaging-and-Templating-with-Helm/
β βββ README.md
β βββ terraform/
β βββ ansible/
β βββ eprofile-chart/
β βββ Chart.yaml / values.yaml / .helmignore
β βββ templates/ β 13 templated manifests
β
βββ 6.1-EKS-Provisioning-with-Push-Based-CICD/
β βββ README.md
β βββ terraform/
β β βββ eks.tf / iam.tf / oidc.tf
β β βββ ecr.tf / alb.tf / vpc.tf
β β βββ variables.tf / output.tf
β βββ eprofile-chart/
β βββ Chart.yaml / values.yaml
β βββ templates/
β βββ deployment.yaml / service.yaml / ingress.yaml
β βββ configmap.yaml / serviceaccount.yaml
β βββ _helpers.tpl
β
βββ .github/
β βββ workflows/
β βββ 4.2-ECS-CICD.yml
β βββ 6.1-EKS-CICD.yml
β
βββ media/
βββ Lift-shift/ β Phase 2 diagrams
βββ cloud-native/ β Phase 3 diagrams
βββ Docker-compose/ β Phase 4.1 diagrams
βββ Docker-ECS/ β Phase 4.2 diagrams
βββ k8s/ β Phase 5.1 diagrams
βββ EKS/ β Phase 6.1 diagrams
| Category | Technologies |
|---|---|
| Cloud | AWS (EC2, EKS, ECS Fargate, RDS, ElastiCache, Amazon MQ, Beanstalk, Route53, SSM, ALB) |
| IaC | Terraform (v1.6+), Vagrant |
| Configuration | Ansible, EC2 user-data scripts |
| Containers | Docker (multi-stage builds), Docker Compose |
| Orchestration | Kubernetes (Minikube + EKS v1.29), Helm v3 |
| CI/CD | Jenkins (JCasC), AWS CodePipeline, GitHub Actions |
| Security | Trivy, Checkov, Kube-score, TruffleHog, tfsec, SonarQube, SonarCloud, OWASP |
| Auth & Secrets | OIDC, IRSA, AWS SSM Parameter Store, AWS Secrets Manager |
| Observability | Prometheus, Grafana, CloudWatch, Datadog APM, Fluent Bit / Firelens |
| Artifact Management | Nexus, AWS CodeArtifact, Amazon ECR |
| Networking | VPC, Security Groups, Route53 Private DNS, ALB, NAT Gateway |
| Application | Java (Spring MVC), Tomcat 10, Maven, MySQL, Memcached, RabbitMQ, Nginx |
π Built layer by layer by Amr Medhat Amer β Cloud & DevSecOps Engineer
One codebase. Eight architectural layers. Zero shortcuts.