Реалізація тегування ресурсів для алокації витрат по проектах

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

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

Інформаційні сайти або веб-програми
Сайти візитки, 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

Система тегування ресурсів та розподіл витрат

Без тегування неможливо відповісти на запитання «скільки коштує цей продукт?» або «чому рахунок виріс?». Resource tagging — основа FinOps: здатність розділити хмарні витрати по продуктам, командам, середовищах та клієнтах.

Стратегія тегування

Стандартний набір обов'язкових тегів:

Тег Значення Опис
Environment production, staging, dev Середовище розгортання
Team backend, frontend, data, devops Власник ресурсу
Product api, dashboard, billing, data-pipeline Компонент продукту
CostCenter eng-001, data-002 Центр витрат для бухгалтерії
ManagedBy terraform, manual, helm Спосіб управління

Додаткові теги для конкретних випадків: Customer (для SaaS з per-customer billing), Project (для проектної роботи), ExpiresAt (для тимчасових ресурсів).

Примус через AWS Config

AWS Config Rule для перевірки наявності обов'язкових тегів:

resource "aws_config_config_rule" "required_tags" {
  name = "required-tags"

  source {
    owner             = "AWS"
    source_identifier = "REQUIRED_TAGS"
  }

  input_parameters = jsonencode({
    tag1Key   = "Environment"
    tag1Value = "production,staging,dev,test"
    tag2Key   = "Team"
    tag3Key   = "Product"
    tag4Key   = "ManagedBy"
  })

  scope {
    compliance_resource_types = [
      "AWS::EC2::Instance",
      "AWS::RDS::DBInstance",
      "AWS::ElasticLoadBalancingV2::LoadBalancer",
      "AWS::S3::Bucket",
      "AWS::Lambda::Function"
    ]
  }
}

# Авто-виправлення: Lambda додає стандартні теги при виявленні порушення
resource "aws_config_remediation_configuration" "tag_remediation" {
  config_rule_name = aws_config_config_rule.required_tags.name
  target_type      = "SSM_DOCUMENT"
  target_id        = "AWS-SetRequiredTags"
  automatic        = false  # ручне затвердження перед застосуванням

  parameter {
    name           = "RequiredTags"
    static_value   = "Environment=unknown,Team=unknown"
  }
}

Terraform: тегування на рівні провайдера

# provider.tf — default_tags застосовуються до всіх ресурсів
provider "aws" {
  region = "eu-central-1"

  default_tags {
    tags = {
      ManagedBy   = "terraform"
      Repository  = "github.com/company/infrastructure"
      Environment = var.environment
      Team        = var.team
    }
  }
}

# Специфічні теги додаються на рівні ресурсу
resource "aws_instance" "api_server" {
  ami           = data.aws_ami.ubuntu.id
  instance_type = "t3.medium"

  tags = {
    Name    = "api-server-${var.environment}"
    Product = "api"
    # Environment та Team успадковуються з default_tags
  }
}

Cost Allocation Tags та AWS Cost Categories

Після створення тегів увімкніть їх у Cost Explorer:

import boto3

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

# Активувати теги для розподілу витрат (займає до 24 годин)
ce.activate_tags(
    Tags=['Environment', 'Team', 'Product', 'CostCenter']
)

# Створити Cost Category для групування по командам
ce.create_cost_category_definition(
    Name='Team-Costs',
    RuleVersion='CostCategoryExpression.v1',
    Rules=[
        {
            'Value': 'Backend Team',
            'Rule': {
                'Tags': {
                    'Key': 'Team',
                    'Values': ['backend', 'api']
                }
            }
        },
        {
            'Value': 'Data Team',
            'Rule': {
                'Tags': {
                    'Key': 'Team',
                    'Values': ['data', 'analytics', 'ml']
                }
            }
        }
    ],
    DefaultValue='Unallocated'
)

Скрипт аудиту нетегованих ресурсів

import boto3
from collections import defaultdict

REQUIRED_TAGS = {'Environment', 'Team', 'Product'}

def audit_untagged_resources(region='eu-central-1'):
    session = boto3.Session(region_name=region)
    untagged = defaultdict(list)

    # EC2 Instances
    ec2 = session.client('ec2')
    instances = ec2.describe_instances(
        Filters=[{'Name': 'instance-state-name', 'Values': ['running', 'stopped']}]
    )
    for reservation in instances['Reservations']:
        for inst in reservation['Instances']:
            tags = {t['Key']: t['Value'] for t in inst.get('Tags', [])}
            missing = REQUIRED_TAGS - set(tags.keys())
            if missing:
                untagged['EC2'].append({
                    'id': inst['InstanceId'],
                    'missing_tags': list(missing),
                    'name': tags.get('Name', 'unnamed')
                })

    # RDS
    rds = session.client('rds')
    dbs = rds.describe_db_instances()
    for db in dbs['DBInstances']:
        arn = db['DBInstanceArn']
        tags_resp = rds.list_tags_for_resource(ResourceName=arn)
        tags = {t['Key']: t['Value'] for t in tags_resp['TagList']}
        missing = REQUIRED_TAGS - set(tags.keys())
        if missing:
            untagged['RDS'].append({
                'id': db['DBInstanceIdentifier'],
                'missing_tags': list(missing)
            })

    return untagged

if __name__ == '__main__':
    result = audit_untagged_resources()
    total = sum(len(v) for v in result.values())
    print(f"\nUntagged resources: {total}")
    for service, resources in result.items():
        print(f"\n{service}: {len(resources)} resources")
        for r in resources[:5]:  # показуємо перші 5
            print(f"  {r['id']}: missing {r['missing_tags']}")

Звіти Showback та Chargeback

def generate_team_cost_report(month: str):
    """month: '2025-11'"""
    ce = boto3.client('ce', region_name='us-east-1')

    start = f"{month}-01"
    # останній день місяця
    year, mon = map(int, month.split('-'))
    import calendar
    last_day = calendar.monthrange(year, mon)[1]
    end = f"{month}-{last_day:02d}"

    response = ce.get_cost_and_usage(
        TimePeriod={'Start': start, 'End': end},
        Granularity='MONTHLY',
        Metrics=['UnblendedCost'],
        GroupBy=[{'Type': 'TAG', 'Key': 'Team'}]
    )

    report = {}
    for group in response['ResultsByTime'][0]['Groups']:
        team = group['Keys'][0].replace('Team$', '') or 'Untagged'
        cost = float(group['Metrics']['UnblendedCost']['Amount'])
        report[team] = round(cost, 2)

    return dict(sorted(report.items(), key=lambda x: x[1], reverse=True))

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

  • Розробка tagging strategy + документація — 1 день
  • Terraform default_tags для всіх модулів — 2-3 дні
  • AWS Config Rules для примусу — 1 день
  • Аудит + тегування існуючих ресурсів — 2-5 днів (залежить від масштабу)
  • Cost Categories + звіти — 1-2 дні