Введение: почему 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–2: внедрите showback. Сфокусируйтесь на достижении 90%+ покрытия тегами
- Квартал 3: переведите на chargeback команды с лучшим покрытием. Остальные пока остаются на showback
- Квартал 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). Она стандартизирует формат биллинговых данных между провайдерами и ощутимо упрощает мультиоблачную аллокацию.
Практический чеклист внедрения
Итак, давайте соберём всё в один пошаговый план:
- Определите минимальную схему — 5–8 обязательных тегов, согласованных с финансовым и инженерным отделами
- Задокументируйте стандарт — формат ключей, допустимые значения, примеры для каждого тега
- Автоматизируйте через IaC —
default_tagsв Terraform для AWS,localsдля Azure и GCP - Включите enforcement — SCP для AWS, Azure Policy, GCP Organization Policy. Начинайте с режима аудита
- Активируйте Cost Allocation Tags — в AWS Billing Console, Azure Cost Management, GCP Billing
- Разметьте существующие ресурсы — скрипты ретроактивного тегирования, пометка нераспределённых как
unallocated - Запустите showback — еженедельные отчёты по командам с разбивкой по тегам
- Измеряйте покрытие — цельтесь в 90%+ за первый квартал, 95%+ ко второму
- Переходите на chargeback — после достижения 90% покрытия, начиная с самых крупных команд
- Квартальный аудит — проверка 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 в течение нескольких часов.