← Back to Blog
AWS BedrockAzure OpenAIEnterpriseAI AgentsCost ControlBudgetTokenFenceCloudPython

AWS Bedrock & Azure OpenAI Cost Control: How to Set Budget Limits on Enterprise Cloud LLM APIs Before Your Cloud Bill Explodes

·11 min read

Enterprise Cloud LLM APIs: Cheaper Per Token, More Expensive In Practice

AWS Bedrock and Azure OpenAI Service look like the obvious choice for enterprise teams. Managed infrastructure. SLAs. Compliance certifications. VPC integration. But enterprise cloud LLM APIs add three layers of hidden costs that direct APIs don’t — and most teams discover them after the first $50K invoice.

Here’s the enterprise cloud LLM pricing reality in March 2026:

Provider / ModelInput (/1M tokens)Output (/1M tokens)Hidden Costs
Azure OpenAI GPT-4o$2.50$10.00PTU commitments, data zone charges
Azure OpenAI GPT-4o-mini$0.15$0.60Per-deployment overhead
AWS Bedrock Claude 3.5 Sonnet$3.00$15.00Cross-region transfer, VPC endpoint
AWS Bedrock Llama 3.1 70B$0.99$0.99Provisioned throughput minimums
AWS Bedrock Titan Text$0.15$0.20Knowledge base retrieval charges
Azure OpenAI o1$15.00$60.00Reasoning tokens not in estimate

The per-token prices look competitive. The bills don’t. Here’s why.

Five Enterprise Cloud Cost Traps That Don’t Exist With Direct APIs

Trap 1: Provisioned Throughput Commitments (The “Gym Membership” Problem)

Both AWS and Azure push teams toward provisioned throughput for production workloads. AWS Bedrock Provisioned Throughput requires minimum 1-month commitments. Azure PTUs (Provisioned Throughput Units) are billed per hour whether you use them or not.

The trap: Your team provisions for peak load. Your actual usage is 30% of peak. You’re paying 3x what you’d pay with on-demand — but the commitment is locked.

from tokenfence import guard

# Guard against over-provisioning: set per-request budgets
# so you know actual costs before committing to provisioned throughput
client = guard(
    bedrock_client,
    max_cost=2.00,        # Per-request cap: never exceed $2 per invocation
    max_requests=50,       # Kill switch: 50 max calls per workflow
    warn_at=0.75           # Alert at 75% budget consumed
)

# Now you have REAL per-request cost data to size your provisioned throughput

Trap 2: Cross-Region Data Transfer Charges

AWS Bedrock models aren’t available in every region. Your application is in us-east-1, but the model you need is in us-west-2. Cross-region data transfer adds $0.02/GB on top of the model inference cost. For agents processing large documents, that’s an extra 5-15% on your bill — invisible until the invoice.

Trap 3: Knowledge Base and RAG Retrieval Charges

AWS Bedrock Knowledge Bases charge for retrieval separately from inference. Each RetrieveAndGenerate call bills for: embedding the query, searching the vector store, and then the LLM inference. A single RAG query can trigger 3-5 billable operations.

from tokenfence import guard

# Guard RAG pipelines: the total cost includes retrieval + inference
client = guard(
    bedrock_client,
    max_cost=5.00,         # Total budget for the full RAG pipeline
    max_requests=100,      # Cap retrieval + generation calls
    model_downgrade={
        "anthropic.claude-3-5-sonnet-20241022-v2:0": "anthropic.claude-3-haiku-20240307-v1:0",
        "amazon.titan-text-premier-v1:0": "amazon.titan-text-lite-v1"
    }
)

Trap 4: Per-Deployment Overhead on Azure

Azure OpenAI requires creating a deployment for each model. Each deployment has a minimum TPM (tokens per minute) allocation. Teams commonly create dev, staging, and production deployments for the same model. Three deployments at 10K TPM each = 30K TPM reserved, even if only one is active.

Trap 5: The Compliance Tax — VPC Endpoints and Private Links

Enterprise security requirements mean VPC endpoints (AWS) or Private Endpoints (Azure). These cost $7.30-$10/month per endpoint, per AZ. A multi-model, multi-region setup can add $200-500/month in endpoint costs alone — before a single token is processed.

Five-Step Enterprise Cloud Cost Control With TokenFence

Step 1: Per-Request Budget Caps (Both Platforms)

from tokenfence import guard

# AWS Bedrock
bedrock_safe = guard(
    bedrock_runtime_client,
    max_cost=3.00,
    max_requests=100
)

# Azure OpenAI
azure_safe = guard(
    azure_openai_client,
    max_cost=3.00,
    max_requests=100
)

# Same API. Same protection. Both platforms.

Step 2: Automatic Model Downgrade (Cloud-Specific Model IDs)

Cloud model IDs are different from direct API model names. TokenFence handles both:

# AWS Bedrock model downgrade chain
bedrock_safe = guard(
    bedrock_client,
    max_cost=5.00,
    model_downgrade={
        # Sonnet → Haiku when budget runs low
        "anthropic.claude-3-5-sonnet-20241022-v2:0": "anthropic.claude-3-haiku-20240307-v1:0",
        # Titan Premier → Titan Lite
        "amazon.titan-text-premier-v1:0": "amazon.titan-text-lite-v1"
    }
)

# Azure OpenAI model downgrade chain
azure_safe = guard(
    azure_client,
    max_cost=5.00,
    model_downgrade={
        # GPT-4o → GPT-4o-mini when budget runs low
        "gpt-4o": "gpt-4o-mini",
        # o1 → GPT-4o for cost-sensitive fallback
        "o1": "gpt-4o"
    }
)

