💸 Google Cloud — за что списываются деньги и как поставить лимит

О чём это

Расходы GCP-проекта dice-chess-lab, снятые по фактическим метрикам Cloud Monitoring, а не по прайс-листу. Отвечает на три вопроса: за что именно списываются деньги, сколько это будет стоить настоящими деньгами после бонусного периода, и как поставить лимит, который реально останавливает трату, а не просто присылает письмо. Проверено 29.07.2026.

Связанные: Oracle Cloud: что бесплатно, а что стоит денег · Hunter на Cloud Run: развёртывание и подводные камни · Oracle Cloud: раннбук · Рейтинг ботов и webhook: план выполнения


1. Что вообще есть в GCP

К биллинг-аккаунту привязаны три проекта, но ресурсы есть только в одном — dice-chess-lab:

РесурсЧто этоРегион
Cloud Run dicechess-bot-gcpбот gcp/scala-monte-carlous-central1
Cloud Run dicechess-bot-gcp-onnxбот gcp/expectimax-onnx-3us-central1
Cloud Run dicechess-bot-gcp-onnx-4бот gcp/expectimax-onnx-4us-central1
Cloud Run hunterприватный бот lab/huntereurope-west3
Vertex AI (Gemini)автоматическое ревью PR в 7 репозиторияхglobal
GCS dice-chess-lab-modelsONNX-модели, 2.19 МБus-central1
Artifact Registry dicechessобразы ботов, единицы тегов2 локации

Ни GCE-инстансов, ни Cloud SQL, ни Vertex-эндпоинтов, ни BigQuery-датасетов нет.

Четвёртый канал: AI Studio отдельно от Vertex

Важно не спутать два разных API к одним и тем же моделям Gemini:

ПроектAPIТарифРасход за 30 дней
dice-chess-labVertex AI (aiplatform)по токенам€135 — ревью PR, см. §4
gen-lang-client-0206785287 «Dice Chess»AI Studio (generativelanguage)Tier 1, платный86k output-токенов, < €1
gen-lang-client-0149628627 «Pulse Project»AI StudioFree tier680k output-токенов, €0
project-06267eb3-…пусто

Латентная дыра в проекте «Dice Chess»

Он на Tier 1, то есть платном тарифе с потолком 10 000 RPD. Сегодня расход меньше €1/мес и в счёте отдельной строки не даёт — но предохранителя там нет: неаккуратный скрипт может нарастить расход на два порядка, оставаясь в пределах квоты. Метрики этого API живут под generativelanguage.googleapis.com/…, а не под aiplatform.…, поэтому в мониторинге Vertex его не видно — искать надо отдельно (см. §9).

2. Ран-рейт: ~€430 в месяц

Счёт за июль на 29-е число выглядит обманчиво скромным, потому что оба крупных расхода начались посреди месяца:

СервисИюль (на 29.07)Расход идёт с€/деньПроекция на полный месяц
Vertex AI€135.5312.07 (18 дней)€7.53≈ €226
Cloud Run€41.4522.07 (8 дней)€7.00≈ €210
Cloud Storage€0.03€0.4
Artifact Registry€0.00~€0
≈ €435/мес

€177 — это не «месяц вышел дешёвым»

Это неполный месяц по обеим статьям. При неизменной конфигурации первый полный месяц выйдет примерно в 2.5 раза дороже. И кривая Cloud Run ещё растёт — каждый новый бот на лестнице добавляет ~€45/мес.

3. Cloud Run — €210/мес: почему «функции бесплатно» не сработало

Бесплатная квота Cloud Run существует, но она равна 180 000 vCPU-секунд в месяц = 50 vCPU-часов. Боты жгут ~90 instance-часов в день — квота выгорает за первые ~13 часов месяца, дальше всё платное.

Динамика по дням (billable instance time)

