Перейти к содержанию
Публикация AiManual

Атрибуция затрат Amazon Bedrock: как считать расходы по каждому пользователю AI-инструментов через CUR 2.0

Amazon Bedrock сам записывает IAM-идентичность каждого вызова инференса, поэтому разбивку затрат по людям можно получить без правок в коде AI-инструментов. Разб

Коротко

Что будет в материале

  1. 01

    Как Bedrock атрибутирует расходы без изменений в коде

  2. 02

    Настройка IAM Identity Center и внешнего IdP для персональных principal

  3. 03

    Отчёты в CUR 2.0 и Athena: расходы по пользователям и кост-центрам

  4. 04

    Контроль лимитов: от Budgets до блокировки на каждый вызов

Amazon Bedrock записывает IAM-идентичность каждого, кто вызывает инференс. Правок в API-запросах для этого не требуется: при обращении к модели через эндпоинт bedrock-runtime или bedrock-mantle сервис фиксирует полный IAM ARN вызывающего, включая имя сессии федеративного пользователя, и публикует его в отчёте CUR 2.0 в колонке line_item_iam_principal. В блоге AWS схема атрибуции описана именно так: идентичность попадает в биллинг сама, инструментировать клиент не нужно.

Механизм работает на уровне эндпоинта, ниже логики конкретного инструмента. Claude Code, Claude Desktop, OpenAI Codex, ChatGPT Work и OpenCode обращаются к Bedrock через один из двух эндпоинтов инференса, поэтому атрибуция для них выглядит одинаково. Идентичность настраивается один раз, и каждый новый инструмент, который маршрутизирует инференс через Bedrock, наследует видимость затрат по пользователям автоматически.

Ниже практическая сборка схемы: IAM Identity Center с внешним IdP, permission set, session-теги, запросы Athena к CUR 2.0 и уровни контроля лимитов. Границу обозначим сразу: стоимости отдельного запроса в CUR нет, и это меняет то, что можно пообещать финансовому отделу.

Как Bedrock атрибутирует расходы без изменений в коде

Атрибуция встроена в слой эндпоинта. Клиент отправляет обычный запрос на инференс, а Bedrock рядом с ним сохраняет ARN роли или пользователя, под которым этот запрос авторизован. Для федеративного пользователя ARN выглядит примерно так: arn:aws:sts::123456789012:assumed-role/AWSReservedSSO_BedrockDev_1a2b3c/ivan.petrov@example.com. Имя сессии в конце и есть тот самый признак, по которому расходы разделяются по людям.

Из этого следуют три практических вывода. Первый: одна и та же настройка работает для всех инструментов, потому что они не участвуют в атрибуции. Второй: если инструмент ходит под общей ролью или общим статическим ключом, в CUR вы увидите одну строку на всех, и никакая постобработка не вернёт разбивку по фамилиям. Третий: имя сессии должно быть стабильным и уникальным для человека, иначе строки в отчёте начнут склеиваться или, наоборот, дробиться на несколько principal.

Идентичность идёт вместе с организационными тегами в CUR 2.0 и Cost Explorer, данные при этом остаются внутри периметра AWS. Для согласования с безопасностью это весомый аргумент: не нужно вывозить телеметрию в сторонний SaaS, чтобы узнать, кто сжёг бюджет.

Четыре паттерна доступа и почему для AI-инструментов подходит федерация

AWS описывает четыре паттерна доступа к Bedrock: IAM-пользователи, роли на приложение, федеративные идентичности и LLM-шлюзы, проксирующие запросы. В разборе AWS для AI-инструментов разработки и продуктивности выбран паттерн федеративных идентичностей: каждый разработчик или работник знаний аутентифицируется лично и получает собственный principal.

ПаттернЧто видно в биллингеГде уместен
IAM-пользователиОтдельный ARN на человекаНебольшие команды, но требует длинных статических ключей
Роль на приложениеОдин principal на всех пользователей приложенияСервисные сценарии без людей в контуре
Федеративные идентичностиARN с именем сессии на каждого пользователяClaude Code, Codex, OpenCode и другие рабочие инструменты
LLM-шлюзPrincipal шлюза, разбивка по людям живёт в учёте шлюзаЦентрализованные квоты и блокировки на каждый вызов

