Тегирование облачных ресурсов для аллокации затрат: руководство по AWS, Azure и GCP

Практическое руководство по тегированию облачных ресурсов для аллокации затрат в AWS, Azure и GCP. Terraform-примеры, политики enforcement и путь от showback к chargeback для зрелой FinOps-практики.

Введение: почему 54% облачных расходов теряются без тегов

Вы уже освоили Reserved Instances, разобрались со спот-инстансами, подкрутили Kubernetes-кластеры и даже добрались до GPU-расходов на ИИ. Отлично. Но вот честный вопрос: а вы вообще знаете, кто именно тратит ваши облачные деньги?

По данным Anodot, 54% облачного waste возникает из-за банальной невидимости затрат. Главная причина — непоследовательное или вообще отсутствующее тегирование ресурсов. Исследование VMware 2025 года (больше 1800 ИТ-руководителей) нарисовало ещё более печальную картину: 49% респондентов признают, что более четверти облачного бюджета уходит в никуда.

Тегирование (в GCP это называется «маркировка») — фундамент всей FinOps-практики. Без него не получится ни аллокация затрат, ни showback, ни chargeback, ни даже толковое выявление idle-ресурсов. По сути, все прочие стратегии оптимизации — right-sizing, спот-инстансы, обязательства — становятся заметно менее эффективными, если нельзя привязать расходы к конкретным командам, проектам и средам.

Дальше разберём всё по порядку: от проектирования схемы тегов до автоматизации через Terraform, принудительного enforcement через политики в AWS, Azure и GCP, и построения системы showback/chargeback. С рабочими примерами кода для каждого из трёх облаков.

Что такое аллокация облачных затрат и зачем она нужна

Аллокация затрат (Cost Allocation) — это, по сути, процесс «раскидывания» облачных расходов по конкретным подразделениям, командам, проектам или приложениям. Вместо одного общего счёта на $200K вы получаете ясную картину: кто, сколько и на что тратит.

Зачем это вообще нужно:

  • Финансовая прозрачность — вы наконец-то видите, какие проекты и команды генерируют основные расходы
  • Ответственность — когда команда видит свои цифры, поведение реально меняется. Netflix, к примеру, использует тегирование для выявления неэффективных ресурсов и right-sizing инстансов
  • Точное бюджетирование — анализ трендов по тегам позволяет строить прогнозы, которые похожи на реальность
  • Оптимизация — невозможно оптимизировать то, что не измеряешь (старая мудрость, но работает). Тегирование открывает дорогу ко всем остальным FinOps-практикам

По данным FinOps Foundation, организации без FinOps-программ расходуют впустую 32–40% облачного бюджета. С зрелыми практиками этот показатель падает до 15–20%. А фундамент зрелого FinOps — именно правильная аллокация затрат через тегирование.

Проектирование схемы тегов: минимальный жизнеспособный набор

Первая (и самая типичная) ошибка — попытка налепить 20 обязательных тегов сразу. Команды начинают сопротивляться, качество данных стремительно падает, и через полгода теги превращаются в кашу. Знакомо?

Правильный подход — начать с минимального, но обязательного набора из 5–8 тегов.

Рекомендуемая базовая схема

# Обязательные теги (Mandatory Tags)
Owner        = "platform-team"          # Команда-владелец ресурса
Environment  = "production"             # Среда: production, staging, development
Project      = "checkout-service"       # Проект или сервис
CostCenter   = "engineering-12345"      # Центр затрат для финансового учёта
Application  = "ecommerce-backend"      # Приложение

# Рекомендуемые дополнительные теги
ManagedBy    = "terraform"              # Способ управления: terraform, manual, pulumi
DataClass    = "confidential"           # Классификация данных
Compliance   = "pci-dss"               # Требования compliance

Правила именования