Step 3: Kill Switch for Runaway Agents

from tokenfence import guard

safe_client = guard(
    client,
    max_cost=10.00,       # Hard ceiling
    max_requests=200,      # Absolute maximum calls
    warn_at=0.80           # Alert at 80%
)

try:
    # Your agent loop
    for task in agent_tasks:
        result = safe_client.invoke_model(...)
except Exception as e:
    if "budget exceeded" in str(e).lower():
        # Alert the team, don’t retry
        alert_ops_team(f"Agent killed: {e}")
        log_cost_event(safe_client.total_cost)

Step 4: Per-Department Budget Allocation

Enterprise teams need per-department or per-team budgets. Marketing shouldn’t blow engineering’s budget:

from tokenfence import guard

# Per-department budget guards
engineering_client = guard(client, max_cost=500.00, max_requests=10000)
marketing_client = guard(client, max_cost=100.00, max_requests=2000)
data_science_client = guard(client, max_cost=200.00, max_requests=5000)

# Each department gets its own budget ceiling
# No cross-contamination. No surprise overruns.

Step 5: Policy Engine for Tool-Level Permissions

from tokenfence import Policy

# Enterprise policy: restrict what agents can do on cloud infrastructure
policy = Policy()
policy.allow("bedrock:InvokeModel")          # Can invoke models
policy.allow("bedrock:Retrieve")              # Can search knowledge bases
policy.deny("bedrock:CreateModelCustomization*")  # Cannot start fine-tuning
policy.deny("bedrock:DeleteProvisionedModel*")    # Cannot delete provisioned capacity
policy.require_approval("bedrock:InvokeModel:anthropic.claude-3-5-sonnet*")  # Expensive models need approval

result = policy.enforce("bedrock:InvokeModel:anthropic.claude-3-5-sonnet-20241022-v2:0")
# Returns: REQUIRE_APPROVAL — human must approve this expensive call

AWS Bedrock vs Azure OpenAI: Cost Comparison for Agent Workloads

ScenarioAWS Bedrock CostAzure OpenAI CostWith TokenFence
Simple chatbot (1K msgs/day)$45/mo (Haiku)$35/mo (GPT-4o-mini)Auto-downgrade saves 20-40%
RAG pipeline (10K queries/day)$300/mo (Sonnet + KB)$250/mo (GPT-4o + search)Per-query budgets prevent spikes
Multi-agent system (5 agents)$2,000/mo (Sonnet)$1,800/mo (GPT-4o)Per-agent caps + kill switch = predictable
Document processing (50K docs/mo)$5,000/mo (Titan + Sonnet)$4,500/mo (GPT-4o)Tiered downgrade saves 30-50%
Production agentic workflow$10,000+/mo$8,000+/moBudget pooling + alerts = no surprises

Enterprise Cloud Cost Control Comparison

ApproachPer-Request LimitsAuto DowngradeKill SwitchMulti-CloudSetup Time
AWS Budgets / Cost Explorer❌ Monthly only⚠️ Delayed (hours)❌ AWS only30 min
Azure Cost Management❌ Monthly only⚠️ Delayed (hours)❌ Azure only30 min
Cloud billing alerts❌ (alert only)⚠️ Per-cloud15 min
Custom middleware⚠️ DIY⚠️ DIY⚠️ DIY⚠️ DIY2-4 weeks
TokenFence✅ Exact✅ Automatic✅ Built-in✅ Both platforms3 min

Eight-Point Enterprise Cloud Cost Control Checklist

  1. Set per-request budgets on every model invocation. Cloud billing is monthly. By the time you see the alert, you’ve already spent. guard(client, max_cost=X) catches it per-request.
  2. Map your model downgrade chain. Use cloud-specific model IDs. Sonnet → Haiku on Bedrock, GPT-4o → GPT-4o-mini on Azure. Quality degrades gracefully, bill doesn’t spike.
  3. Add kill switches. max_requests=N on every workflow. Runaway loops get stopped, not billed.
  4. Audit provisioned throughput monthly. Compare PTU/provisioned costs against actual on-demand usage. Most teams overprovision by 2-3x.
  5. Check cross-region charges. If your app and model are in different regions, calculate the data transfer cost. It’s often cheaper to deploy the app in the model’s region.
  6. Use the Policy engine. Restrict which models agents can invoke. Deny fine-tuning and provisioning operations. Require approval for expensive model calls.
  7. Track per-department spend. Separate budget guards for each team. Marketing’s experiment shouldn’t blow engineering’s production budget.
  8. Log everything to your observability stack. safe_client.total_cost → CloudWatch / Azure Monitor / Datadog. Correlate cost with business value.

Getting Started

# Python
pip install tokenfence

# Node.js / TypeScript
npm install tokenfence

Three lines of code. Per-request budgets on AWS Bedrock and Azure OpenAI. Automatic model downgrade with cloud-specific model IDs. Kill switches that work per-request, not per-month. Policy enforcement that restricts what agents can do on your cloud infrastructure.

Cloud billing dashboards tell you what you spent. TokenFence stops you from spending it.

TokenFence is open source (MIT). Community edition is free with zero limits. Pro adds dashboard, alerts, and budget pooling across teams. tokenfence.dev/pricing

Ready to protect your AI budget?

Two lines of code. Per-workflow budgets. Automatic model downgrade. Hard kill switch.