Проєкт розгортає контейнеризований Django-застосунок в AWS із використанням Terraform, Amazon EKS, Amazon ECR, Amazon RDS, Jenkins, Argo CD, Helm, Prometheus і Grafana.
Основний сценарій роботи:
GitHub
↓
Jenkins
↓
Kaniko build
↓
Amazon ECR
↓
оновлення Helm values
↓
Argo CD
↓
Amazon EKS
↓
Django + Amazon RDS PostgreSQL
Гілка розгортання:
final-project
AWS region:
us-west-2
Інфраструктура поділена на три рівні:
Створює backend для Terraform state:
- Amazon S3;
- DynamoDB table.
Створює:
- VPC;
- public і private subnets;
- Internet Gateway;
- NAT Gateway;
- Amazon EKS;
- managed node group;
- Amazon ECR;
- Amazon RDS PostgreSQL;
- IAM roles і security groups.
Встановлює в EKS:
- Jenkins;
- Argo CD;
- Prometheus;
- Grafana;
- Alertmanager;
- kube-state-metrics;
- node-exporter;
- metrics-server;
- Django Kubernetes Secret.
AWS
├── VPC
│ ├── Public subnets
│ └── Private subnets
├── EKS
│ ├── Jenkins
│ ├── Argo CD
│ ├── Django
│ └── Monitoring
├── ECR
└── RDS PostgreSQL
- Terraform;
- AWS CLI;
- Amazon EKS;
- Amazon ECR;
- Amazon RDS PostgreSQL;
- Kubernetes;
- Helm;
- Jenkins;
- Kaniko;
- Argo CD;
- Docker;
- Django;
- Gunicorn;
- Prometheus;
- Grafana.
Під час виконання використовувалися:
Terraform 1.15.8
AWS CLI 2.35.24
kubectl 1.36.1
Helm 4.2.3
Docker 29.6.1
.
├── app/ # Django application і Dockerfile
├── bootstrap/ # Terraform backend
├── charts/django-app/ # Helm chart
├── modules/
│ ├── argo_cd/
│ ├── ecr/
│ ├── eks/
│ ├── jenkins/
│ ├── monitoring/
│ ├── rds/
│ ├── s3-backend/
│ └── vpc/
├── platform/ # Jenkins, Argo CD і monitoring
├── docs/screenshots/ # Докази роботи
├── Jenkinsfile
├── main.tf
├── backend.tf
├── providers.tf
├── variables.tf
└── outputs.tf
Перед запуском потрібно налаштувати AWS CLI:
aws configureПеревірити активний AWS account:
aws sts get-caller-identityСтворити локальний файл:
terraform.tfvars
на основі:
terraform.tfvars.example
Після створення основної AWS-інфраструктури також потрібно створити:
platform/terraform.tfvars
на основі:
platform/terraform.tfvars.example
Локальні tfvars, Terraform state, .env, приватні ключі та архіви виключені з Git.
terraform -chdir=bootstrap init
terraform -chdir=bootstrap plan
terraform -chdir=bootstrap applyterraform init
terraform plan
terraform applyПісля створення EKS потрібно оновити kubeconfig:
aws eks update-kubeconfig \
--region us-west-2 \
--name devops-final-project-eksПеревірка:
kubectl get nodes
kubectl get pods -Aterraform -chdir=platform init
terraform -chdir=platform plan
terraform -chdir=platform applyDjango image базується на:
python:3.11-slim
Застосунок запускається через Gunicorn:
gunicorn config.wsgi:application
Основні Kubernetes-ресурси:
- Deployment;
- Service типу
LoadBalancer; - ConfigMap;
- Secret;
- HorizontalPodAutoscaler;
- migration Job.
Параметри HPA:
min replicas: 2
max replicas: 6
target CPU: 70%
Міграції запускаються як Argo CD PreSync hook:
python manage.py migrate --noinput
Django підключається до приватного Amazon RDS PostgreSQL.
Pipeline описаний у Jenkinsfile.
Jenkins виконує:
- checkout гілки
final-project; - формування image tag із короткого Git SHA;
- build Docker image через Kaniko;
- push image до Amazon ECR;
- оновлення
charts/django-app/values.yaml; - commit і push нового image tag.
Kaniko публікує:
<ECR_REPOSITORY>:<GIT_SHA>
<ECR_REPOSITORY>:latest
Argo CD відстежує:
repository: git@github.com:vmix-woolf/devops-final-project.git
revision: final-project
path: charts/django-app
Увімкнено:
automated:
prune: true
selfHeal: trueПісля зміни image tag Argo CD автоматично синхронізує Kubernetes Deployment.
Monitoring stack встановлений через kube-prometheus-stack.
Основні компоненти:
- Prometheus;
- Grafana;
- Alertmanager;
- kube-state-metrics;
- node-exporter.
Перевірялися:
- стан Prometheus targets;
- CPU і memory кластера;
- ресурси worker nodes;
- Django workload;
- кількість ready replicas;
- container restarts;
- реакція метрик на тестове навантаження;
- HPA.
Application-specific /metrics endpoint у Django не реалізований, тому monitoring зосереджений на Kubernetes і resource metrics.
Jenkins:
kubectl port-forward svc/jenkins 8080:8080 -n jenkinshttp://localhost:8080
Django:
kubectl port-forward svc/django-app 8000:80 -n django-apphttp://localhost:8000/admin/
Grafana:
kubectl port-forward svc/monitoring-grafana 3000:80 -n monitoringhttp://localhost:3000
Prometheus:
kubectl port-forward \
svc/monitoring-kube-prometheus-prometheus \
9090:9090 \
-n monitoringhttp://localhost:9090
Jenkins, Grafana і Prometheus мають тип ClusterIP, тому вони не відкриті безпосередньо в Internet.
Основні команди:
kubectl get pods -A
kubectl get all -n django-app
kubectl get hpa -n django-app
kubectl top pods -n django-appArgo CD:
kubectl get application django-app -n argocd \
-o custom-columns='APPLICATION:.metadata.name,SYNC:.status.sync.status,HEALTH:.status.health.status,REVISION:.status.sync.revision'Підтверджений стан:
django-app Synced Healthy
RDS connection:
kubectl exec -n django-app deployment/django-app -- \
python manage.py shell -c \
'from django.db import connection; print(connection.vendor)'Очікуваний результат:
postgresql
Успішно виконаний Jenkins build #5.
Django Admin відкривається, статичні файли завантажуються коректно.
Prometheus targets мають стан UP.
Grafana відображає CPU, memory, network і resource utilization кластера.
Моніторинг двох EKS worker nodes.
Grafana відображає ресурси Deployment django-app і двох pods.
На dashboard видно зміну CPU після генерації HTTP-навантаження.
HPA працює з діапазоном від 2 до 6 replicas і target CPU 70%.
- RDS не має public access;
- база даних розміщена в private subnets;
- доступ до RDS обмежений security group EKS;
- Jenkins використовує IRSA для доступу до ECR;
- AWS credentials не зберігаються в контейнерах;
- Django secrets передаються через Kubernetes Secret;
- паролі та SSH private key зберігаються лише в локальних
tfvars; - Terraform state зберігається в encrypted S3 backend;
- sensitive files виключені через
.gitignore.
Для production-середовища секрети доцільно зберігати в AWS Secrets Manager або використовувати External Secrets Operator.