Честно говоря, единообразие тут важнее идеального набора тегов. Вот ключевые правила:

  • Формат ключей — выберите PascalCase (CostCenter) или kebab-case (cost-center), но придерживайтесь одного стиля везде. Мы рекомендуем lowercase с дефисами — такой формат работает во всех облаках и хорошо читается в отчётах
  • Формат значений — lowercase, дефисы вместо пробелов. Избегайте ситуации, когда у вас одновременно существуют Prod, prod, Production и production — выберите что-то одно и задокументируйте
  • Без персональных данных — не пихайте email или имена в теги, используйте идентификаторы команд

AWS: теги аллокации затрат и автоматизация через Terraform

AWS поддерживает до 50 тегов на ресурс и предлагает два типа тегов для Cost Allocation: генерируемые автоматически (с префиксом aws:) и пользовательские. Важный момент — пользовательские теги нужно активировать вручную в AWS Billing Console, иначе они просто не появятся в Cost Explorer.

Автоматическое тегирование через Terraform default_tags

Начиная с AWS Provider 3.38.0 Terraform поддерживает default_tags на уровне провайдера. Это реально удобная штука: все ресурсы автоматически наследуют заданные теги.

provider "aws" {
  region = "eu-west-1"

  default_tags {
    tags = {
      Environment = var.environment
      Project     = var.project_name
      Team        = var.team_name
      CostCenter  = var.cost_center
      ManagedBy   = "terraform"
    }
  }
}

# Все ресурсы автоматически получают теги провайдера
resource "aws_instance" "web" {
  ami           = "ami-0abcdef1234567890"
  instance_type = "t3.medium"

  # Можно добавить или переопределить теги на уровне ресурса
  tags = {
    Name        = "web-server-01"
    Application = "frontend"
  }
}
# Итого на ресурсе будут теги:
# Environment, Project, Team, CostCenter, ManagedBy, Name, Application

Активация тегов аллокации затрат через CLI

После применения тегов их нужно активировать для Cost Explorer. Делается это через AWS CLI:

# Активация пользовательских тегов для Cost Allocation
aws ce update-cost-allocation-tags-status \
  --cost-allocation-tags-status \
  Key=Environment,Status=Active \
  Key=Team,Status=Active \
  Key=Project,Status=Active \
  Key=CostCenter,Status=Active

# Проверка статуса тегов
aws ce list-cost-allocation-tags \
  --status Active \
  --type User

После активации данные появятся в Cost Explorer в течение 24 часов. Не сразу — наберитесь терпения.

Принудительное применение через SCP

Tag Policies в AWS проверяют только корректность значений, но не наличие тегов как таковых. Чтобы реально запретить создание ресурсов без тегов, нужны Service Control Policies (SCP):

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DenyEC2WithoutProjectTag",
      "Effect": "Deny",
      "Action": "ec2:RunInstances",
      "Resource": "arn:aws:ec2:*:*:instance/*",
      "Condition": {
        "Null": {
          "aws:RequestTag/Project": "true"
        }
      }
    },
    {
      "Sid": "DenyEC2WithoutCostCenterTag",
      "Effect": "Deny",
      "Action": "ec2:RunInstances",
      "Resource": "arn:aws:ec2:*:*:instance/*",
      "Condition": {
        "Null": {
          "aws:RequestTag/CostCenter": "true"
        }
      }
    },
    {
      "Sid": "DenyRDSWithoutProjectTag",
      "Effect": "Deny",
      "Action": "rds:CreateDBInstance",
      "Resource": "*",
      "Condition": {
        "Null": {
          "aws:RequestTag/Project": "true"
        }
      }
    }
  ]
}

Важный нюанс: SCP с Deny для тегов может конфликтовать с CloudFormation — тот создаёт ресурс и тегирует его двумя отдельными шагами. Так что обязательно тестируйте SCP в режиме аудита, прежде чем катить на production OU.

Azure: теги, политики и Terraform

Azure поддерживает теги на ресурсах и группах ресурсов, но есть подвох — теги не наследуются автоматически от группы ресурсов к дочерним ресурсам. Многие на этом спотыкаются. Вдобавок Azure Provider для Terraform не поддерживает default_tags на уровне провайдера, поэтому теги приходится задавать для каждого ресурса отдельно.

