AWS Bedrock Claude 400 오류: 메시지별 원인과 해결
400은 원인을 알려 주지 않습니다. Claude Code는 버전·베타 필드·컨텍스트·모델 ID를, 직접 호출은 요청 본문·권한·데이터 보존을 오류 메시지 원문으로 가려내면 고칠 곳이 정해집니다.
목차

AWS에서 Claude를 쓰다가 받은 HTTP 400은 "요청을 받아들일 수 없다"는 뜻일 뿐, 무엇을 고쳐야 하는지는 알려 주지 않습니다. 고칠 곳을 정하는 것은 함께 온 오류 코드와 메시지 원문입니다. Extra inputs are not permitted라면 게이트웨이나 베타 필드, thinking.type.enabled라면 Claude Code 버전, Input is too long for requested model.이라면 컨텍스트, data retention mode 'default'라면 계정 설정 문제입니다.
먼저 갈라야 할 것은 호출 경로입니다. Claude Code는 Bedrock에서 Invoke API만 쓰고 Converse API는 지원하지 않으므로, Converse 요청 본문을 고치라는 조언은 Claude Code 사용자와 관계가 없습니다. 반대로 코드에서 직접 Bedrock을 호출한다면 세 가지 요청 형식 중 어느 것을 쓰는지부터 맞춰야 합니다. 아래 버전 번호와 기본 모델은 2026년 9월 25일 기준 Claude Code·AWS 공식 문서 내용이며, 명령어와 코드는 문서 예시를 바탕으로 만든 것으로 실제 AWS 계정에서 실행한 결과가 아닙니다.
내 경로부터 확인하기
| 지금 쓰는 방식 | 확인 방법 | 먼저 볼 곳 |
|---|---|---|
Claude Code + Bedrock 직접 연결 (CLAUDE_CODE_USE_BEDROCK=1) | /status의 공급자·리전 줄 | 버전, thinking 설정, 모델 ID·접두사, 데이터 보존 |
Claude Code + Mantle (CLAUDE_CODE_USE_MANTLE) | /status에 Amazon Bedrock (Mantle) 표시 | Mantle 형식 모델 ID |
| Claude Code + 사내 게이트웨이·프록시·서드파티 "AWS Claude" 중계 | ANTHROPIC_BASE_URL 등 게이트웨이 설정 | anthropic-beta 헤더 전달, 베타 필드 |
| 코드에서 InvokeModel·Converse·Messages API 직접 호출 | SDK 메서드와 엔드포인트 URL | 요청 본문 형식, 권한, 계정 설정 |
Claude Code가 실제로 어느 공급자와 리전을 쓰는지 헷갈린다면 Claude Code API 설정: 키, settings.json, 모델, 게이트웨이 확인 순서에서 설정 우선순위를 먼저 확인하세요. 환경 변수를 셸에 넣었는데 /status가 다른 공급자를 보여 준다면, 400을 고치기 전에 그 변수가 프로세스에 전달되지 않은 것부터 해결해야 합니다.
상태 코드가 400이 아니라면 다른 문제입니다. Claude Code가 "AWS authentication failed"로 보여 주는 403은 만료된 자격 증명이나 IAM 권한 부족(AccessDeniedException)이고, 429 ThrottlingException은 요청 한도, 503과 529 overloaded_error는 AWS 쪽 용량 부족입니다. "지금 Claude가 바쁩니다" 같은 과부하 안내나 This organization has been disabled도 400 원인 분석으로는 해결되지 않습니다. 429라면 Claude Rate Exceeded 오류: 재시도 전에 제한 소유자부터 확인하기가 맞는 출발점입니다.
오류 메시지 원문으로 찾는 원인과 해결
로그나 터미널에 보이는 문자열을 왼쪽 열에서 찾으세요. 같은 문자열이 SDK마다 조금 다르게 감싸져 나올 수 있으므로 핵심 구절로 대조하면 됩니다.
| 메시지에 보이는 문자열 | 원인 | 바로 할 일 | 그대로 재시도 |
|---|---|---|---|
Extra inputs are not permitted (context_management, effort 등), Unexpected value(s) for the anthropic-beta header | 게이트웨이가 anthropic-beta 헤더를 빼고 베타 필드만 전달 | 게이트웨이가 헤더를 전달하게 설정, 차선책으로 CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1 | 안 됨 |
"thinking.type.enabled" is not supported for this model | Claude Code 버전이 선택한 모델의 최소 버전보다 낮음 | claude update 후 재시작 | 안 됨 |
max_tokens must be greater than thinking.budget_tokens | MAX_THINKING_TOKENS가 출력 한도보다 큼 | MAX_THINKING_TOKENS를 낮추거나 CLAUDE_CODE_MAX_OUTPUT_TOKENS를 올림 | 안 됨 |
Input is too long for requested model. | 입력 토큰과 요청한 출력 토큰의 합이 모델 한도 초과 | Claude Code는 /compact, 직접 호출은 입력이나 max_tokens 축소 | 안 됨 |
tool use concurrency issues, orphaned tool_result, duplicate tool_use ID | 대화 기록 속 tool_use·tool_result·thinking 순서가 어긋남 | /rewind 또는 Esc 두 번 | 안 됨 |
The provided model identifier is invalid | 잘못된 모델 ID, 해당 리전 미제공, 또는 리셀러 계정 문제 | 추론 프로필 목록으로 ID 확인 | 안 됨 |
on-demand throughput isn't supported | 추론 프로필이 필요한 모델에 기본 모델 ID 사용 | 추론 프로필 ID로 지정 | 안 됨 |
data retention mode 'default' is not available for this model | Claude Fable 계열이 요구하는 데이터 보존 모드가 계정에 설정되지 않음 | AWS 관리자에게 보존 모드 결정 요청 | 안 됨 |
Your AWS account is not authorized to invoke this API operation | IAM 사용자·역할에 호출 권한 없음 | IAM 정책 확인 | 안 됨 |
Access to Anthropic models is not allowed from unsupported countries, regions, or territories | 계정 세금·청구 주소 또는 호출 위치가 지원 지역이 아님 | 계정 정보 확인, 리전 변경으로는 해결 안 됨 | 안 됨 |
ServiceQuotaExceededException | 계정 서비스 할당량 초과 | 할당량 확인 후 나중에 다시 전송 | 나중에는 가능 |
400 가운데 AWS가 "나중에 다시 보내도 된다"고 밝힌 것은 ServiceQuotaExceededException뿐입니다. 나머지는 요청이나 설정이 바뀌지 않는 한 몇 번을 보내도 같은 400이 돌아옵니다. 재시도와 모델 전환 기준을 따로 정리하고 싶다면 LLM API 재시도 vs 폴백: 모델을 바꾸기 전 5가지 기준을 참고하세요.
Claude Code에서 400이 날 때
Extra inputs are not permitted와 베타 필드
Claude Code는 context_management, effort 같은 베타 전용 필드를 보낼 때 이를 활성화하는 anthropic-beta 헤더를 함께 보냅니다. 중간의 프록시나 LLM 게이트웨이가 요청 본문은 그대로 넘기고 헤더만 빼 버리면, 받는 쪽은 모르는 필드가 들어왔다고 보고 400을 반환합니다. 서드파티 "AWS Claude" 중계 경로에서 이 메시지가 자주 보이는 이유도 같습니다.
근본 해결은 게이트웨이가 anthropic-beta 헤더를 전달하도록 설정하는 것입니다. 게이트웨이를 직접 고칠 수 없다면 Claude Code를 시작하기 전에 베타 필드를 끄는 환경 변수를 넣습니다.
# Claude Code를 실행할 같은 터미널에서
export CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1
claude계속 쓰려면 ~/.claude/settings.json의 env 블록에 넣습니다. 이미 게이트웨이 주소와 토큰이 있다면 같은 블록에 합칩니다.
{
"env": {
"CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS": "1"
}
}이 변수를 넣었는데도 같은 400이 난다면 두 가지를 의심하세요. 첫째, 변수가 프로세스 시작 전에 없었습니다. 이미 실행 중인 Claude Code에는 적용되지 않으므로 완전히 종료한 뒤 다시 시작해야 합니다. 둘째, 원인이 베타 필드가 아닙니다. 이 변수는 anthropic-beta 헤더와 defer_loading, eager_input_streaming 같은 베타 도구 스키마 필드만 제거하고 name, description, input_schema, cache_control 같은 표준 필드는 그대로 둡니다. 모델 ID, IAM 권한, 할당량, 데이터 보존으로 생긴 400은 이 변수로 고쳐지지 않습니다.
부작용도 있습니다. 이 변수를 켜면 MCP 도구 검색이 꺼져 모든 MCP 도구가 처음부터 로드되고, ENABLE_TOOL_SEARCH 값도 무시됩니다(v2.1.227 이상에서는 관리형 설정으로 도구 검색을 유지할 수 있습니다). MCP 서버가 많다면 도구 정의만으로 컨텍스트가 차서 다음 절의 Input is too long 오류로 이어질 수 있습니다. 서버를 줄이는 방법은 Claude Code MCP 컨텍스트 과부하: 서버가 너무 많을 때 고르고 압축하는 법에 있습니다.
게이트웨이 없이 Bedrock에 직접 연결했는데 output_config.effort: Extra inputs are not permitted가 나오는 경우도 보고돼 있습니다. claude-code-action@v1에서 Sonnet 4.5 애플리케이션 추론 프로필을 쓰다 이 오류를 받은 GitHub 이슈(2026년 3월 등록, 미해결)에서는 Sonnet 4.6이나 Opus 4.6으로 바꾸자 해결됐다는 댓글이 달렸습니다. 공식 설명은 아니지만, 헤더 문제가 아니라 모델과 엔드포인트가 effort를 받지 않는 경우도 있다는 점은 기억해 둘 만합니다.
LaoZhang API의 AWS Claude 경로를 이미 쓰고 있다면 해당 경로의 400 ValidationException FAQ(영문)가 같은 환경 변수 설정 절차를 안내합니다. LaoZhang의 Claude 모델은 2026년 9월 24일 용량 문제로 일시 중단됐다가 2026년 10월 18일 다시 제공되기 시작했습니다.
안내: laozhang.ai는 이 블로그 운영팀의 자사 서비스입니다. 그 가격은 독립적인 비교가 아니라 자사 제시 가격입니다.
thinking 관련 400 두 가지
API Error: 400 ... "thinking.type.enabled" is not supported for this model. Use "thinking.type.adaptive" and "output_config.effort"...는 Claude Code가 선택한 모델보다 오래된 버전이라서 그 모델이 더는 받지 않는 thinking 설정을 보냈다는 뜻입니다. claude --version으로 버전을 보고 아래 최소 버전보다 낮으면 claude update 후 다시 시작하세요.
| 모델 | Claude Code 최소 버전 |
|---|---|
| Opus 4.7 | v2.1.111 |
| Opus 4.8 | v2.1.154 |
| Sonnet 5 | v2.1.197 |
| Opus 5 | v2.1.219 |
| Opus 5.5 | v2.1.280 |
업데이트할 수 없는 환경이라면 /model에서 Opus 4.6이나 Sonnet 4.6을 고르는 것이 공식 문서의 대안입니다. Agent SDK에서 같은 오류가 나면 CLI가 아니라 SDK 패키지를 올려야 합니다. 예를 들어 Opus 5.5는 TypeScript SDK v0.3.280 이상이 필요합니다. AWS 쪽에도 모델별 thinking 제한이 있습니다. Claude Fable 5.1, Mythos 5.1, Mythos 5, Fable 5는 확장 사고를 지원하지 않고 적응형 사고만 쓰기 때문에, thinking.type을 "enabled"나 "disabled"로 보내면 400이 납니다.
API Error: 400 ... max_tokens must be greater than thinking.budget_tokens는 사고 예산이 최대 출력 길이보다 커서 답을 쓸 공간이 남지 않는 경우입니다. Anthropic API에서는 Claude Code가 값을 자동으로 조정하지만, Bedrock이나 Google Cloud에서는 MAX_THINKING_TOKENS를 공급자의 출력 한도보다 크게 잡았거나 계획 모드가 예산을 올렸을 때 이 오류가 납니다. MAX_THINKING_TOKENS를 낮추거나 CLAUDE_CODE_MAX_OUTPUT_TOKENS를 예산보다 크게 올리세요. Bedrock 같은 서드파티 공급자에서 MAX_THINKING_TOKENS=0은 thinking 파라미터 자체를 빼지만, Opus 5.5와 Fable 모델은 사고를 끌 수 없는 모델이라는 점도 함께 알아 두세요.
Opus 4.7에서 top_p나 temperature 때문에 거부되는 400은 thinking과는 다른 문제입니다. 이 경우는 Claude Code에서 top_p deprecated? 먼저 Opus 4.7 request contract부터 확인하세요를 보세요.
Input is too long for requested model
Bedrock은 컨텍스트 초과를 Input is too long for requested model.이라는 ValidationException으로 알립니다. AWS 설명에 따르면 기준은 입력 토큰만이 아니라 입력 토큰과 요청한 출력 토큰을 합친 값입니다.
Claude Code는 v2.1.217부터 이 Bedrock 문구를 Prompt is too long과 똑같이 처리해 자동 압축을 실행합니다. 그 이전 버전에서는 문구를 인식하지 못해 자동 압축이 동작하지 않았고, /compact도 같은 오류로 실패했습니다. 버전이 낮다면 업데이트가 먼저입니다. 그다음에는 다음 순서로 공간을 확보합니다.
/compact로 앞선 대화를 요약하거나/clear로 새로 시작합니다./context로 시스템 프롬프트, 도구, 메모리 파일, 메시지 중 무엇이 창을 채우는지 확인합니다.- 쓰지 않는 MCP 서버는
/mcp disable <name>으로 끕니다. - 큰
CLAUDE.md를 줄이거나 필요할 때만 불러오는 경로별 규칙으로 옮깁니다.
/compact가 Not enough messages to compact.라고 답한다면 대화 한 번 분량이 이미 창을 채운 상태입니다. /clear 후 붙여 넣는 텍스트나 첨부를 줄여서 다시 보내야 합니다.
tool use concurrency issues와 대화 기록 불일치
다음 메시지는 모두 같은 뜻입니다. 대화 기록 안의 tool_use, tool_result, thinking 블록 순서가 API가 기대하는 모양과 맞지 않습니다. 도구 호출이 중간에 끊기거나 스트리밍 도중 턴이 수정됐을 때 주로 생깁니다.
API Error: 400 due to tool use concurrency issues. Run /rewind to recover the conversation.
API Error: 400 orphaned tool_result in conversation history. Run /rewind to recover the conversation.
API Error: 400 duplicate tool_use ID in conversation history. Run /rewind to recover the conversation.
API Error: 400 ... unexpected `tool_use_id` found in `tool_result` blocks
API Error: 400 ... thinking blocks ... cannot be modified/rewind를 실행하거나 Esc를 두 번 눌러 문제가 생긴 턴 이전의 체크포인트로 돌아간 뒤 이어서 작업합니다. 같은 메시지를 다시 보내도 기록이 그대로이므로 결과는 바뀌지 않습니다. Opus 4.7이나 4.8을 쓰고 Claude Code가 v2.1.156보다 낮다면 먼저 업데이트하세요. 그 이전 버전은 평범한 도구 사용 중에도 이 오류를 일으킬 수 있고, /rewind로도 풀리지 않습니다.
모델 ID, 추론 프로필 접두사, Mantle
Claude Code는 Bedrock Invoke API에서 기본 모델을 교차 리전 추론 프로필 ID로 바꿔 부르며, 리전에 따라 우선 붙이는 접두사가 정해져 있습니다.
| 해석된 AWS 리전 | 우선 접두사 |
|---|---|
us-gov-* (GovCloud) | us-gov. |
us-* | us. |
eu-* | eu. |
ap-* | apac. |
| 그 밖의 리전 | global. |
v2.1.224부터는 ANTHROPIC_BEDROCK_REGION_PREFIX(us, eu, apac, jp, au, global)로 우선 접두사를 바꿀 수 있지만, 이것은 선호일 뿐 보장이 아닙니다. Claude Code가 계정의 추론 프로필 목록을 조회할 수 있으면 실제로 있는 프로필을 골라 쓰고, 조회할 수 없으면 확인 없이 접두사를 붙입니다. 그 접두사의 추론 프로필이 계정에서 활성화돼 있지 않으면 요청은 400으로 실패합니다. 그래서 us.나 global.을 무작정 붙여 보는 것보다 실제 목록을 먼저 보는 편이 빠릅니다. Claude Code 문서의 IAM 예시에는 bedrock:ListInferenceProfiles와 bedrock:GetInferenceProfile 권한이 들어 있습니다.
aws bedrock list-inference-profiles --region <리전>on-demand throughput isn't supported가 보이면 기본 모델 ID 대신 추론 프로필 ID를 지정해야 합니다. 직접 설정한 프로필 ID나 ARN은 Claude Code가 고쳐 쓰지 않으므로, 그 값이 틀렸다면 그대로 400이 납니다.
모델을 고정하지 않으면 별칭이 Claude Code 내장 기본값으로 풀립니다. 2026년 9월 25일 기준 Bedrock의 기본 주 모델은 Opus 5.5(us-* 리전에서는 us.anthropic.claude-opus-5-5)이고, v2.1.280 이전에는 Opus 5였습니다. 이 기본값이 계정에서 아직 활성화되지 않았다면 Claude Code는 시작할 때 이전 버전이나 하위 모델로 그 세션만 대체합니다. 여러 사람이 같은 설정을 쓴다면 모델을 고정해 두는 편이 예측 가능합니다. 아래 ID는 Claude Code 문서의 예시이므로 자신의 계정과 리전에서 활성화된 값으로 바꾸세요.
export CLAUDE_CODE_USE_BEDROCK=1
export AWS_REGION=us-east-1
export ANTHROPIC_DEFAULT_OPUS_MODEL='us.anthropic.claude-opus-4-8'
export ANTHROPIC_DEFAULT_SONNET_MODEL='us.anthropic.claude-sonnet-4-6'
export ANTHROPIC_DEFAULT_HAIKU_MODEL='us.anthropic.claude-haiku-4-5-20251001-v1:0'Mantle은 모델 ID 형식이 다릅니다. anthropic.claude-sonnet-5처럼 anthropic.으로 시작하고 버전 접미사가 없습니다. Mantle에서 모델 ID를 지목하는 400이 나오면 그 모델이 Mantle에서 제공되지 않는다는 뜻이며, us.anthropic.claude-sonnet-4-6 같은 Invoke용 추론 프로필 ID는 Mantle에서 동작하지 않습니다. CLAUDE_CODE_USE_BEDROCK과 CLAUDE_CODE_USE_MANTLE을 함께 켜면 Mantle 형식 ID는 Mantle로, 나머지는 Invoke API로 보냅니다. 반대로 유효한 자격 증명인데 Mantle이 403을 반환한다면 계정에 그 모델 접근 권한이 없는 것이므로 AWS 계정 팀에 요청해야 합니다.
코드에서 Bedrock을 직접 호출할 때
호출 방식에 맞는 요청 본문
직접 호출에서 가장 흔히 섞이는 것은 세 가지 요청 형식입니다. 필드 이름과 위치가 서로 달라서, 한 형식의 본문을 다른 API에 보내면 Malformed input request: extraneous key [...] is not permitted 같은 ValidationException이 납니다.
| 항목 | InvokeModel (네이티브) | Converse | Bedrock의 Anthropic Messages API |
|---|---|---|---|
| 모델 지정 | 작업의 modelId | 경로 /model/{modelId}/converse | 본문의 model |
| 버전 표시 | 본문 "anthropic_version": "bedrock-2023-05-31" | 없음 | 헤더 anthropic-version: 2023-06-01 |
| 최대 출력 | 본문 max_tokens | inferenceConfig.maxTokens | 본문 max_tokens |
| 메시지 | messages[] (role, content) | messages[].content가 [{"text": "..."}] 배열 | messages[] |
| 시스템 프롬프트 | 별도 system 필드 | 최상위 system 배열 | system 필드 |
| 모델 전용 필드 | 본문에 직접 | additionalModelRequestFields | 본문에 직접 |

