AI Cost Lab / article
Bedrock · FinOps + harness
Amazon Bedrock spend playbook
A sequenced playbook for Bedrock: cache economics, client-error waste, routing, cross-region, batch, reserved capacity, distillation, and how FinOps should read CUR.
Amazon Bedrock looks like “one API, many models.” The bill is four token types, three consumption modes, cache write premiums, and a gateway that often erases user identity. This playbook follows AWS’s own 2025–2026 guidance, in the order that usually pays back first. Re-check the Bedrock pricing page before you lock a reservation; numbers below are vendor claims, not a quote.
How the meter actually works
You are charged for input, output, cache-read, and cache-write tokens. Each has its own CUR usage type. If finance only sums input+output, caching-heavy apps will not reconcile to the invoice (CUR 2.0 notes).
Consumption modes (ML blog, Jun 2025):
| Mode | When | Cost shape |
|---|---|---|
| On-Demand | POCs, spiky, unknown traffic | Pay per token |
| Batch | Nightly jobs, evals, pre-generation | ~50% vs On-Demand on supported FMs |
| Provisioned / Reserved tier | Steady production, custom models, hard SLAs | Hourly capacity; 1- and 6-month commitments |
Customization order AWS recommends: prompt engineering → RAG → (then) fine-tune / distill. Prompt work has no extra infrastructure beyond inference.
Nova-class price spreads are large (Ohio, as of 21 May 2025 in that post): Nova Micro vs Lite vs Pro is not a rounding error. Start with automatic model evaluation, then LLM-as-judge, then humans.
Sequence: waste first, architecture second
AWS’s Jul 2026 high-volume series is the best operational order (Part 1, Part 2).
| Priority | Lever | Effort | Typical savings (AWS) | Who |
|---|---|---|---|---|
| 1 | Client errors above 5% | Low | 5–15% of spend | Engineering |
| 2 | Cache hit rate toward 80%+ | Medium | 10–25% | Engineering (prompts) |
| 3 | Global cross-region inference | Low | ~10% + fewer throttles | Platform / FinOps policy |
| 4 | Batch or Flex for async | Low–medium | 50% on that traffic | FinOps + owners |
| 5 | Model routing | Medium–high | 15–30% | Engineering |
| 6 | Token volume (compaction) | Medium | 10–20% of input | Engineering |
| 7 | Reserved capacity | Config | SLA, not a discount | FinOps + platform |
| 8 | Distillation | High | Up to 75% on narrow tasks | ML eng |
1. Client errors are real spend
Failed calls can still write cache and consume input tokens. Retries multiply 2–5×. Error rate bands from Part 1:
- Under 1%: noise
- 1–5%: quantify dollars
- 5–10%: staff it
- Over 10%: P1 leak
Decompose InvocationClientErrors: guardrail blocks are intentional. Context overflow and malformed bodies are waste. Watch weekday vs weekend — app bugs cluster on business hours.
FinOps: put error-driven token cost on the same dashboard as successful invocations.
Engineering: fix validation before the model call; stop retrying ValidationException.
2. Prompt caching is not free
Marketing line: up to 90% off input and 85% latency (Bedrock cost optimization, prompt caching).
Economics (Part 1):
| Operation | vs base input |
|---|---|
| Cache read | 0.1× |
| Cache write, 5-minute TTL | 1.25× |
| Cache write, 1-hour TTL | 2.0× |
Break-even hit rate is about 12% at 5-minute TTL. Healthy is >80% hits and a read:write > 3:1. Below 50% hits, caching can increase spend. At high volume, writes can be 50%+ of spend even when caching is net-positive; going from 62% to 80% hits saves money mostly by writing less.
CloudWatch: CacheReadInputTokenCount, CacheWriteInputTokenCount under AWS/Bedrock.
Engineering rules:
- Static prefix first: tools, system, ordered reference docs; dynamic user text last.
- Identical document order every call (order is the cache key).
- Checkpoints after stable content (
cachePoint/cache_control). Explicit vs implicit depends on the model (prompt-caching user guide). - Caching is for On-Demand, not the batch inference API.
- Cross-region at high demand can increase cache writes.
Client-side exact-match cache plus Bedrock prefix cache is the hybrid AWS describes in the Jun 2025 ML post. Semantic similarity cache is your app, not Bedrock.
FinOps: alert when 7-day writes exceed reads. That is an engineering incident.
3. Routing: family IPR vs your own harness
Intelligent Prompt Routing sends each prompt to the cheaper sibling in-family when predicted quality is close. Claimed up to ~30% cost with little accuracy loss on simpler tasks. Default routers vs configured routers (responseQualityDifference, fallback model). English-optimized; not magic for specialist domains.
Custom tiering (Part 1 examples):
| Tier | Example | Relative cost |
|---|---|---|
| Fast | Claude Haiku 4.5 | 1× |
| Standard | Claude Sonnet 4.6 | ~10× |
| Premium | Claude Opus 4.x | ~25× |
If one model is >70% of spend and a cheaper model already passed evals, you have a routing ticket.
IPR is centralizable (platform turns on a router ARN). Task-aware routing (code vs classify vs long agent) stays in your gateway.
4. Cross-region before you buy reserved
| Profile | Data boundary | Cost note |
|---|---|---|
| Single Region | One Region | Base quota and price |
| Geographic | US / EU / APAC | Same price as source, more throughput |
| Global | Commercial Regions | ~10% vs Geographic (Part 1) |
Throttling on one Region: try geographic/global before Reserved. Reserved is for remaining SLA gaps, not the first throttle.
Watch: in-region vs cross-region usage types in CUR use different unit prices.
5. Batch, Flex, and pre-generation
Batch: one input file, S3 output, ~50% off. Product copy, embeddings-style jobs, eval suites, “generate descriptions at night” belong here (ML blog).
FinOps can mandate “if p99 latency SLA is hours, it is batch.” Engineering must split the code path.
6. Reserved capacity — after waste is gone
Part 2: if you still see >1,000 throttles/week with cross-region on, evaluate Reserved. <100/week: monitor. Strict p99 latency: reserved + priority.
Sizing trap: cache writes count toward Reserved TPM. If writes are ≥50% of tokens, invocation counts understate capacity need. Size from peak InputTokenCount + CacheWriteInputTokenCount + OutputTokenCount × 1.2, not averages.
Reserved is not the savings lever. Cross-region is cheaper throughput; reserved is guaranteed throughput at a premium.
Customized models historically required provisioned throughput to serve — confirm current docs for your model.
7. Distillation and RAG index cost
Model Distillation: student up to 500% faster and 75% cheaper, <2% accuracy loss on some RAG tasks. Part 2 says it pays when you have narrow, stable tasks, objective metrics, and on the order of 10M+ invocations/month. Creative/open-ended or fast-changing prompts: skip.
Knowledge Bases: indexing (objects / OCU-hours) can rival inference if you re-index junk. Keep only retrieval-relevant data and slow the index cadence (CFM series).
8. Quota: max_tokens and output burndown
Bedrock reserves max_tokens against TPM, then refunds unused. Inflated caps reduce concurrency. Some Claude 4-class models use 5× output burndown on quota (you still pay for actual output) (ops playbook).
This is 100% harness configuration.
Attribution: FinOps’s Bedrock-specific job
Goal → mechanism (cost management):
| You need | Use |
|---|---|
| $/team on the invoice | IAM principal attribution |
| $/application | Application inference profiles or Projects |
| Per-prompt tokens | Request metadata + model invocation logs |
| Invoice dollars and prompt detail | Native method plus logs |
AIP: one profile per model × team × tag set; activate tags in Billing; wait 24h; not retroactive. Tag at team/cost-center, not per human, or profile count explodes.
Gateway: invoice identity is the gateway role unless you assume per user/tenant. For per-call user/feature without STS storms, use request metadata on every Converse/InvokeModel.
Inference-level cost allocation tags (re:Invent 2024 / CFM series) exist so inference is a first-class CFM object, like EC2 hours.
A 30-day Bedrock control loop
Week 1 (FinOps + platform)
- Turn on invocation logging.
- Create tagged application inference profiles for the top three workloads.
- Dashboard: spend by model, cache read vs write, client errors, throttles.
Week 2 (engineering)
- Reorder prompts for cache; measure 7-day read/write.
- Cap agent steps and retries; right-size
max_tokens. - Move one async job to batch.
Week 3
- Eval a cheaper model on 10% of a classified traffic slice (or turn on IPR for an in-family pair).
- Enable geographic or global inference profiles if residency allows.
Week 4
- Cost+quality gate in CI for the hottest prompt.
- Only then talk Reserved, if throttles remain.
What not to do
- Buy provisioned throughput because “production should be reserved” while cache-write is 1.25× on every miss.
- Optimize cost per token while agents add unconstrained tool loops.
- Trust Cost Explorer alone for prompt-level chargeback.
- Enable 1-hour cache TTL on low-reuse prefixes (2× write).
Bedrock gives you the knobs. Most of the savings still sit in git.
Sources
- Amazon Bedrock Cost Optimization — product page: cache, IPR, distillation, batch.
- Effective cost optimization strategies for Amazon Bedrock — Jun 2025; pricing modes, tagging, cache, batch.
- Optimizing cost for FMs with Amazon Bedrock — Apr 2025 CFM series; inference tags, KB indexing.
- Bedrock costs at scale, Part 1 — Jul 2026.
- Bedrock costs at scale, Part 2 — Jul 2026.
- Prompt caching and Intelligent prompt routing — AWS user guides.
- Track usage and costs — attribution matrix.
- Advanced operations playbook —
max_tokensand burndown.