Claude on Bedrock — cross-region inference profile errors (2026) — Fix Guide (2026) | AI Error Hub
Home Providers Claude Bedrock cross-region
Claude Bedrock · Cross-Region Inference Severity: Medium HTTP 400

Claude on Bedrock — cross-region inference profile errors

Cross-region inference (CRIS) is AWS Bedrock's answer to regional capacity constraints. Claude requests use profile IDs (<code>us.anthropic.claude-opus-4-7</code>) that route across regions transparently. Misconfiguring the profile or IAM permissions produces confusing errors.

By Sana K. · Cloud AI Reliability Engineer Published 2026-07-26 Verified 2026-07-26

Quick fix (TL;DR)

Resolution: To call Claude on Bedrock efficiently, use cross-region inference profile IDs like us.anthropic.claude-opus-4-7-20250514 or eu.anthropic.claude-sonnet-5-.... Fix errors by (a) using the profile ID (not the base model ID) in modelId, (b) requesting the model in every region the profile spans (not just your home region), (c) granting IAM bedrock:InvokeModel permission for every region in the profile, and (d) verifying the profile is available in your account.

Real error messages you'll see

These are the exact strings returned by the Claude API service and its SDKs when this error occurs. Copy-paste-searching any of them should land on this page.

AccessDeniedException — model not enabled in cross-region target
botocore.exceptions.ClientError: An error occurred (AccessDeniedException) when calling the InvokeModel operation: You don't have access to the model with the specified model ID.
ValidationException — wrong ID format
botocore.exceptions.ClientError: An error occurred (ValidationException) when calling the InvokeModel operation: Invocation of model ID anthropic.claude-opus-4-7-20250514-v1:0 with on-demand throughput isn't supported. Retry your request with the ID or ARN of an inference profile that contains this model.
IAM insufficient across profile regions
botocore.exceptions.ClientError: An error occurred (AccessDeniedException) when calling the InvokeModel operation: User is not authorized to perform: bedrock:InvokeModel on resource: arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-opus-4-7-20250514-v1:0

Reference

CRIS profile ID pattern

Region prefixRegion spanExample ID
us.US regions (us-east-1, us-east-2, us-west-2)us.anthropic.claude-opus-4-7-20250514-v1:0
eu.EU regions (eu-west-1, eu-central-1, eu-north-1)eu.anthropic.claude-sonnet-5-...
apac.Asia-Pacific regionsapac.anthropic.claude-sonnet-5-...
(no prefix)On-demand single-region (not always available)anthropic.claude-3-5-haiku-...

What CRIS gives vs single-region

AspectSingle-regionCross-region (CRIS)
CapacityOne region's poolSum across profile regions
LatencyLowest (local region)Slightly higher variance
AvailabilityFails if home region degradesAbsorbs regional outages
IAMOne regionEvery region in the profile
Data residencyYes, guaranteedBounded to profile's regions
On-demand accessBeing deprecated for newer modelsRequired for most 4.x+ models

Root causes, ranked by frequency

Based on developer reports across Claude API forums, GitHub issues, and Anthropic community during 2025–2026.

  • 28%
    Using base model ID instead of CRIS profile ID. Newer Claude models on Bedrock cannot be invoked directly by base model ID; on-demand is disabled.
  • 18%
    Model not enabled in every region of the profile. Enabled in us-east-1 but not us-west-2; CRIS may route there and fail.
  • 14%
    IAM policy missing regions. Policy grants bedrock:InvokeModel only in us-east-1; CRIS routes to us-west-2 and denies.
  • 10%
    Profile not available in the account's region. CRIS profiles are region-scoped for the initial call; must be invoked from a region in the profile.
  • 8%
    Wrong version suffix. Copy-pasted an older CRIS ID after a newer version shipped.
  • 7%
    Model access request pending. Fresh accounts need explicit model access approval; profile visible but denies.
  • 8%
    Confusion between provisioned throughput and CRIS. Provisioned Throughput profile IDs look similar but behave differently.
  • 7%
    Bedrock endpoint URL wrong. Client set to bedrock-runtime.us-east-1.amazonaws.com but SDK picks up default region elsewhere.

Fixes — copy-paste solutions

Fix #1

Use the CRIS profile ID, not the base model ID

The single fix for most Claude-on-Bedrock invocation errors.

Set modelId to a full CRIS profile ID. Prefix with your region group (us., eu., apac.).

invoke_via_cris.py
import json
import boto3

client = boto3.client("bedrock-runtime", region_name="us-east-1")

# ✓ CORRECT — CRIS profile ID
MODEL_ID = "us.anthropic.claude-opus-4-7-20250514-v1:0"

# ✗ WRONG — base model ID for a 4.x+ model
# MODEL_ID = "anthropic.claude-opus-4-7-20250514-v1:0"

body = {
    "anthropic_version": "bedrock-2023-05-31",
    "max_tokens": 500,
    "messages": [{"role": "user", "content": "Hello from Bedrock"}],
}

response = client.invoke_model(modelId=MODEL_ID, body=json.dumps(body))
result = json.loads(response["body"].read())
print(result["content"][0]["text"])
list_cris_profiles.sh
# See which CRIS profiles are available in your account/region
aws bedrock list-inference-profiles \
  --region us-east-1 \
  --query "inferenceProfileSummaries[?contains(inferenceProfileName, 'claude')].{name:inferenceProfileName, id:inferenceProfileId, regions:models[*].modelArn}" \
  --output table

