Quick Answer (TL;DR)
Most AI-using companies now spend on Amazon Bedrock, Vertex AI, Azure OpenAI, and SageMaker at the same time, because model choice follows tasks, not cloud loyalty. Each provider shows its own slice in its own units (tokens, node-hours, instance-hours, PTUs), so nobody sees the total. One AI bill takes three steps: pull all three clouds' billing exports into one place, map the AI services into a single cost category with a maintained mapping table, and treat standing resources (endpoints, provisioned throughput) differently from jobs (which should be costed by actual runtime, not calendar months). The blocker is never math; it's that the mapping has no owner.
Why this happens
Teams pick models per task: Claude for one workload, Gemini for another, GPT deployments in the Azure tenant the enterprise agreement lives in, and SageMaker for everything self-hosted. Each platform bills in its own vocabulary: Bedrock in tokens and provisioned throughput units, Vertex in node-hours and job runs, Azure OpenAI in tokens and PTU-hours inside a subscription, SageMaker in instance-hours across a dozen resource types. Finance sees four fragments in three invoices, engineering sees four consoles, and the question "what does AI cost us" gets answered with a shrug or a two-week spreadsheet that's stale on arrival. Meanwhile the AI line is usually the fastest-growing item on the bill, which is exactly the wrong place for a shrug.
Fix #1: One category, mapped from the exports
You already have the raw material: every cloud ships a complete billing export (CUR or Data Exports on AWS, BigQuery billing export on GCP, Cost Management exports on Azure). Land all three in one warehouse (the mechanics are a solved problem) and maintain one mapping view that tags AI spend:
CASE
WHEN service_name IN ('Amazon Bedrock', 'Amazon SageMaker') THEN 'ai'
WHEN service_name LIKE '%Vertex AI%' THEN 'ai'
WHEN service_name LIKE '%Cognitive Services%'
OR service_name LIKE '%Azure OpenAI%' THEN 'ai'
ELSE category
END AS spend_category
Add the adjacent lines people forget (GPU instances serving self-hosted models, vector databases, AI-dedicated storage) and you have the number: AI spend, per cloud, per month, from the same reconciled data as the rest of the bill.
Fix #2: Attribute inside the category
One total invites the next question: which team, which product, which model. Reuse the attribution machinery the rest of your bill uses: tags and labels on SageMaker and Vertex resources, Azure OpenAI deployments per team, and Bedrock's cost allocation surfaces, plus account or subscription boundaries where tags are thin. The per-model split matters more here than anywhere else in cloud cost, because switching a workload one model tier down is frequently a 5x price change with negligible quality loss, and that decision needs per-model numbers to exist.
Fix #3: The standing-versus-job edge case that skews everything
AI resources split into two billing shapes, and mixing them corrupts reports. Standing resources bill while they exist: real-time endpoints, provisioned throughput, notebook instances, feature stores. Jobs bill for their runtime: training, tuning, batch inference, evaluations. A report that treats a 6-hour training job as a monthly line shows phantom cost; one that ignores an idle 24/7 endpoint hides real cost. Cost jobs by actual runtime and audit standing resources for idleness separately.
This split is also where tooling earns its keep, because doing it by hand across four platforms is the part that decays first. ZopNight, for instance, discovers and prices the full estate as one inventory: Bedrock end to end (agents, knowledge bases, guardrails, custom models, provisioned throughput, and customization, batch-inference, and evaluation jobs), GCP Vertex AI (endpoints, models, feature stores, Workbench notebooks, and training, tuning, and batch-prediction jobs), Azure OpenAI, AI Foundry, AI Search, and Azure ML with cost and start-stop scheduling, and SageMaker down to its job types, with jobs costed by how long they actually ran so a finished job stops adding cost (docs). One inventory, per-resource cost, all four surfaces in the same pane as the rest of the cloud bill.
How to prevent this
- Give the mapping an owner. New AI services appear quarterly; an unowned mapping view is stale in one.
- Adopt-a-service checklist: before a team uses a new AI platform, name how it bills, which export line it lands on, and who owns its cost.
- Tag at creation for AI resources exactly like everything else; endpoints and jobs inherit team attribution from IaC.
- Report AI as a first-class category monthly (total, per cloud, per team, per model tier), next to compute and storage, not buried in "other".
- Watch the two growth curves separately: standing-resource cost (a capacity decision) and job cost (a usage signal), because they call for different responses.
FAQ
How do I see Amazon Bedrock costs per model or per team?
Bedrock's billing lines break down by model and its cost attribution has grown genuinely granular (per-user and per-model views). For team-level rollups, combine the billing export with your tagging or account boundaries; for enforcement rather than reporting, you need budgeted keys in front of the API, which is a different problem from visibility.
Is provisioned throughput billed when idle?
Yes. Bedrock provisioned throughput and Azure OpenAI PTUs bill for the commitment while it exists, used or not, exactly like a reserved instance. Idle provisioned capacity is the single most expensive AI waste pattern; walk it back to on-demand tokens when sustained utilization doesn't justify it.
What's the FOCUS spec and does it help here?
FOCUS is the FinOps Foundation's common billing schema that AWS and Azure ship natively and GCP maps to. It normalizes column vocabulary so your cross-cloud AI view is one table instead of three schemas; the AI category mapping still has to be yours, since FOCUS normalizes columns, not opinions.
Should self-hosted GPU inference count as AI spend?
Yes, tagged as such. The g5/g6/p4/p5 instances serving your own models are AI cost that never says "AI" on the bill line, and leaving them in generic compute understates the category by whatever your self-hosted footprint is, which for many teams is the majority of it.
Top comments (0)