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.
Quick fix (TL;DR)
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.
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.
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.
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 prefix | Region span | Example 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 regions | apac.anthropic.claude-sonnet-5-... |
| (no prefix) | On-demand single-region (not always available) | anthropic.claude-3-5-haiku-... |
What CRIS gives vs single-region
| Aspect | Single-region | Cross-region (CRIS) |
|---|---|---|
| Capacity | One region's pool | Sum across profile regions |
| Latency | Lowest (local region) | Slightly higher variance |
| Availability | Fails if home region degrades | Absorbs regional outages |
| IAM | One region | Every region in the profile |
| Data residency | Yes, guaranteed | Bounded to profile's regions |
| On-demand access | Being deprecated for newer models | Required 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:InvokeModelonly 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.combut SDK picks up default region elsewhere.
Fixes — copy-paste solutions
Use the CRIS profile ID, not the base model ID
Set modelId to a full CRIS profile ID. Prefix with your region group (us., eu., apac.).
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"])
# 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
Enable model access in every region the profile spans
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.
# 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.
Configure IAM to permit InvokeModel across every CRIS region
IAM policies for Bedrock are typically region-scoped. For CRIS, the Resource list must include every region the profile can hit.
{
"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": "*"
}
]
}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:InvokeModelon 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
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.Related errors & hubs
Get the weekly AI-error digest
New fixes, provider status recaps, and one deep tutorial — every Tuesday. 8,400+ engineers.