Деньmonte-carloonnx-3onnx-4hunterВсего
22.073.4h3.4h
23.0736.6h20.5h57.1h
26.0733.5h20.4h18.6h72.5h
27.0741.0h24.4h25.5h90.9h
29.0751.5h20.5h21.9h0.7h94.6h

До 22.07 расхода не было вообще — совпадает с датой первого пуша образов в Artifact Registry. Эмпирическая цена, выведенная из счёта: €41.45 за 526 instance-часов ⇒ €0.079 за instance-час.

Причина — не баг, а конструкция

Проверено на всякий случай, нет ли утечки: 99.9% ответов 2xx, ноль таймаутов (при timeoutSeconds=300 p99 = 15 s), minScale не задан (простой не тарифицируется), cpu-throttling включён (request-based billing). Расход честно рабочий. Цепочка такая:

  1. LadderScheduler в play-api круглосуточно держит 4 одновременные mirrored-пары с таймконтролем Fischer 300+3. Таймконтроль захардкожен в LadderScheduler.Config.DefaultTimeControl — env-ручки нет.
  2. Тяжёлые боты используют wall-clock как регулятор силы: у Monte-Carlo rollouts ∝ время, у expectimax кандидаты ∝ время. TimeManager выдаёт им ломоть от 300 секунд — они его съедают.
  3. Cloud Run тарифицирует каждую секунду длительности запроса. «Думать дольше = играть сильнее» на этом рантайме буквально означает «думать дольше = платить больше», один к одному.

Цена силы, по ботам

Ботp50 на ходh/день≈ €/месМесто в лестницеconcurrency
gcp/scala-monte-carlo13.0 s48≈ €113#7 (1670)80
gcp/expectimax-onnx-34.8 s20≈ €48#2 (1769)1
gcp/expectimax-onnx-44.5 s22≈ €52#3 (1716)1
lab/hunter0.1 s0.7≈ €3#1 (1814)1

Главное наблюдение

Самый сильный бот лестницы — самый дешёвый в 130 раз по цене хода. В живой партии hunter vs monte-carlo на 10-м ходу у monte-carlo на часах 217 s из 300, а у hunter — 326 s: он тратит 0.1 s и складывает в карман инкремент +3 s. Часы hunter растут, часы monte-carlo убывают, и Cloud Run выставляет счёт ровно за эту разницу. Оценщик KCP по факту доминирует по обеим осям — и по силе, и по цене (см. KCP: фича-тактика против глубины поиска).

У обоих ONNX-ботов containerConcurrency=1 — каждая партия из пары поднимает свой оплачиваемый инстанс. У monte-carlo стоит 80 (обе партии делят инстанс), и он всё равно дороже в 2.3 раза: просто думает в 3 раза дольше.

4. Vertex AI — €226/мес: одно ревью PR стоит €0.35

Это не обучение моделей — обучающих джобов в проекте нет вообще. Это run-gemini-cli, автоматическое ревью pull request’ов через Vertex AI по Workload Identity Federation. Так задумано намеренно: в комментарии workflow прямо написано, что путь через AI Studio API-key не умеет тратить кредиты, поэтому выбран Vertex.

Факты за 18 дней (с 12.07, когда workflow раскатали):

МетрикаЗначение
Прогонов gemini-review в 7 репозиториях393
Вызовов модели4 855
Вызовов на одно ревью≈ 12
Input-токенов на ревью≈ 486 000
Output-токенов на ревью≈ 9 200
Соотношение input:output53 : 1
Смешанная цена≈ €0.70 за млн токенов
Цена одного ревью≈ €0.35

Откуда 486k токенов на один PR

Агентная петля пересылает контекст заново на каждом витке. В .gemini/settings.json стоит maxSessionTurns: 50, а промпт требует вызывать add_comment_to_pending_review отдельно на каждую находку. Значит витков = 4 + число находок, и на каждом витке заново уезжают: AGENTS.md (в play-api это ~9k токенов), полный diff, схемы инструментов GitHub MCP и вся предыдущая переписка. Отсюда квадратичный рост: .