Главный минус общих креденшелов в том, что все затраты схлопываются в один principal, и пофамильная разбивка становится невозможной в принципе. Паттерны при этом комбинируются: федерация для людей, шлюз для сервисных и агентных сценариев, отдельная роль для CI/CD-прогонов.

Настройка IAM Identity Center и внешнего IdP для персональных principal

Схема собирается из четырёх шагов.

  1. Подключить внешний IdP к IAM Identity Center. Okta, Entra ID и Ping интегрируются по SAML или OIDC, после чего пользователи и группы приходят из корпоративного каталога, а не создаются руками в AWS.
  2. Создать permission set с доступом к Bedrock и назначить его на нужные группы. Права выдаются на уровне permission set, а не персональными политиками, иначе сопровождение быстро превращается в ручную работу.
  3. Проверить, что при входе пользователь получает ARN роли с именем сессии, содержащим его идентификатор из IdP. Это и есть ключ группировки в CUR.
  4. Настроить срок жизни сессии под рабочий день. Слишком короткая сессия означает частые переподключения инструментов, слишком длинная расширяет окно, в котором уволенный сотрудник сохраняет доступ.

Выдача прав отдельному человеку важна ещё и для контроля: Deny-политика или ограничение на дорогие модели применяются к конкретному principal, а не блокируют всю команду. Нативная схема контроля расходов по IAM-принципалам разобрана отдельно: там про principal-теги, Cost Explorer, CUR 2.0 с Athena и бюджеты с Deny-политикой при превышении порога.

Session-теги: команда и кост-центр как разрезы в CUR 2.0

Теги можно прикреплять к IAM-принципалам или передавать как session-теги при федерации. Они появляются в CUR 2.0 с префиксом iamPrincipal/ и в Cost Explorer как фильтруемые измерения, поэтому команда и кост-центр становятся полноценными осями отчёта, а не текстовыми пометками в таблице. AWS описывает оба способа, и выбор между ними простой: то, что не меняется у человека годами (кост-центр, продукт), удобнее вешать на principal, а то, что зависит от контекста входа (конкретный проект или команда в текущей сессии), передавать как session-тег.

Ограничение, которое ломает планы чаще всего: активация тегов не ретроактивна. Расходы, сделанные до включения тега, не пересчитаются, и в отчёте появится дыра за прошлые периоды. Набор тегов и их значения нужно заложить до первого продакшн-запуска инструментов, иначе первый же отчёт по кост-центрам будет наполовину пустым.

Конфигурация рабочих станций для Claude Code, Codex и других инструментов

Со стороны инструмента требуется одно: получать креденшелы пользователя из Identity Center, а не из статического ключа в переменной окружения. Практически это означает, что на машине настроен профиль входа через SSO, а инструмент использует стандартную цепочку поиска учётных данных AWS. Конкретные флаги и переменные отличаются от инструмента к инструменту, поэтому проверять их нужно по документации самого инструмента, а не по универсальному шаблону.

Что должно получиться на выходе: в биллинге появляются строки с ARN, в котором видно имя человека. Проверка занимает минуту: попросите двух сотрудников сделать по одному вызову и посмотрите на разные значения line_item_iam_principal в свежем экспорте. Если principal одинаковый, дальше настраивать отчёты бессмысленно, сначала нужно чинить идентичность.

Отдельная головная боль - фоновые и агентные процессы, которые работают дольше сессии. Им нужна либо отдельная роль с понятным именем, либо обновление креденшелов без смены имени сессии, иначе расходы начнут расползаться по нескольким principal у одного и того же человека.

Отчёты в CUR 2.0 и Athena: расходы по пользователям и кост-центрам