# Get details on one profile — including its underlying regions
aws bedrock get-inference-profile \
  --region us-east-1 \
  --inference-profile-identifier us.anthropic.claude-opus-4-7-20250514-v1:0
Newer Claude models (4.x+) do not support on-demand invocation by base ID at all — CRIS is the only path. Old habits from 3.5 code do not carry forward.
Fix #2

Enable model access in every region the profile spans

CRIS can route to any region in the profile — enable everywhere.

Bedrock Model Access is per-region. If your CRIS profile is us. and you enabled the model in us-east-1 only, requests routed to us-west-2 return AccessDeniedException.

enable_model_access.sh
# 1) List regions in the CRIS profile
aws bedrock get-inference-profile \
  --region us-east-1 \
  --inference-profile-identifier us.anthropic.claude-opus-4-7-20250514-v1:0 \
  --query "models[*].modelArn" --output text
# arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-opus-4-7-...
# arn:aws:bedrock:us-east-2::foundation-model/anthropic.claude-opus-4-7-...
# arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-opus-4-7-...

# 2) For each region, verify model access status
for region in us-east-1 us-east-2 us-west-2; do
  echo "=== $region ==="
  aws bedrock list-foundation-models \
    --region $region \
    --query "modelSummaries[?modelId=='anthropic.claude-opus-4-7-20250514-v1:0'].{id:modelId, status:modelLifecycle.status}" \
    --output table
done

# 3) If model access is not granted, use the Bedrock console to request it
# Console -> Bedrock -> Model access -> Manage model access
# Or via CLI (if supported in your account tier):
aws bedrock put-model-invocation-logging-configuration ...

# Model access requests are typically approved within minutes for Anthropic models.
Model access requests are per-region and per-account. If you have five AWS accounts (dev, staging, prod, etc.), enable access in each. Terraform module for model access is helpful for repeatable setup.
Fix #3

Configure IAM to permit InvokeModel across every CRIS region

Least-privilege still needs cover for every region the profile can route to.

IAM policies for Bedrock are typically region-scoped. For CRIS, the Resource list must include every region the profile can hit.

iam_policy_for_cris.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "InvokeCrisProfile",
      "Effect": "Allow",
      "Action": ["bedrock:InvokeModel", "bedrock:InvokeModelWithResponseStream"],
      "Resource": [
        // The CRIS profile itself
        "arn:aws:bedrock:us-east-1:*:inference-profile/us.anthropic.claude-opus-4-7-20250514-v1:0",

        // The underlying foundation models in every region the profile hits
        "arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-opus-4-7-20250514-v1:0",
        "arn:aws:bedrock:us-east-2::foundation-model/anthropic.claude-opus-4-7-20250514-v1:0",
        "arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-opus-4-7-20250514-v1:0"
      ]
    },
    {
      "Sid": "GetInferenceProfile",
      "Effect": "Allow",
      "Action": ["bedrock:GetInferenceProfile", "bedrock:ListInferenceProfiles"],
      "Resource": "*"
    }
  ]
}
Missing any underlying region's foundation-model ARN produces confusing AccessDeniedException messages that look like a bug in Bedrock. It is not — it is your IAM policy failing to cover a region CRIS chose to route to.

Prevention checklist

Ship these seven safeguards once and this error stops appearing in your logs.

  • Always use CRIS profile IDs (us., eu., apac.) for Claude 4.x+ on Bedrock.
  • Enable model access in every region the CRIS profile spans, not just your home region.
  • IAM policies must permit bedrock:InvokeModel on the profile ARN AND on the foundation-model ARN in every profile region.
  • Version-pin your CRIS profile IDs; do not blindly copy from tutorials — versions change with each Claude release.
  • Test model access with a smoke-test invocation after any IAM change; failures surface as production errors otherwise.
  • Use one CRIS profile ID as a constant in code — do not scatter model IDs.
  • Track model retirements — CRIS profiles retire alongside their underlying models.

Frequently asked questions

AWS transitioned newer high-throughput models to CRIS-only to enable smoother scaling across regions. On-demand base-model invocation is disabled for Claude 4.6/4.7 and their successors on Bedrock; you must use the CRIS profile.
It can route to any region within the profile's span. The us. profile stays within US regions; eu. stays within EU regions. For strict single-region data residency, provisioned throughput is the alternative — CRIS is not the right tool.
CRIS is on-demand pricing at standard per-token rates. Provisioned throughput has a fixed hourly cost but eliminates rate limiting for reserved capacity. For most workloads under 20 requests/sec, CRIS is cheaper. Above that, provisioned starts to pay back.
Higher than single-region on-demand, but still bounded by account quotas summed across the profile's regions. You can request increases via AWS Support. For a hard capacity guarantee, use provisioned throughput.
CRIS is AWS Bedrock's multi-region routing. Anthropic API is direct-to-Anthropic and offers its own priority-tier system. Bedrock adds AWS IAM, VPC endpoints, CloudTrail auditing, and existing AWS billing. Choose Bedrock when you are AWS-first; Anthropic API for lowest latency and access to newest features first.

Get the weekly AI-error digest

New fixes, provider status recaps, and one deep tutorial — every Tuesday. 8,400+ engineers.