2.9 Cloud Cost Optimization: Оптимизация расходов в облаке #
🎯 Что такое Cloud Cost Optimization простыми словами #
Cloud Cost Optimization — это процесс минимизации расходов на облачную инфраструктуру при сохранении необходимой производительности и надежности. Это не просто “урезание бюджета”, а умное управление ресурсами.
💰 Аналогия с домашним бюджетом #
Аналогия с домашним бюджетом:
Плохой подход - “тратим без контроля”:
- Покупаем в интернет-магазине все подряд
- Получаем огромный счет в конце месяца
Хороший подход - “планируем и оптимизируем”:
- Планируем покупки заранее
- Сравниваем цены и качество
- Используем скидки и акции
- Экономим деньги разумно
📊 Основные принципы cost optimization #
1. Visibility - Видимость расходов #
Команда AWS Cost Explorer для анализа расходов:
Параметры команды:
- –time-period: период с 1 по 31 января 2025
- –granularity MONTHLY: группировка по месяцам
- –metrics BlendedCost: метрика общей стоимости
- –group-by Type=DIMENSION,Key=SERVICE: группировка по сервисам AWS
2. Right-sizing - Правильный размер ресурсов #
Пример Right-sizing - правильного размера ресурсов:
Неправильно (Oversized instance):
- CPU: 2000m (запрошено, но используется только 200m)
- Memory: 8Gi (запрошено, но используется только 1Gi)
- Проблема: переплата за неиспользуемые ресурсы
Правильно (Right-sized instance):
- CPU: 500m (учитываем пики нагрузки + малый запас)
- Memory: 2Gi (достаточно для текущей нагрузки + запас на рост)
- Преимущество: оптимальное соотношение стоимости и производительности
3. Automation - Автоматизация управления #
# Автоматическое масштабирование
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: webapp-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: webapp
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
💡 AWS Cost Optimization стратегии #
🟢 EC2 Optimization #
Spot Instances для non-critical workloads #
# Kubernetes Node Group со Spot instances
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: cost-optimized-cluster
nodeGroups:
- name: spot-workers
instancesDistribution:
instanceTypes:
- t3.medium
- t3a.medium
- t2.medium
onDemandBaseCapacity: 1
onDemandPercentageAboveBaseCapacity: 0
spotInstancePools: 3
minSize: 1
maxSize: 10
desiredCapacity: 3
Reserved Instances для стабильных workloads #
Команды для управления Reserved Instances:
Анализ покрытия RI:
- Период анализа: январь 2025
- Группировка: по сервисам AWS
- Результат: показывает процент покрытия резервированиями
Покупка Reserved Instance:
- Идентификатор предложения: уникальный ID для конкретного RI
- Количество инстансов: 2 штуки
- Результат: оформляет резервирование на год или больше
Savings Plans #
// Анализ Savings Plans рекомендаций
{
"SavingsPlansType": "COMPUTE_SP",
"PaymentOption": "NO_UPFRONT",
"PlanType": "1_YEAR",
"HourlyCommitment": "10.50",
"EstimatedMonthlySavings": "150.00"
}
🟡 Storage Optimization #
S3 Intelligent Tiering #
# Terraform конфигурация для S3 lifecycle
resource "aws_s3_bucket_lifecycle_configuration" "intelligent_tiering" {
bucket = aws_s3_bucket.data_bucket.id
rule {
id = "intelligent_tiering"
status = "Enabled"
transition {
days = 0
storage_class = "INTELLIGENT_TIERING"
}
transition {
days = 90
storage_class = "GLACIER"
}
transition {
days = 365
storage_class = "DEEP_ARCHIVE"
}
expiration {
days = 2555 # 7 лет
}
}
}
EBS Volume Optimization #
Команды для оптимизации EBS Volume:
Поиск неиспользуемых томов:
- Фильтр: статус “available” (не прикреплен к инстансам)
- Вывод: ID тома, размер, тип, время создания
- Формат: таблица для удобного просмотра
Оптимизация типа тома:
- Идентификатор: vol-12345678 (конкретный том)
- Новый тип: gp3 (более экономичный чем gp2)
- Размер: 100 GB
- Преимущество: снижение стоимости хранения
🟠 Database Optimization #
RDS Right-sizing #
Запрос для анализа использования CPU в CloudWatch:
Параметры запроса:
- Метрики: среднее и максимальное значение CPU
- Источник: CloudWatch метрики CPUUtilization
- Цель: база данных ‘prod-db’
- Период: последние 30 дней
Назначение:
- Определение реальной нагрузки на базу данных
- Принятие решения о right-sizing инстанса
# Terraform конфигурация с параметрами оптимизации
resource "aws_db_instance" "optimized" {
identifier = "prod-db-optimized"
# Right-sized instance
instance_class = "db.t3.medium" # Вместо db.r5.xlarge
# Storage optimization
storage_type = "gp3"
allocated_storage = 100
max_allocated_storage = 1000 # Auto-scaling storage
# Backup optimization
backup_retention_period = 7 # Не 35 дней
backup_window = "03:00-04:00"
# Multi-AZ только для production
multi_az = var.environment == "production" ? true : false
}
🔵 Azure Cost Optimization #
Azure Reserved VM Instances #
Команды Azure для управления Reserved VM Instances:
Анализ рекомендаций:
- Подписка: указание конкретной Azure подписки
- Результат: список рекомендаций по резервированию
- Предложения: оптимальные варианты для экономии
Покупка резервирования:
- Тип ресурса: VirtualMachines
- SKU: Standard_D2s_v3 (конкретный тип ВМ)
- Расположение: westus2 (West US 2 region)
- Количество: 2 инстанса
- Срок: P1Y (1 год)
Azure Cost Management + Billing #
// Budget с алертами
{
"properties": {
"displayName": "DevOps Monthly Budget",
"amount": 1000,
"timeGrain": "Monthly",
"timePeriod": {
"startDate": "2025-01-01",
"endDate": "2025-12-31"
},
"notifications": {
"Actual_GreaterThan_80_Percent": {
"enabled": true,
"operator": "GreaterThan",
"threshold": 80,
"contactEmails": ["devops@company.com"]
}
}
}
}
Azure Spot VMs для Kubernetes #
# AKS node pool со Spot VMs
apiVersion: containerservice.azure.com/v1
kind: AgentPool
metadata:
name: spot-pool
spec:
mode: User
vmSize: Standard_D2s_v3
scaleSetPriority: Spot # Spot instances
scaleSetEvictionPolicy: Delete
spotMaxPrice: 0.05 # Максимальная цена за час
nodeCount: 3
enableAutoScaling: true
minCount: 1
maxCount: 10
🟢 Google Cloud Cost Optimization #
Committed Use Discounts #
# Анализ рекомендаций по CUD
gcloud compute commitment-types list
# Создание commitment
gcloud compute commitments create my-commitment \
--plan=12-month \
--resources=type=memory,amount=100 \
--resources=type=vcpu,amount=50 \
--region=us-central1
Preemptible VMs в GKE #
# GKE node pool с preemptible instances
apiVersion: v1
kind: NodePool
metadata:
name: preemptible-pool
spec:
initialNodeCount: 3
config:
preemptible: true # Preemptible instances
machineType: n1-standard-2
diskSizeGb: 50
diskType: pd-ssd
autoscaling:
enabled: true
minNodeCount: 1
maxNodeCount: 10
Cloud Storage Lifecycle Management #
{
"rule": [
{
"action": {
"type": "SetStorageClass",
"storageClass": "NEARLINE"
},
"condition": {
"age": 30,
"matchesStorageClass": ["STANDARD"]
}
},
{
"action": {
"type": "SetStorageClass",
"storageClass": "COLDLINE"
},
"condition": {
"age": 90,
"matchesStorageClass": ["NEARLINE"]
}
},
{
"action": {
"type": "Delete"
},
"condition": {
"age": 365
}
}
]
}
🛠️ Cost Optimization Tools #
🔍 Monitoring и Alerting #
CloudWatch для AWS #
{
"MetricName": "EstimatedCharges",
"Namespace": "AWS/Billing",
"Statistic": "Maximum",
"Dimensions": [
{
"Name": "Currency",
"Value": "USD"
}
],
"AlarmActions": [
"arn:aws:sns:us-east-1:123456789012:billing-alarm"
],
"ComparisonOperator": "GreaterThanThreshold",
"Threshold": 1000
}
Grafana Dashboard для cost tracking #
# Prometheus query для Kubernetes costs
sum(
rate(container_cpu_usage_seconds_total[5m]) * on(node) group_left(instance_type, region)
(
kube_node_labels{label_beta_kubernetes_io_instance_type!=""}
)
) by (instance_type, region)
📊 Third-party Cost Management Tools #
Kubecost для Kubernetes #
# Установка Kubecost
helm repo add kubecost https://kubecost.github.io/cost-analyzer/
helm install kubecost kubecost/cost-analyzer \
--namespace kubecost \
--create-namespace \
--set kubecostToken="YOUR_TOKEN"
# Port forwarding для UI
kubectl port-forward -n kubecost service/kubecost-cost-analyzer 9090:9090
Infracost для Terraform #
# Установка infracost
curl -fsSL https://raw.githubusercontent.com/infracost/infracost/master/scripts/install.sh | sh
# Анализ cost impact изменений
infracost breakdown --path=.
infracost diff --path=. --sync-usage-file --usage-file infracost-usage.yml
# Интеграция с CI/CD
infracost comment github --path=infracost.json \
--repo=myorg/myrepo \
--github-token=$GITHUB_TOKEN \
--pull-request=123
⚡ Automated Cost Optimization #
🤖 Auto-scaling configurations #
Cluster Autoscaler #
# Cluster Autoscaler deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: cluster-autoscaler
namespace: kube-system
spec:
template:
spec:
containers:
- image: k8s.gcr.io/autoscaling/cluster-autoscaler:v1.21.0
name: cluster-autoscaler
command:
- ./cluster-autoscaler
- --v=4
- --stderrthreshold=info
- --cloud-provider=aws
- --skip-nodes-with-local-storage=false
- --expander=least-waste
- --node-group-auto-discovery=asg:tag=k8s.io/cluster-autoscaler/enabled,k8s.io/cluster-autoscaler/eks-cluster
- --balance-similar-node-groups
- --scale-down-enabled=true
- --scale-down-delay-after-add=10m
- --scale-down-unneeded-time=10m
Vertical Pod Autoscaler #
# VPA для автоматического right-sizing
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: webapp-vpa
spec:
targetRef:
apiVersion: apps/v1
kind: Deployment
name: webapp
updatePolicy:
updateMode: "Auto" # Автоматически применять рекомендации
resourcePolicy:
containerPolicies:
- containerName: webapp
maxAllowed:
cpu: 2
memory: 4Gi
minAllowed:
cpu: 100m
memory: 128Mi
📅 Scheduled Operations #
Lambda для автоматической остановки resources #
Функция AWS Lambda для автоматической остановки dev/test окружений:
Функция выполняет следующие действия:
- Подключается к AWS EC2 и RDS сервисам через boto3
- Находит все запущенные EC2 инстансы с тегами Environment=dev или Environment=test
- Останавливает найденные EC2 инстансы для экономии средств
- Проверяет все активные RDS базы данных и останавливает те, которые помечены тегами dev или test
- Возвращает статус успешного выполнения операции
Эта автоматизация позволяет значительно сократить расходы на непроизводственные окружения в нерабочее время.
EventBridge rule для расписания #
{
"Rules": [
{
"Name": "stop-dev-resources",
"ScheduleExpression": "cron(0 18 ? * MON-FRI *)",
"State": "ENABLED",
"Targets": [
{
"Id": "1",
"Arn": "arn:aws:lambda:us-east-1:123456789012:function:stop-dev-resources"
}
]
}
]
}
🎯 Cost Optimization Metrics и KPIs #
Основные метрики #
{
"cost_metrics": {
"cost_per_environment": {
"production": 5000,
"staging": 800,
"development": 200
},
"cost_per_service": {
"web_frontend": 1200,
"api_backend": 2000,
"database": 1500,
"monitoring": 300
},
"utilization_metrics": {
"cpu_utilization": 65,
"memory_utilization": 70,
"storage_utilization": 45
},
"optimization_savings": {
"spot_instances": 800,
"reserved_instances": 1200,
"right_sizing": 400
}
}
}
Cost Governance Dashboard #
# Grafana dashboard конфигурация
dashboard:
title: "Cloud Cost Optimization"
panels:
- title: "Monthly Spend Trend"
type: "graph"
targets:
- expr: 'aws_billing_estimated_charges_total'
- title: "Cost by Service"
type: "piechart"
targets:
- expr: 'sum by (service) (aws_billing_estimated_charges_total)'
- title: "Resource Utilization"
type: "stat"
targets:
- expr: 'avg(rate(cpu_usage_total[5m])) * 100'
- title: "Savings from Optimization"
type: "bargraph"
targets:
- expr: 'savings_spot_instances + savings_reserved_instances'
🏆 Лучшие практики Cost Optimization #
1. Continuous Monitoring #
✅ DO:
- Настроить alerting на превышение бюджета
- Регулярно анализировать cost reports
- Отслеживать utilization metrics
- Создать cost ownership по командам
❌ DON'T:
- Проверять costs только в конце месяца
- Игнорировать unused resources
- Отсутствие tagging strategy
- No cost governance процессов
2. Resource Lifecycle Management #
✅ DO:
- Автоматически останавливать dev/test ресурсы
- Использовать lifecycle policies для storage
- Regular cleanup неиспользуемых resources
- Implement resource expiration tags
❌ DON'T:
- Забывать удалять temporary ресурсы
- Хранить backup'ы вечно
- Использовать production-size в dev
- Ignore storage costs (они накапливаются!)
3. Right-sizing Strategy #
✅ DO:
- Начинать с smaller instances и scale up
- Использовать monitoring для sizing decisions
- Regular review resource utilization
- Test performance impact от downsizing
❌ DON'T:
- Over-provision "на всякий случай"
- Игнорировать VPA/HPA рекомендации
- Размер instances без monitoring
- Assume bigger = better performance
🚨 Cost Optimization Antipatterns #
❌ Антипаттерн 1: “Penny wise, pound foolish” #
Проблема: Экономия на мелочах в ущерб большому
Пример:
- Используем t2.micro для базы данных (экономим $10/месяц)
- Но production падает каждую неделю (теряем $10,000/инцидент)
Решение:
- Focus на high-impact optimization
- Don't compromise reliability ради minimal savings
❌ Антипаттерн 2: “Set and forget” #
Проблема: Купили Reserved Instances и забыли
Пример:
- Купили 3-year RI для конкретного instance type
- Архитектура изменилась, instance type не нужен
- Платим за unused reservations
Решение:
- Regular review всех commitments
- Use convertible reservations где возможно
- Monitor reservation utilization
❌ Антипаттерн 3: “Cost optimization by downsizing everything” #
Проблема: Тупо уменьшили все instance'ы
Пример:
- Уменьшили все с xlarge на medium
- Performance упала в 3 раза
- User experience пострадал
Решение:
- Data-driven decisions based on utilization
- Test performance impact
- Gradual optimization с мониторингом
🎯 Практические задания #
🟢 Задание 1: Cost Visibility #
- Настроить AWS/Azure/GCP billing alerts
- Создать cost dashboard в Grafana
- Внедрить tagging strategy
- Настроить cost allocation по проектам
🟡 Задание 2: Automated Optimization #
- Настроить Cluster Autoscaler
- Внедрить VPA для right-sizing
- Создать Lambda для остановки dev resources
- Настроить storage lifecycle policies
🟠 Задание 3: Reserved Capacity Planning #
- Проанализировать workload patterns
- Купить Reserved Instances/Savings Plans
- Настроить Spot instances для batch workloads
- Monitor utilization и ROI
🔴 Задание 4: Cost Governance #
- Создать cost center structure
- Внедрить approval workflow для больших расходов
- Настроить showback/chargeback reporting
- Создать cost optimization playbook
🔗 Полезные ресурсы #
Документация #
- AWS Cost Optimization - инструменты AWS
- Azure Cost Management - Azure billing
- GCP Cost Management - Google Cloud billing
Инструменты #
- Kubecost - Kubernetes cost monitoring
- Infracost - Terraform cost estimation
- CloudHealth - multi-cloud cost management
Калькуляторы #
- AWS Pricing Calculator - оценка стоимости AWS
- Azure Pricing Calculator - Azure costs
- GCP Pricing Calculator - Google Cloud costs
🎯 Заключение #
Cloud Cost Optimization — это continuous process, а не одноразовая акция. Основные принципы:
✅ Visibility First — нельзя оптимизировать то, что не видишь
✅ Automate Everything — ручная оптимизация не масштабируется
✅ Right-size Continuously — потребности меняются со временем
✅ Balance Cost vs Performance — не экономить в ущерб reliability
✅ Culture of Cost Awareness — каждый должен понимать cost impact
Помните: 30% экономии при сохранении performance — реалистичная цель для большинства организаций. Начните с easy wins (unused resources), потом переходите к более сложным оптимизациям.
Следующий раздел: Глава 3: Soft Skills для DevOps