CUR 2.0 выгружается в S3 и читается через Athena или другой SQL-движок поверх тех же файлов. Ключевые колонки для задачи: line_item_iam_principal как идентификатор пользователя, стоимость использования, дата начала использования и код сервиса для фильтра по Bedrock. Использование в отчёте агрегировано по principal и типу использования за каждый интервал экспорта: один час при часовом экспорте и один день при дневном.

Быстрый путь без выгрузки - Cost Explorer с фильтром по session-тегам. Он годится для проверки гипотезы и разговора с руководителем, но не для регулярной финансовой отчётности: детализацию по людям и произвольные срезы удобнее строить в Athena.

Запрос Athena: стоимость по пользователям

Каркас запроса за период выглядит так:

SELECT
  line_item_iam_principal AS principal,
  round(sum(line_item_unblinded_cost), 2) AS cost_usd
FROM cur2_bedrock
WHERE product_servicecode = 'AmazonBedrock'
  AND line_item_usage_start_date >= DATE '2026-10-01'
GROUP BY 1
ORDER BY cost_usd DESC
LIMIT 100;

Имя таблицы и точное значение кода сервиса зависят от настроек экспорта в конкретном аккаунте, их стоит сверить перед запуском (SHOW COLUMNS по таблице покажет реальный набор колонок). Если в отчёте нужны только люди, добавьте фильтр по формату ARN или исключите роли сервисных процессов, иначе верхние строки займут CI/CD и агенты.

Запрос Athena: разбивка по кост-центрам и командам

Второй запрос группирует те же данные по тегу кост-центра:

SELECT
  resource_tags_iamprincipal_cost_center AS cost_center,
  count(DISTINCT line_item_iam_principal) AS users,
  round(sum(line_item_unblinded_cost), 2) AS cost_usd
FROM cur2_bedrock
WHERE product_servicecode = 'AmazonBedrock'
  AND line_item_usage_start_date >= DATE '2026-10-01'
GROUP BY 1
ORDER BY cost_usd DESC;

Имя колонки тега собирается из ключа и настроек экспорта, поэтому проверьте его в описании таблицы. Третий запрос решает обратную задачу, сопоставляет пользователя с командой и показывает, кто остался без тега:

SELECT
  line_item_iam_principal AS principal,
  max(resource_tags_iamprincipal_team) AS team,
  round(sum(line_item_unblinded_cost), 2) AS cost_usd
FROM cur2_bedrock
WHERE product_servicecode = 'AmazonBedrock'
GROUP BY 1
ORDER BY cost_usd DESC;

Пустое значение в колонке команды - сигнал, что федерация настроена не полностью: кто-то ходит под ролью без тега или под общим ключом. Такие строки полезно выводить отдельным блоком, это самый быстрый способ найти дыры в схеме.

Контроль лимитов: от Budgets до блокировки на каждый вызов

Отчётность отвечает на вопрос «кто потратил», но не мешает потратить. Уровни контроля различаются скоростью реакции, и их стоит наслаивать, а не выбирать один.

УровеньЗадержка реакцииЧто даётЧего не делает
AWS BudgetsДо сутокОповещение и автоматические действия при выходе за порогНе останавливает расход, который уже идёт
CloudWatch-алерт с Lambda1-5 минутБыстрая реакция на всплеск, автоматическое сужение доступаРаботает постфактум, после первых дорогих вызовов
Счётчики в DynamoDB на аутентификацииСекундыУчёт и отсечение до выдачи доступа к моделиГрубее, чем учёт на каждом вызове
LLM-шлюзНа каждый вызовБлокировка и квота до расхода токеновДобавляет компонент и точку отказа

AWS Budgets с задержкой до суток годится для оповещения, а не для остановки: к моменту срабатывания счёт уже выставлен. Бюджет с budget actions, который навешивает Deny-политику на превысившего лимит, полезен как страховка от забытого эксперимента, но исходить из того, что он сработает мгновенно, нельзя.