Плюс триггер synchronize: ревью запускается на каждый push в PR. Пять коммитов в одну ветку — пять полных ревью по €0.35.

Пин модели не работает

В repo-переменных стоит GEMINI_MODEL=gemini-2.5-flash, и лог прогона это подтверждает. Но Vertex тарифицирует gemini-3.5-flash (4 684 вызова) и gemini-3-flash-preview (171). Вызовов gemini-2.5-flashноль. CLI молча игнорирует пин и берёт свою модель по умолчанию. То есть платим не за ту модель, которую выбрали.

5. Где границы бесплатного

СервисБесплатно в месяцСколько это в наших единицахКак быстро выгорает
Cloud Run vCPU180 000 vCPU-с50 vCPU-часов~13 часов
Cloud Run память360 000 ГиБ-с100 ГиБ-часов~1.5 дня
Cloud Run запросы2 млнне достигаем (≈1 млн/мес)
Vertex AI (Gemini)нет free tierс первого токена
Cloud Storage5 ГБу нас 2.19 МБне достигаем
Artifact Registry0.5 ГБединицы теговне достигаем

Ключевое: у Vertex AI бесплатного тарифа нет вообще. Бесплатный Flash живёт только в AI Studio по API-ключу — а именно от этого пути мы отказались ради кредитов.

6. Рычаги

РычагЭффектУсилиеГде
Снять monte-carlo с лестницы−€113/месPOST /bot/ladder/leaveplay-api
LADDER_MAX_CONCURRENT_PAIRS=1−75% Cloud Runодна env-переменнаяOracle-хост
Ladder на 30+1 вместо 300+3−90% Cloud Runмаленький PR (нужна env-ручка)play-api
Кэширование контекста в Gemini−60…80% Vertexнастройка CLIworkflows
Одна MCP-заявка на все находки−65% Vertexправка промптаworkflows
Ревью только на opened/ready_for_review−40…60% Vertexправка триггераworkflows
Починить пин моделинеизвестно, но платим не за торазобраться с run-gemini-cliworkflows
Убрать дубль с CodeRabbit−€226/месвыключить один из двух ревьюеровworkflows
Перевезти ботов на Oracle A1−€210/месразвернуть по образцу oracle/v1-v3infra

Про снятие monte-carlo с лестницы