Модуль тегирования в Terraform

Лучшая практика — определить теги в блоке locals и передавать их во все ресурсы через merge:

locals {
  common_tags = {
    Environment = var.environment
    Project     = var.project_name
    Team        = var.team_name
    CostCenter  = var.cost_center
    ManagedBy   = "terraform"
  }
}

resource "azurerm_resource_group" "main" {
  name     = "rg-${var.project_name}-${var.environment}"
  location = "West Europe"
  tags     = local.common_tags
}

resource "azurerm_linux_virtual_machine" "web" {
  name                = "vm-web-01"
  resource_group_name = azurerm_resource_group.main.name
  location            = azurerm_resource_group.main.location
  size                = "Standard_B2s"
  # ...

  tags = merge(local.common_tags, {
    Application = "frontend"
    Role        = "web-server"
  })
}

Azure Policy для принудительного тегирования

Azure Policy — пожалуй, самый мощный из всех провайдерных инструментов для enforcement тегов. Можно взять встроенную политику 871b6d14-10aa-478d-b590-94f262ecfa99 (Require a tag on resources) или написать свою через Terraform:

resource "azurerm_policy_definition" "require_tag" {
  name         = "require-cost-center-tag"
  policy_type  = "Custom"
  mode         = "Indexed"
  display_name = "Require CostCenter Tag"

  policy_rule = <<POLICY
  {
    "if": {
      "field": "[concat('tags[', parameters('tagName'), ']')]",
      "exists": "false"
    },
    "then": {
      "effect": "deny"
    }
  }
  POLICY

  parameters = <<PARAMS
  {
    "tagName": {
      "type": "String",
      "metadata": {
        "displayName": "Tag Name",
        "description": "Name of the required tag"
      }
    }
  }
  PARAMS
}

resource "azurerm_subscription_policy_assignment" "require_cost_center" {
  name                 = "require-cost-center"
  display_name         = "Require CostCenter Tag on All Resources"
  policy_definition_id = azurerm_policy_definition.require_tag.id
  subscription_id      = data.azurerm_subscription.current.id

  parameters = jsonencode({
    tagName = { value = "CostCenter" }
  })
}

Совет из практики: начните с режима Audit, а не Deny. Так вы увидите, какие ресурсы нарушают политику, не блокируя при этом работу команд. Переключайтесь на Deny только когда соответствие перевалит за 90%.

GCP: метки (labels) и организационные политики

В GCP всё немного иначе. Здесь для метаданных ресурсов используется термин «метки» (labels), а слово «теги» зарезервировано за сетевыми тегами. Ещё одно отличие — в Terraform нет провайдерного default_labels, и поддержка меток варьируется между типами ресурсов.

Стратегия меток в Terraform

Google рекомендует ограничиваться 10 метками на ресурс и держать набор ключей стандартизированным:

locals {
  common_labels = {
    environment  = var.environment
    project      = var.project_name
    team         = var.team_name
    cost-center  = var.cost_center
    managed-by   = "terraform"
  }
}

resource "google_compute_instance" "web" {
  name         = "web-server-01"
  machine_type = "e2-medium"
  zone         = "europe-west1-b"

  labels = merge(local.common_labels, {
    application = "frontend"
    role        = "web-server"
  })

  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-12"
    }
  }

  network_interface {
    network = "default"
  }
}

# Бюджетное оповещение с фильтром по меткам
resource "google_billing_budget" "project_budget" {
  billing_account = var.billing_account_id
  display_name    = "Budget for ${var.project_name}"

  budget_filter {
    labels = {
      project = var.project_name
    }
  }

  amount {
    specified_amount {
      currency_code = "USD"
      units         = "1000"
    }
  }

  threshold_rules {
    threshold_percent = 0.5
  }
  threshold_rules {
    threshold_percent = 0.8
  }
  threshold_rules {
    threshold_percent = 1.0
  }
}