Связка CloudWatch и Lambda даёт задержку в 1-5 минут: алерт по метрике или расписанию запускает функцию, которая считает расход и меняет доступ к дорогим моделям. Архитектура per-user FinOps с обновлением ограничений каждые 15 минут показывает рабочую реализацию такого цикла, включая tiered enforcement и стоимость запросов в Athena. Слабое место схемы в том, что она реактивна: между всплеском и реакцией успевает пройти несколько дорогих сессий.

Счётчики в DynamoDB на уровне аутентификации позволяют отказать в доступе до вызова модели: пользователь получает временные креденшелы только при положительном остатке квоты. Это дешевле и проще, чем шлюз, но точность ограничена моментом выдачи доступа: внутри одной сессии человек всё ещё может потратить больше запланированного.

LLM-шлюз как точка атрибуции и тормоза

Четвёртый паттерн доступа из разбора AWS - шлюз, который проксирует запросы к Bedrock. Он видит каждый вызов и может считать токены, применять квоты по пользователю и блокировать расход до того, как он случится. Для федеративной схемы это совместимый вариант: шлюз получает principal пользователя и применяет лимиты по нему, а не по общему ключу.

Компромисс очевиден: в архитектуре появляется ещё один компонент со своими таймаутами, масштабированием и режимом отказа. Сборка self-service LLM-шлюза на Bedrock и LiteLLM показывает, из чего складывается такая система и какие поля стоимости нужно заполнить, чтобы бюджеты вообще срабатывали. Если задачи ограничены отчётностью, шлюз не нужен; если нужны жёсткие лимиты на вызов, без него не обойтись.

Ограничения метода: что CUR 2.0 не покажет

Список короткий, но его нужно проговорить до запуска, а не после первого счёта.

  • CUR не содержит стоимости отдельного запроса. В отчёте есть сумма за интервал по principal и типу использования, но не разбивка по конкретным промптам.
  • Использование агрегировано по principal и типу использования за интервал экспорта: один час при часовом экспорте и один день при дневном. Пики внутри интервала не видны.
  • Теги не применяются ретроактивно. Включили кост-центр в середине месяца, значит первая половина месяца останется без разреза.
  • Атрибуция по IAM-принципалу не единственный механизм в Bedrock, но сравнение дополнительных механизмов в исходном разборе не раскрыто, и подменять его догадками не стоит.

Данные при этом не покидают периметр AWS, что снимает часть вопросов службы безопасности и упрощает согласование доступа к отчётам.

Когда нужны логи вызовов моделей

За пределы биллинга пора выходить в трёх случаях: нужно разобрать дорогой промпт, найти причину аномалии за конкретный час или восстановить картину инцидента по одному пользователю. Для этого служат логи вызовов моделей и тегирование метаданных запросов: они дают детализацию, которой в CUR нет по определению.

У этого контура своя цена: объём хранения, требования к сроку жизни логов и вопрос, не попадают ли в них персональные данные из промптов. Решение о включении логов стоит принимать вместе с безопасностью, а не как техническую мелочь.

Порядок внедрения: что сделать первым

Последовательность важнее полноты. Сначала Identity Center и внешний IdP с персональными principal: без этого остальные шаги не имеют смысла. Затем permission set с доступом к Bedrock и настройка рабочих станций, чтобы инструменты получали креденшелы через SSO. Затем session-теги и значения кост-центров, причём до первого продакшн-запуска, потому что задним числом они не применятся.

После этого включается отчётность: экспорт CUR 2.0 с нужными колонками, пара запросов в Athena и сверка с Cost Explorer. И только в конце наращиваются уровни контроля по возрастанию скорости реакции, от бюджета-оповещения до шлюза с блокировкой на каждый вызов, в том порядке, в котором растёт цена ошибки.

Настройка делается один раз, новые инструменты наследуют видимость затрат автоматически. Ограничения CUR при этом никуда не исчезают, поэтому разговор с финансовым отделом лучше вести заранее: пофамильный учёт будет, стоимости отдельного запроса не будет. Если планируете следить за новыми возможностями Bedrock в части контроля расходов, пригодятся обновления Bedrock и AgentCore за август 2026 с разбором ограничений и чек-листом перед изменениями в проде.

Подписаться на канал