Налаштування моніторингу витрат на хмарну інфраструктуру

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Пропоновані послуги
Показано 1 з 1 послугУсі 2065 послуг
Налаштування моніторингу витрат на хмарну інфраструктуру
Середня
від 1 робочого дня до 3 робочих днів
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    874
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851

Моніторинг витрат хмарної інфраструктури

Без моніторингу витрат сюрпризи в рахунку стають нормою: хтось залишив GPU-інстанс, NAT Gateway генерує неочікуваний трафік, S3 зберігає гігабайти застарілих логів. Систематичний моніторинг витрат перетворює рахунок із сюрпризу в передбачувану величину.

AWS Cost Explorer та Cost Anomaly Detection

AWS Cost Anomaly Detection автоматично знаходить аномальні витрати за допомогою ML-моделі, без настроювання порогів:

# Створити монітор через AWS CLI
aws ce create-anomaly-monitor \
  --anomaly-monitor '{
    "MonitorName": "service-monitor",
    "MonitorType": "DIMENSIONAL",
    "MonitorDimension": "SERVICE"
  }'

# Створити підписку (сповіщення при аномалії)
aws ce create-anomaly-subscription \
  --anomaly-subscription '{
    "SubscriptionName": "cost-anomaly-alerts",
    "Threshold": 20,
    "Frequency": "DAILY",
    "MonitorArnList": ["arn:aws:ce::123456789:anomalymonitor/xxx"],
    "Subscribers": [{
      "Address": "arn:aws:sns:eu-central-1:123456789:cost-alerts",
      "Type": "SNS"
    }]
  }'

Cost Explorer API для програмного доступу до даних:

import boto3
from datetime import date, timedelta

ce = boto3.client('ce', region_name='us-east-1')

def get_daily_costs_by_service(days=30):
    end = date.today()
    start = end - timedelta(days=days)

    response = ce.get_cost_and_usage(
        TimePeriod={
            'Start': start.strftime('%Y-%m-%d'),
            'End': end.strftime('%Y-%m-%d')
        },
        Granularity='DAILY',
        Metrics=['UnblendedCost'],
        GroupBy=[{'Type': 'DIMENSION', 'Key': 'SERVICE'}]
    )

    costs = {}
    for result in response['ResultsByTime']:
        date_str = result['TimePeriod']['Start']
        for group in result['Groups']:
            service = group['Keys'][0]
            amount = float(group['Metrics']['UnblendedCost']['Amount'])
            if service not in costs:
                costs[service] = {}
            costs[service][date_str] = amount

    return costs

# Знайти сервіси зі зростанням > 50% за останні 7 днів
def find_cost_spikes(threshold_pct=50):
    costs = get_daily_costs_by_service(14)
    spikes = []

    for service, daily in costs.items():
        dates = sorted(daily.keys())
        if len(dates) < 14:
            continue

        week1_avg = sum(daily[d] for d in dates[:7]) / 7
        week2_avg = sum(daily[d] for d in dates[7:]) / 7

        if week1_avg > 0 and week2_avg > week1_avg * (1 + threshold_pct/100):
            spikes.append({
                'service': service,
                'prev_avg': round(week1_avg, 2),
                'curr_avg': round(week2_avg, 2),
                'increase_pct': round((week2_avg/week1_avg - 1) * 100, 1)
            })

    return sorted(spikes, key=lambda x: x['increase_pct'], reverse=True)

Infracost для оцінки перед деплоєм

Infracost показує вартість змін Terraform перед застосуванням:

# .github/workflows/infracost.yml
name: Infracost
on: [pull_request]

jobs:
  infracost:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: infracost/actions/setup@v3
        with:
          api-key: ${{ secrets.INFRACOST_API_KEY }}

      - name: Generate Infracost cost estimate baseline
        run: |
          infracost breakdown --path=. \
            --format=json \
            --out-file=/tmp/infracost-base.json
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}

      - name: Generate Infracost diff
        run: |
          infracost diff --path=. \
            --format=json \
            --compare-to=/tmp/infracost-base.json \
            --out-file=/tmp/infracost.json

      - name: Post Infracost comment
        run: |
          infracost comment github \
            --path=/tmp/infracost.json \
            --repo=$GITHUB_REPOSITORY \
            --github-token=${{ secrets.GITHUB_TOKEN }} \
            --pull-request=${{ github.event.pull_request.number }} \
            --behavior=update

CloudWatch Billing Alarms

# billing_alarms.tf
resource "aws_cloudwatch_metric_alarm" "monthly_estimate" {
  alarm_name          = "monthly-bill-estimate"
  comparison_operator = "GreaterThanThreshold"
  evaluation_periods  = 1
  metric_name         = "EstimatedCharges"
  namespace           = "AWS/Billing"
  period              = 86400  # 1 день
  statistic           = "Maximum"
  threshold           = 500    # $500 поріг сповіщення
  alarm_description   = "Monthly AWS estimate exceeds $500"
  alarm_actions       = [aws_sns_topic.billing_alerts.arn]

  dimensions = {
    Currency = "USD"
  }
}

# Алерм для конкретного сервісу
resource "aws_cloudwatch_metric_alarm" "ec2_cost" {
  alarm_name          = "ec2-daily-cost"
  comparison_operator = "GreaterThanThreshold"
  evaluation_periods  = 1
  metric_name         = "EstimatedCharges"
  namespace           = "AWS/Billing"
  period              = 86400
  statistic           = "Maximum"
  threshold           = 100

  dimensions = {
    Currency    = "USD"
    ServiceName = "Amazon Elastic Compute Cloud - Compute"
  }
}

FinOps дашборд у Grafana

Grafana + AWS CloudWatch datasource для візуалізації витрат:

{
  "panels": [{
    "title": "Daily Cost by Service (Last 30d)",
    "type": "timeseries",
    "targets": [{
      "dimensions": {"Currency": "USD"},
      "expression": "SELECT SUM(EstimatedCharges) FROM SCHEMA(\"AWS/Billing\", Currency,ServiceName) GROUP BY ServiceName",
      "metricQueryType": 1,
      "refId": "A"
    }]
  }, {
    "title": "Cost by Tag: Environment",
    "type": "piechart",
    "targets": [{
      "queryMode": "Metrics Insights",
      "expression": "SELECT SUM(EstimatedCharges) FROM AWS/Billing WHERE Tags.Environment != '' GROUP BY Tags.Environment",
      "refId": "B"
    }]
  }]
}

Часова шкала впровадження

  • AWS Cost Anomaly Detection + SNS сповіщення — 1 день
  • Billing CloudWatch alarms — 0.5 дня
  • Infracost у CI/CD конвеєрі — 1-2 дні
  • Grafana дашборд витрат — 1-2 дні
  • Налаштування тегування для розподілу витрат — 1-3 дні (залежить від кількості ресурсів)