Организационные политики и автоматизация

В GCP для принудительного тегирования на уровне организации можно задействовать Organization Policies вместе с Terraform-модулем terraform-google-org-policy. Для ретроактивного тегирования существующих ресурсов подойдут Cloud Functions или CI/CD-пайплайн с Terraform import.

На практике стремитесь покрыть метками 95% облачных расходов. Оставшиеся 5% — это ресурсы, которые технически не поддерживают метки. Для них определите процесс аллокации: обычно неразмеченные расходы распределяются пропорционально по существующим центрам затрат.

Showback vs Chargeback: от видимости к ответственности

Тегирование само по себе мало что даёт, если собранные данные не превращаются в отчёты. Есть два основных подхода к распределению затрат между командами, и оба заслуживают внимания.

Showback — прозрачность без счетов

Showback — модель, при которой команды видят свои расходы, но реально не оплачивают их. Это такое зеркало потребления: команда видит, что потратила $15 000 на EC2 в прошлом месяце, но из их бюджета эта сумма не вычитается.

Для старта FinOps-пути — идеальный вариант. Создаёт осведомлённость без лишнего сопротивления.

Chargeback — реальная финансовая ответственность

Chargeback идёт дальше: расходы фактически списываются с бюджета команды. Это создаёт прямую финансовую мотивацию оптимизировать потребление. Когда инженер осознаёт, что оставленный на выходные dev-инстанс p4d.24xlarge обошёлся его команде в $2 300... ну, скажем так, поведение меняется довольно быстро.

Рекомендуемый путь: от Showback к Chargeback

Большинство организаций проходят эту трансформацию за 6–12 месяцев:

  1. Кварталы 1–2: внедрите showback. Сфокусируйтесь на достижении 90%+ покрытия тегами
  2. Квартал 3: переведите на chargeback команды с лучшим покрытием. Остальные пока остаются на showback
  3. Квартал 4: полный chargeback для всех. Нераспределённые расходы делятся пропорционально

Золотое правило: не переключайтесь на chargeback, пока покрытие тегами не достигнет 90%+. Иначе команды справедливо начнут оспаривать неточные отчёты, и весь процесс потеряет доверие. Мы это видели не раз.

Аудит и борьба с drift тегов

У тегов есть неприятная особенность — они «дрейфуют». Новые ресурсы создаются без тегов, значения устаревают, люди увольняются, а их ресурсы висят без владельца. Вот как с этим можно справиться.

Встроенные инструменты аудита

  • AWS Config Rules — настройте правило required-tags для мониторинга соответствия. Config автоматически выявит ресурсы без обязательных тегов
  • Azure Resource Graph — запросите неразмеченные ресурсы через KQL: resources | where isnull(tags.CostCenter)
  • GCP Cloud Asset Inventory — сканирует ресурсы без требуемых меток по всем проектам организации

Метрика покрытия тегами

FinOps Foundation рекомендует отслеживать процент нетегированных расходов:

Untagged Cost % = (Стоимость ресурсов без тегов / Общая стоимость ресурсов) × 100

Целевой показатель — менее 5% нетегированных расходов. Нулевой процент — это, по сути, утопия, потому что часть ресурсов просто не поддерживает теги.

Автоматизация ретроактивного тегирования

Для существующих ресурсов без тегов выручает автоматизация:

# AWS: массовое тегирование через AWS CLI
# Найти все EC2-инстансы без тега Project
aws ec2 describe-instances \
  --filters "Name=tag-key,Values=!Project" \
  --query "Reservations[].Instances[].InstanceId" \
  --output text | tr '\t' '\n' | while read id; do
    aws ec2 create-tags \
      --resources "$id" \
      --tags Key=Project,Value=unallocated Key=Owner,Value=unknown
done

Помечайте такие ресурсы как unallocated — это делает проблему видимой и мотивирует команды наконец-то разобраться со своими ресурсами.

Мультиоблачная стратегия: единая схема для AWS, Azure и GCP

