AWS Builder Center

Part 1 - Managing Amazon Bedrock Quotas and Capacity at Scale

A practical guide for teams running production GenAI workloads on Amazon Bedrock

This article was co-authored by Manojit Saha Sardar (manojits@), a Senior Cloud Support Database Engineer at AWS specializing in AWS DMS, Amazon RDS, and Aurora PostgreSQL, with 7 years in high-impact database escalations and migration troubleshooting.

Introduction

As organizations move generative AI applications from prototype to production, one of the most critical — and often overlooked — operational concerns is capacity management. Amazon Bedrock provides powerful foundation models through a simple API, but understanding how quotas work, how to monitor utilization, and how to plan for growth can mean the difference between a smooth launch and unexpected throttling at peak traffic.
This post shares practical guidance for engineering and platform teams managing Bedrock quotas across multiple accounts, environments, and models.

Understanding Bedrock's Capacity Model

Amazon Bedrock uses a layered capacity system. Understanding each layer helps you plan appropriately:

On-Demand Quotas

Every AWS account has default quotas for each model:
·       Tokens Per Minute (TPM) — the maximum tokens processed per minute (input + output combined, with burndown rates applied)
·       Requests Per Minute (RPM) — the maximum number of API calls per minute
These are enforced per-account, per-model, per-region. You can request increases through the AWS Service Quotas console.

Cross-Region Inference (CRIS)

Cross-Region Inference routes requests across multiple regions automatically. This provides:
·       2x burst capacity at no additional cost
·       Automatic failover if one region is constrained
·       Same pricing as single-region inference
Recommendation: Always use Global CRIS (global. prefix) for production workloads unless you have data residency requirements. It's the single easiest way to reduce throttling risk.

Reserved Tier

For workloads requiring guaranteed throughput, the Reserved Tier provides dedicated capacity:
·       Guaranteed input TPM, output TPM, and RPM
·       Accessed by passing serviceTier: { type: "reserved" } in API calls
·       Separate from on-demand quotas — they don't share limits
·       1 or 3 month commitment
Key point: Reserved Tier capacity exists alongside your on-demand quota. You need to explicitly opt in per request. Without the serviceTier parameter, all traffic goes to on-demand.

The Token Burndown Rate: Why You Hit Limits Faster Than Expected

For models on the bedrock-runtime endpoint, output tokens consume quota at a higher rate than input tokens. The burndown rate varies by model family.
Note: Token burndown rates apply only to models on the bedrock-runtime endpoint. Models available exclusively on the bedrock-mantle endpoint have separate input and output TPM quotas, so burndown does not apply.
Quota consumed = Input Tokens + Cache Write Tokens + (Output Tokens × burndown rate)
Cache read tokens don't count toward on-demand quota.
This means a request with 10,000 input tokens and 500 output tokens and 15x burn down rate doesn't consume 10,500 tokens of quota — it consumes 17,500.
10,000 + (500 × 15) = 17,500.
This makes right-sizing max_tokens and monitoring EstimatedTPMQuotaUsage even more critical as you adopt newer model versions.
For models with large output (code generation, long-form content), this multiplier significantly reduces effective throughput. Monitor EstimatedTPMQuotaUsage in CloudWatch — it applies burndown rates automatically and gives you the true quota consumption.

The `max_tokens` Reservation Trap

This is the most commonly missed cause of unexpected throttling.
When you make a Bedrock API call, the system reserves quota upfront based on your max_tokens parameter:
Upfront reservation = Input Tokens + CacheWriteInputTokens + max_tokens
This reservation is deducted from your TPM quota before the model starts generating output. If the reservation would exceed your remaining quota, the request is throttled immediately.
After the response completes, the system adjusts the deduction to reflect actual usage:
1
Final quota consumed = InputTokenCount + CacheWriteInputTokens + (OutputTokenCount × burndown_rate)
The unused portion (the difference between the upfront reservation and the final consumption) is then replenished to your quota.
Why this matters: If you set max_tokens: 4096 but your model typically generates 200 tokens, you're reserving 4,096 tokens of quota per request upfront — even though final consumption will only be 200 x 5 = 1000 (for a 5x burndown model). During burst traffic, these large upfront reservations stack up across concurrent requests and trigger throttling even though your actual post-completion usage shows plenty of headroom.
The key insight: upfront reservation is 1:1 for max_tokens (no burndown applied), but it still blocks quota capacity until the request completes. With high concurrency and an oversized max_tokens, you exhaust your TPM budget in reservations alone.

Fix

Right-size max_tokens to your expected output length plus a reasonable buffer:
# Instead of this (common default):
response = client.converse(
    modelId="global.anthropic.claude-sonnet-4-6",
    messages=messages,
    inferenceConfig={"maxTokens": 4096}  # ← Over-reserving quota
)
 
# Do this:
response = client.converse(
    modelId="global.anthropic.claude-sonnet-4-6",
    messages=messages,
    inferenceConfig={"maxTokens": 512}  # ← Right-sized for your use case
)
max_tokens is an output-length ceiling — a raw count of tokens the model may generate. Burndown is not applied to it. So a 512 means "up to 512 output tokens,". A 200-token response fits regardless of burndown.
  - Burndown applies only to quota accounting, not to the length limit. It never caps or changes how long your response can be.
For applications with variable output length, consider setting max_tokens based on the P95 of your actual output distribution rather than the model's maximum.
 
 

Multi-Account Quota Management

Most organizations run separate AWS accounts for development, QA, staging, and production. A common failure pattern:
1.     Development team gets quota increase on QA account during load testing
2.     Application passes all performance tests in QA
3.     Launch day: production account still has default quotas → immediate throttling

Best Practice: Quota Parity Matrix

Maintain a matrix of quotas across environments:
ModelDevQAStagingProd
Claude Opus
4.6 (Global CRIS TPM)3M6M ✅3M ⚠️3M ⚠️
Claude Haiku
4.5 (Global CRIS TPM)5M5M5M5M
When you increase quotas in QA for load testing, immediately request the same increases for Prod — don't wait until launch day.
Any opinions in this article are those of the individual author and may not reflect the opinions of AWS.
Enjoyed reading this content? Let the author know!

Your likes, comments, shares, and saves help creators reach more builders.

Loading recommendations

Loading article