Он седьмой из одиннадцати, у него 11 204 партии и RD упёрлось в 62.8 — новые партии почти не добавляют информации. Прецедент уже есть: oracle/v1-v3, cloudflare/*, azure/* все стоят onLadder: false после 10–13k партий. И сам вопрос о силе модели решается не Glicko, а аппаратом SPRT + Bradley-Terry на GET /strength.

7. Жёсткий рубеж: план на конец кредита

Ограничение — деньги, а не дата

Окно кредита: 12.07.2026 — 11.10.2026, остаток на 29.07 — €87.54. При ран-рейте €14.5/день этого хватит на 6 дней, то есть кредит кончится около 4 августа — на 68 дней раньше формального срока. Это противоположность ситуации с Oracle (Oracle Cloud: что бесплатно, а что стоит денег §5), где кредит гарантированно сгорал и экономить было бессмысленно: здесь кредит слишком мал, чтобы дожить до своей даты, поэтому экономия покупает реальное время.

Чтобы дожить до 11 октября, бюджет равен €1.18/день. Что покупает каждый шаг:

Сценарий€/деньХватит наКредит кончится
Как сейчас€14.56 дней~4 августа
Выключить ревью PR€7.012.5 дней~10 августа
+ снять monte-carlo с лестницы€3.426 дней~24 августа
+ LADDER_MAX_CONCURRENT_PAIRS=1€0.997 днейдоживёт до 11.10

Что уже сделано (29.07.2026)

Решение: ревью PR выключено полностью, остаток кредита доедают боты. CodeRabbit ревьюит те же PR, поэтому второй ИИ-ревьюер давал дубль находок за €226/мес. Перенос на AI Studio Free отклонён: наши ~260 вызовов/день заведомо не влезают в урезанный free tier (см. врезку в §7 ниже).

# Выполнено во всех 7 репозиториях; состояние стало disabled_manually
gh workflow disable gemini-review.yml -R rabestro/<repo>
 
# Обратно, если понадобится
gh workflow enable gemini-review.yml -R rabestro/<repo>

Репозитории: dicechess-engine-scala, dicechess-analytics, dicechess-play-api, dicechess-analytics-ui, dicechess-play, home-genie, paperless-genie.

Почему gh workflow disable, а не правка файлов

Выключение через API мгновенно, обратимо одной командой и не требует 7 отдельных PR. Цена решения — состояние живёт не в git, поэтому по репозиторию не видно, почему ревью перестали приходить. Этот раздел и есть компенсация: если Gemini-ревью загадочно молчит, причина здесь.

Осталось сделать руками (нужен Bearer-токен бота, который показывается один раз при регистрации — в БД только хэш, достать его из системы нельзя):

curl -X POST https://play-api.jc.id.lv/bot/ladder/leave \
  -H "Authorization: Bearer <токен gcp/scala-monte-carlo>"

Если токен утерян — ротация (POST /bot/token/rotate) тоже требует текущий токен, так что остаётся либо правка bot_ratings в БД play-api на Oracle-хосте, либо дать лестнице авто-запарковать бота по таймаутам (LADDER_TIMEOUT_PARK_PAIRS) — но второй путь сначала сольёт ему рейтинг.

Триал или уже платный аккаунт?

Через API это не видно — gcloud billing accounts describe отдаёт только open: true. Разница принципиальная: у триала в момент исчерпания кредита ресурсы останавливаются, у платного аккаунта — продолжаются списания с карты. Проверить в консоли до 4 августа обязательно.

Пока кредит жив, экономить бессмысленно — недоиспользованный кредит просто сгорает (та же логика, что в Oracle Cloud: что бесплатно, а что стоит денег §5). Но рубеж надо пройти подготовленным, а не обнаружить его по списанию с карты.

Порядок действий за неделю до конца бонуса:

  1. Vertex AI → выключить или увести на free-tier. Ревью PR за €226/мес не стоит своих денег, тем более что CodeRabbit ревьюит те же PR параллельно. Варианты по возрастанию усилий: (а) отключить workflow совсем, (б) вернуться на AI Studio API-key с бесплатным Flash, (в) оставить Vertex, но с кэшированием, батчингом комментариев и триггером только на открытие PR.

Путь (б) в free tier не влезает — проверено

Наше потребление — ~260 вызовов модели в день (22 ревью × 12 вызовов). Фактические лимиты, снятые с дашборда AI Studio 29.07.2026 (страница лимитов больше не публикует таблицу, они стали per-project и видны только в aistudio.google.com/rate-limit):

ТарифRPMTPMRPD
Free tier5250K20
Tier 1 (платный)1 0002M10 000

20 RPD против 260 вызовов/день — это разрыв в 13 раз, никакими оптимизациями не закрывается. Для справки: проект Pulse Project на free tier уже стоит в лимите (26/20 RPD, 9/5 RPM) от куда более скромного использования. Tier 1 объём переварил бы с запасом, но он платный по токенам — то есть те же деньги, просто через другой API.

Теоретический минимум, который в 20 RPD влез бы: батчинг комментариев в один вызов (12 → 3-4 вызова на ревью) плюс триггер только opened вместо synchronize даёт ~5 ревью в день на один-два репозитория. Это малая доля прежнего покрытия, и RPM 5 запрещает два параллельных ревью. Как бесплатная замена CodeRabbit не годится, но как точечное ревью одного важного репозитория — вариант.

Все 7 репозиториев публичные, так что вопрос с использованием данных на free tier не стоит.

  1. Cloud Run → снять всех ботов с лестницы, кроме hunter. Hunter стоит €3/мес и остаётся первым в лестнице — его можно не трогать. Три остальных дают −€210/мес.
  2. Проверить, что расход упал, прежде чем кредит кончится: сутки наблюдения по метрикам из §9. Не по счёту — счёт отстаёт на часы.
  3. Поставить бюджет с алертами и жёсткий cap (§8) — как страховку от того, что что-то забыли.

Структурный вывод на будущее: боты, у которых сила измеряется потраченным CPU, не должны жить на посекундной тарификации. Правильное место для них — Oracle A1 из Always Free: oracle/v1-v3 играют оттуда за €0 и держат 1459–1678, ровно в полосе GCP-ботов. Cloud Run хорош ровно для таких ботов, как hunter — те, что отвечают за 0.1 s.

8. Как поставить лимит (и почему алерт ≠ лимит)

Сейчас нет ни одного ограничителя

Бюджетов в биллинг-аккаунте не создано вообще — billingbudgets.googleapis.com даже не включён. Единственная граница расхода на сегодня — размер кредита.

Слой 1 — бюджет с алертами (5 минут, обязательный минимум)

Бюджет сам по себе ничего не останавливает — он присылает письмо. Но без него ты не узнаешь о проблеме вовремя.

BILLING=$(gcloud billing accounts list --format='value(ACCOUNT_ID)' | head -1)
gcloud services enable billingbudgets.googleapis.com --project=dice-chess-lab
 
gcloud billing budgets create \
  --billing-account="$BILLING" \
  --display-name="dice-chess-lab monthly" \
  --budget-amount=20EUR \
  --threshold-rule=percent=0.5 \
  --threshold-rule=percent=0.9 \
  --threshold-rule=percent=1.0

Слой 2 — точечные kill switch (реальные лимиты)

Это то, что действительно останавливает трату, и по одному сервису, а не по всему проекту.

Vertex AI — обнулить квоту запросов к Gemini. Наши вызовы идут через location=global, поэтому нужная метрика — именно global_-вариант (проверено через Service Usage API):

метрика: aiplatform.googleapis.com/global_generate_content_requests_per_minute_per_project_per_base_model
unit   : 1/min/{project}/{base_model}

Значение 0 полностью останавливает Gemini (Vertex начинает отдавать 429), Cloud Run при этом продолжает работать. Ставится либо в консоли (IAM & Admin → Quotas, фильтр по метрике), либо через gcloud alpha services quota update — но учти, что группа alpha по умолчанию не установлена и требует gcloud components install alpha. Консольный путь надёжнее.

Это лимит на скорость, не на сумму

Квота измеряется в запросах в минуту, поэтому она не «останавливает трату на €20». Полезны два режима: 0 — полный стоп как kill switch, или небольшое значение — потолок скорости горения.

Cloud Run — ограничить потолок масштаба:

gcloud run services update dicechess-bot-gcp --region=us-central1 --max-instances=1

Но самый чистый kill switch для ботов — на стороне лестницы, а не Cloud Run: POST /bot/ladder/leave означает, что запросы просто перестают приходить, и платить становится не за что.

Слой 3 — автоматическое отключение биллинга (крайняя мера)

Штатный google-паттерн жёсткого потолка: бюджет → Pub/Sub → функция, которая вызывает projects.updateBillingInfo с пустым billingAccountName и отвязывает проект от биллинга.

Что с этим не так

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

9. Как проверить самому

Биллинг-экспорта в BigQuery нет, поэтому суммы в € доступны только в UI консоли. Зато натуральные единицы (часы, токены, запросы) снимаются из Cloud Monitoring, и именно они — ранний индикатор: метрики видны сразу, счёт отстаёт на часы.

TOKEN=$(gcloud auth print-access-token)
START=$(date -u -v-7d +%Y-%m-%dT00:00:00Z); END=$(date -u +%Y-%m-%dT%H:%M:%SZ)
 
# Cloud Run: оплачиваемые instance-часы по дням и по сервисам
curl -s -G "https://monitoring.googleapis.com/v3/projects/dice-chess-lab/timeSeries" \
  --data-urlencode 'filter=metric.type="run.googleapis.com/container/billable_instance_time"' \
  --data-urlencode "interval.startTime=$START" --data-urlencode "interval.endTime=$END" \
  --data-urlencode "aggregation.alignmentPeriod=86400s" \
  --data-urlencode "aggregation.perSeriesAligner=ALIGN_SUM" \
  --data-urlencode "aggregation.groupByFields=resource.labels.service_name" \
  -H "Authorization: Bearer $TOKEN"
 
# Vertex AI: токены по моделям (ищи model_user_id в resource.labels)
curl -s -G "https://monitoring.googleapis.com/v3/projects/dice-chess-lab/timeSeries" \
  --data-urlencode 'filter=metric.type="aiplatform.googleapis.com/publisher/online_serving/token_count"' \
  --data-urlencode "interval.startTime=$START" --data-urlencode "interval.endTime=$END" \
  --data-urlencode "aggregation.alignmentPeriod=86400s" \
  --data-urlencode "aggregation.perSeriesAligner=ALIGN_SUM" \
  -H "Authorization: Bearer $TOKEN"
 
# AI Studio — ДРУГОЙ API и другие проекты, в метриках Vertex его не видно.
# Обрати внимание: input-метрики тут нет, отдаётся только output.
curl -s -G "https://monitoring.googleapis.com/v3/projects/gen-lang-client-0206785287/timeSeries" \
  --data-urlencode 'filter=metric.type="generativelanguage.googleapis.com/generate_content_usage_output_token_count"' \
  --data-urlencode "interval.startTime=$START" --data-urlencode "interval.endTime=$END" \
  --data-urlencode "aggregation.alignmentPeriod=86400s" \
  --data-urlencode "aggregation.perSeriesAligner=ALIGN_SUM" \
  -H "Authorization: Bearer $TOKEN"

Тарифы и фактические лимиты по каждому проекту AI Studio — только глазами: aistudio.google.com/rate-limit, переключатель Project в шапке. Там же видно, какой проект на Free tier, а какой на Tier 1.

Два быстрых sanity-check без curl:

# сколько партий крутится прямо сейчас и с каким таймконтролем
curl -s https://play-api.jc.id.lv/games | jq 'length'
 
# сколько ревью прогнали за период (по каждому репозиторию)
gh run list -R rabestro/dicechess-play-api --workflow=gemini-review.yml \
  --created '>=2026-07-12' --limit 200 --json databaseId -q 'length'

10. Оговорки

  • Суммы в € посчитаны из метрик Monitoring и наблюдаемого счёта, не из billing-экспорта. Порядок верный, точные цифры — за консолью. Если хочется точности по SKU, надо включить экспорт биллинга в BigQuery: тогда расходы станут доступны через bq и SQL.
  • Остаток и дата окончания кредита через API не отдаются — только UI консоли, поэтому цифры §7 (€87.54, окно 12.07 — 11.10) сняты глазами 29.07.2026 и требуют пересмотра при каждом возврате к этой заметке.
  • Проекция «€435/мес» предполагает неизменную конфигурацию. Каждый добавленный на лестницу бот на Cloud Run — это плюс ~€45/мес, а каждый новый репозиторий с gemini-review — плюс ~€0.35 за PR-push.
  • Регион GCP-ботов (us-central1) на счёт не влияет — сетевой round-trip до play-api во Франкфурте оплачивает ожидающая сторона, а не контейнер. Это вопрос латентности, не денег.