그림은 세 형식의 필드 위치를 개략적으로 보여 줍니다. 값을 복사할 때는 위 표와 아래 코드 블록을 기준으로 하세요. 특히 InvokeModel 본문의 anthropic_version은 bedrock-2023-05-31이고, 2023-06-01은 Messages API의 HTTP 헤더 값입니다. 둘을 바꿔 넣는 실수가 잦습니다. Converse도 messages 배열 안에 role과 content를 두고, 모델 ID는 JSON 본문이 아니라 경로로 보냅니다.
다음은 AWS 문서의 boto3 예시를 바탕으로 한 최소 InvokeModel 요청입니다. 모델 ID는 계정마다 다르므로 환경 변수로 받습니다.
import json
import os
import boto3
client = boto3.client("bedrock-runtime", region_name=os.environ["AWS_REGION"])
response = client.invoke_model(
modelId=os.environ["BEDROCK_MODEL_ID"], # 예: 계정에서 활성화된 추론 프로필 ID
body=json.dumps({
"anthropic_version": "bedrock-2023-05-31",
"max_tokens": 256,
"messages": [
{"role": "user", "content": "한 문장으로 답해 주세요: 연결 확인"}
],
}),
)
print(json.loads(response["body"].read())["content"][0]["text"])AWS는 새 애플리케이션에는 bedrock-runtime 엔드포인트의 Messages API(https://bedrock-runtime.{region}.amazonaws.com/anthropic)를 권장합니다. 이 경로는 Anthropic SDK의 base_url로 쓸 수 있고, 모델은 본문의 model에 us.anthropic.claude-sonnet-5 같은 ID로 넣습니다. Mantle(https://bedrock-mantle.{region}.api.aws/anthropic/v1/messages)을 쓸 때는 anthropic-version: 2023-06-01 헤더가 필요하고 모델 ID는 anthropic.claude-sonnet-5 형식입니다.
형식 외에 요청 내용 때문에 나는 400
Malformed input request: extraneous key [...] is not permitted: 대괄호 안의 키가 이 모델이 받지 않는 파라미터입니다. 다른 모델용 설정을 그대로 가져왔을 때 흔합니다. 해당 키를 빼세요."claude-..." is not supported on this API. Please use the Messages API instead.: 예전 텍스트 완성 형식으로 호출한 경우입니다.messages배열 기반 Messages 형식으로 바꿔야 합니다.- thinking: Fable·Mythos 계열에는
{"type": "adaptive"}와output_config.effort를 쓰거나thinking을 아예 빼세요. 표준 확장 사고를 쓰는 모델에서는budget_tokens가 1,024 이상이면서max_tokens보다 작아야 합니다. 도구와 함께 쓰는 인터리브드 사고(베타)만 예외입니다. Input is too long for requested model.: 입력을 줄이거나max_tokens를 낮춥니다. 한도는 입력과 요청한 출력의 합으로 계산됩니다.Guardrail was enabled but input is in incorrect format.: 가드레일 ID는 하나만,guardrailVersion에는 버전 번호만 넣어야 합니다.system역할 메시지 관련 오류는 요청 형식 문제에 가깝습니다. 시스템 지시를 깨지 않고 API 400 role 미지원 오류를 고치는 방법에서 변환 방법을 다룹니다.
코드로는 고칠 수 없는 400
아래 경우는 요청 본문을 아무리 바꿔도 해결되지 않습니다. 계정이나 권한을 가진 사람이 결정해야 하므로, 오류 메시지 원문과 요청 ID를 챙겨 AWS 관리자에게 넘기는 것이 가장 빠릅니다.
데이터 보존 모드: data retention mode 'default'
Claude Fable 5와 Fable 5.1을 호출했을 때 다음과 같은 메시지가 나오면 계정의 데이터 보존 모드가 모델 요구 사항보다 낮은 것입니다.
API Error: 400 data retention mode 'default' is not available for this model
This model is not available under data retention mode 'default'.앞의 문구는 Claude Code에서 global.anthropic.claude-fable-5를 쓸 때 보고된 것이고, 뒤의 문구는 Mantle 모델 목록에서 모델이 unavailable로 표시될 때의 사유입니다. AWS 문서의 설명은 다음과 같습니다.
- 보존 모드는
none < default < aws_review < provider_data_share순서이고, Fable 5와 5.1은aws_review이상일 때만 쓸 수 있습니다. 실효 모드가none이나default면bedrock-runtime에서는ValidationException이 납니다. aws_review는 입력과 출력을 AWS 경계 안에 최대 30일 보존하고 AWS가 검토할 수 있게 허용하는 모드입니다. 모델 제공사에는 공유되지 않습니다.provider_data_share는 레거시 모드로, 지금은aws_review와 같게 동작하므로 새로 설정할 때는aws_review를 씁니다.bedrock-runtime에서는 이 설정이 리전별 계정 단위입니다. 프로젝트 단위 설정은 Mantle에만 있습니다.- 출시 시점 기준 콘솔 UI가 없습니다. 컨트롤 플레인 API
GET https://bedrock.{region}.amazonaws.com/data-retention으로 확인하고PUT요청에{"mode": "aws_review"}를 보내 설정하며, IAM 작업은 각각bedrock:GetAccountDataRetention,bedrock:PutAccountDataRetention입니다. - 조직의 SCP가
none이외 모드 설정을 막고 있을 수 있습니다.
확인 요청은 문서 예시로 다음과 같습니다.
curl https://bedrock.us-east-1.amazonaws.com/data-retention \
-H "Authorization: Bearer $AWS_BEARER_TOKEN_BEDROCK"모드를 바꾸는 것은 개발자가 오류를 없애려고 누르는 스위치가 아닙니다. 그 리전의 계정 전체에 적용되는 데이터 처리 결정이므로 보안·컴플라이언스 담당자의 승인이 필요합니다. 참고로 Opus 4.8처럼 none을 허용하는 모델은 계정을 aws_review로 바꿔도 데이터를 보존하지 않고, Fable 5 이전에 출시된 Claude 모델에는 보존 방식 변경이 없습니다. Fable로 옮길지 자체를 비용 면에서 따져 보려면 Claude Fable 5.1 vs Opus 5 가격 비교: 실제 작업 비용을 참고하세요.
계정 자격, 권한, 서명, 할당량
The provided model identifier is invalid인데 모델 ID와 리전이 맞다면 계정 경로를 보세요. AWS Marketplace 파트너나 솔루션 파트너를 통해 Bedrock을 쓰는 계정은 그 리셀러가 Anthropic 파트너 프로그램이나 Amazon Bedrock 공인 리셀러 프로그램에 가입하지 않았으면 같은 메시지를 받습니다. 코드, IAM, 모델 접근 요청으로는 해결되지 않고 리셀러가 가입을 마쳐야 합니다.Access to Anthropic models is not allowed from unsupported countries, regions, or territories: 판단 기준에는 계정의 세금 주소와 청구 주소, 호출하는 기기의 위치가 포함됩니다. 다른 AWS 리전으로 바꾼다고 풀리지 않습니다.Your AWS account is not authorized to invoke this API operation,NotAuthorized: IAM 사용자·역할의 정책과 조직 SCP를 확인합니다.IncompleteSignature: Bedrock을 지원하는 SDK 버전인지, 액세스 키가 올바른지, 직접 서명한다면 서명 계산이 맞는지 봅니다.RequestExpired: 시스템 시계가 어긋나 요청 타임스탬프가 만료된 것입니다. 시간 동기화를 확인합니다.ServiceQuotaExceededException: 400이지만 AWS가 나중에 다시 보내도 된다고 명시한 예외입니다. 할당량을 확인하고, 반복된다면 증설을 요청합니다.
고친 뒤 정말 해결됐는지 확인하기

여러 설정을 한꺼번에 바꾸면 무엇이 효과가 있었는지 알 수 없고, 필요 없는 변경(예: 베타 필드 비활성화)이 부작용과 함께 남습니다. 다음 순서로 하나씩 확인하세요.
- 오류 전문을 남깁니다. 오류 코드, 메시지 원문, 요청 ID, 사용한 모델 ID와 리전입니다. 관리자에게 넘길 때도 이 정보가 필요합니다.
- 메시지가 가리키는 항목 하나만 바꿉니다. 버전이면 업데이트만, 모델 ID면 ID만 바꿉니다.
- 최소 요청으로 확인합니다. Claude Code라면 완전히 다시 시작한 뒤
/status에서 공급자·리전·모델을 확인하고, 새 세션에서 짧은 메시지 하나를 보냅니다. 직접 호출이라면 위의 최소 InvokeModel 요청처럼 도구, thinking, 가드레일 없이 짧은 메시지만 보냅니다. - 성공하면 도구, MCP 서버, thinking 설정, 긴 컨텍스트 같은 선택 기능을 하나씩 되돌리며 같은 작업을 재현합니다. 다시 400이 나는 지점이 실제 원인입니다.
- 최소 요청도 실패하면 새로 받은 메시지를 다시 읽습니다. 메시지가 바뀌었다면 앞 단계는 효과가 있었고 다음 원인으로 넘어간 것입니다.
자주 묻는 질문
Claude Code의 400 에러는 무엇을 의미하나요?
요청이 서버 조건에 맞지 않아 거부됐다는 뜻입니다. 원인은 메시지마다 다릅니다. 게이트웨이가 베타 헤더를 뺐거나(Extra inputs are not permitted), Claude Code 버전이 모델보다 낮거나(thinking.type.enabled), 컨텍스트가 넘쳤거나(Input is too long), 대화 기록이 어긋났을 수(tool use concurrency issues) 있습니다. 위 대응표에서 메시지 원문을 찾으세요.
CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1을 넣었는데 왜 400이 계속 나나요?
Claude Code를 완전히 종료한 뒤 변수를 넣은 같은 터미널에서 다시 시작했는지 확인하세요. 그래도 같다면 원인이 베타 필드가 아닐 가능성이 큽니다. 이 변수는 베타 헤더와 베타 도구 스키마 필드만 제거하므로 모델 ID, 추론 프로필 접두사, IAM, 할당량, 데이터 보존 문제는 그대로 남습니다. 메시지 원문으로 다시 분류하세요.
400이면 재시도해도 되나요?
대부분은 안 됩니다. 요청이나 설정을 바꾸지 않으면 같은 400이 돌아옵니다. 예외는 ServiceQuotaExceededException으로, AWS가 나중에 다시 보내도 된다고 밝히고 있습니다. 429 ThrottlingException과 503·529는 400이 아니며, 백오프를 둔 재시도가 적절한 경우입니다.
Converse 요청 형식을 고치면 Claude Code 400도 해결되나요?
아닙니다. Claude Code는 Bedrock에서 Invoke API만 사용하고 Converse API는 지원하지 않습니다. Claude Code 사용자는 요청 본문 대신 버전, 환경 변수, 모델 ID, 계정 설정을 확인해야 합니다.