Работаете с несколькими облаками? Тогда главная головная боль — различия в терминологии и ограничениях:

  • AWS — «теги» (tags), до 50 на ресурс, ключи до 128 символов, значения до 256
  • Azure — «теги» (tags), до 50 на ресурс, ключи до 512 символов, значения до 256
  • GCP — «метки» (labels), до 64 на ресурс, только lowercase буквы, цифры, дефисы и подчёркивания

Практическое решение довольно простое: ориентируйтесь на ограничения GCP (они самые жёсткие). Используйте lowercase ключи с дефисами, короткие и понятные значения. А для консолидации отчётов из нескольких облаков есть виртуальные теги — функция FinOps-платформ вроде Vantage, nOps или CloudHealth, которая позволяет объединять затраты разных провайдеров по единому тегу.

В 2026 году также набирает обороты спецификация FOCUS (FinOps Open Cost and Usage Specification). Она стандартизирует формат биллинговых данных между провайдерами и ощутимо упрощает мультиоблачную аллокацию.

Практический чеклист внедрения

Итак, давайте соберём всё в один пошаговый план:

  1. Определите минимальную схему — 5–8 обязательных тегов, согласованных с финансовым и инженерным отделами
  2. Задокументируйте стандарт — формат ключей, допустимые значения, примеры для каждого тега
  3. Автоматизируйте через IaCdefault_tags в Terraform для AWS, locals для Azure и GCP
  4. Включите enforcement — SCP для AWS, Azure Policy, GCP Organization Policy. Начинайте с режима аудита
  5. Активируйте Cost Allocation Tags — в AWS Billing Console, Azure Cost Management, GCP Billing
  6. Разметьте существующие ресурсы — скрипты ретроактивного тегирования, пометка нераспределённых как unallocated
  7. Запустите showback — еженедельные отчёты по командам с разбивкой по тегам
  8. Измеряйте покрытие — цельтесь в 90%+ за первый квартал, 95%+ ко второму
  9. Переходите на chargeback — после достижения 90% покрытия, начиная с самых крупных команд
  10. Квартальный аудит — проверка drift, актуализация значений, удаление устаревших тегов

Часто задаваемые вопросы (FAQ)

Сколько обязательных тегов нужно для начала?

Начните с 5–8 обязательных. Больше — и команды начнут тихо саботировать, качество данных упадёт. Минимальный набор: Owner, Environment, Project, CostCenter, Application. Расширяйте схему постепенно, по мере роста FinOps-зрелости организации.

Что делать с ресурсами, которые не поддерживают теги?

Такие ресурсы есть у каждого провайдера, и с этим ничего не поделать. Реалистичная цель — 95% покрытия расходов тегами. Для оставшихся 5% определите процесс пропорционального распределения: обычно неразмеченные расходы раскидываются между центрами затрат пропорционально их доле в размеченных.

В чём разница между showback и chargeback?

Showback показывает команде её расходы, но не списывает деньги — это инструмент осведомлённости. Chargeback реально вычитает расходы из бюджета команды, создавая прямую финансовую мотивацию. Рекомендация: начните с showback и перейдите на chargeback через 2–3 квартала, когда покрытие тегами перевалит за 90%.

Как обеспечить единообразие тегов в мультиоблачной среде?

Ориентируйтесь на ограничения GCP — они самые строгие (только lowercase, цифры, дефисы). Определите единую схему, автоматизируйте через Terraform-модули, а для консолидации отчётов используйте виртуальные теги в FinOps-платформах или спецификацию FOCUS.

Как быстро теги начинают отображаться в отчётах о затратах?

Зависит от провайдера. В AWS после активации Cost Allocation Tags данные появляются в Cost Explorer примерно за 24 часа, причём только для расходов, возникших после активации — задним числом ничего не появится. В Azure Cost Management теги подтягиваются почти сразу. В GCP метки отображаются в Billing Reports в течение нескольких часов.

Об авторе Editorial Team

Our team of expert writers and editors.