데이터 레지던시
데이터 레지던시 (Data residency)
데이터 레지던시 제어를 사용하면 데이터가 처리·저장되는 위치를 관리할 수 있어요. 이를 좌우하는 두 가지 독립적인 설정이 있어요.
- 추론 지리(Inference geo): 모델 추론이 실행되는 위치를 요청별로 제어해요.
inference_geoAPI 매개변수나 워크스페이스 기본값으로 설정해요. - 워크스페이스 지리(Workspace geo): 데이터가 저장되는 위치(at rest)와 엔드포인트 처리(이미지 트랜스코딩, 코드 실행 같은 것)가 일어나는 위치를 제어해요. Claude Console의 워크스페이스 수준에서 구성돼요.
Claude Managed Agents는 에이전트 수준의 지리 고정을 지원해요. 에이전트 모델 구성의
inference_geo는 그 에이전트로 실행되는 세션의 모델 요청을 서빙하는 지리를 고정하며, 세션 생성 시 세션별 오버라이드가 가능해요. 고정이 없는 에이전트는 각 요청에서 워크스페이스의 기본 추론 geo를 따라요. Managed Agents는 Console에 구성된 Workspace geo도 존중하며, 셀프 호스팅 샌드박스를 사용하면 도구 실행과 샌드박스 파일시스템이 제어하는 인프라에 남아 있어요. 첨부된 메모리 저장소의 내용은 Anthropic이 저장하고 세션 동안 샌드박스로 복사돼요.
출처: 문서
본문
추론 지리 (Inference geo)
이 기능에 제로 데이터 보존(ZDR)이 어떻게 적용되는지는 API 및 데이터 보존 참고.
inference_geo 매개변수는 특정 API 요청에 대해 모델 추론이 실행되는 위치를 제어해요. 어떤 POST /v1/messages 호출에든 추가할 수 있어요.
| 값 | 설명 |
|---|---|
"global" |
기본값. 최적의 성능·가용성을 위해 추론이 사용 가능한 어느 지리에서든 실행될 수 있어요. |
"us" |
추론이 US 기반 인프라에서만 실행돼요. |
API 사용
ant messages create \
--model claude-opus-5-5 \
--max-tokens 1024 \
--inference-geo us \
--message '{role: user, content: "Summarize the key points of this document."}' \
--transform '{content.#(type=="text").text,usage.inference_geo}' --format yaml
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-opus-5-5",
max_tokens=1024,
inference_geo="us",
messages=[
{"role": "user", "content": "Summarize the key points of this document."}
],
)
for block in response.content:
if block.type == "text":
print(block.text)
# Check where inference actually ran
print(f"Inference geo: {response.usage.inference_geo}")
const client = new Anthropic();
const response = await client.messages.create({
model: "claude-opus-5-5",
max_tokens: 1024,
inference_geo: "us",
messages: [
{
role: "user",
content: "Summarize the key points of this document."
}
]
});
const textBlock = response.content.find(
(block): block is Anthropic.TextBlock => block.type === "text"
);
console.log(textBlock?.text);
// Check where inference actually ran
console.log(`Inference geo: ${response.usage.inference_geo}`);
var client = new AnthropicClient();
var response = await client.Messages.Create(
new MessageCreateParams
{
Model = Model.ClaudeOpus5_5,
MaxTokens = 1024,
InferenceGeo = "us",
Messages =
[
new() { Role = Role.User, Content = "Summarize the key points of this document." },
],
}
);
foreach (var block in response.Content)
{
if (block.TryPickText(out var textBlock))
{
Console.WriteLine(textBlock.Text);
}
}
// Check where inference actually ran
Console.WriteLine($"Inference geo: {response.Usage.InferenceGeo}");
client := anthropic.NewClient()
message, err := client.Messages.New(context.Background(), anthropic.MessageNewParams{
Model: anthropic.ModelClaudeOpus5_5,
MaxTokens: 1024,
InferenceGeo: anthropic.String("us"),
Messages: []anthropic.MessageParam{
anthropic.NewUserMessage(anthropic.NewTextBlock("Summarize the key points of this document.")),
},
})
if err != nil {
log.Fatal(err)
}
for _, block := range message.Content {
if textBlock, ok := block.AsAny().(anthropic.TextBlock); ok {
fmt.Println(textBlock.Text)
}
}
// Check where inference actually ran
fmt.Printf("Inference geo: %s\n", message.Usage.InferenceGeo)
AnthropicClient client = AnthropicOkHttpClient.fromEnv();
Message response = client.messages().create(
MessageCreateParams.builder()
.model(Model.CLAUDE_OPUS_5_5)
.maxTokens(1024L)
.inferenceGeo("us")
.addUserMessage("Summarize the key points of this document.")
.build());
response.content().stream()
.flatMap(block -> block.text().stream())
.forEach(textBlock -> IO.println(textBlock.text()));
// Check where inference actually ran
IO.println("Inference geo: " + response.usage().inferenceGeo().get());
$client = new Client();
$response = $client->messages->create(
model: 'claude-opus-5-5',
maxTokens: 1024,
inferenceGeo: 'us',
messages: [
['role' => 'user', 'content' => 'Summarize the key points of this document.'],
],
);
foreach ($response->content as $block) {
if ($block->type === 'text') {
echo $block->text, PHP_EOL;
}
}
// Check where inference actually ran
echo "Inference geo: {$response->usage->inferenceGeo}\n";
client = Anthropic::Client.new
response = client.messages.create(
model: "claude-opus-5-5",
max_tokens: 1024,
inference_geo: "us",
messages: [
{role: "user", content: "Summarize the key points of this document."}
]
)
response.content.each do |block|
puts block.text if block.type == :text
end
# Check where inference actually ran
puts "Inference geo: #{response.usage.inference_geo}"
응답
응답 usage 객체는 추론이 실행된 위치를 나타내는 inference_geo 필드를 포함해요:
{
"usage": {
"input_tokens": 25,
"output_tokens": 150,
"inference_geo": "us"
}
}
모델 가용성
inference_geo 매개변수는 Claude 4.6 이상 모델에서 지원돼요. Claude Opus 4.5, Claude Sonnet 4.5, Claude Haiku 4.5 또는 이전 모델에서 inference_geo가 있는 요청은 400 오류를 반환해요.
inference_geo매개변수는 Claude API(퍼스트파티)와 AWS의 Claude Platform에서 사용할 수 있어요. Amazon Bedrock과 Google Cloud에서 추론 리전은 엔드포인트 URL이나 추론 프로필이 결정하므로inference_geo는 적용되지 않아요. Microsoft Foundry의 Claude에서inference_geo도 마찬가지로 적용되지 않아요. Azure에 호스팅된 배포는 대신 추론을 미국 내에 유지하는 US Data Zone Standard 배포 유형을 사용할 수 있어요.inference_geo매개변수는 OpenAI SDK 호환 엔드포인트로는 사용할 수 없어요.
워크스페이스 수준 제한
워크스페이스 설정은 사용 가능한 추론 geos를 제한하는 것도 지원해요:
allowed_inference_geos: 워크스페이스가 사용할 수 있는 geos를 제한해요. 요청이 이 목록에 없는inference_geo를 지정하면 API가 오류를 반환해요.default_inference_geo: 요청에서inference_geo가 생략될 때 폴백 geo를 설정해요. 개별 요청이inference_geo를 명시적으로 설정해 이를 오버라이드할 수 있어요.
이 설정은 Console이나 data_residency 필드 아래의 Admin API로 구성할 수 있어요.
워크스페이스 지리 (Workspace geo)
워크스페이스 geo는 워크스페이스를 만들 때 설정되며 이후에는 바꿀 수 없어요. 현재 "us"가 유일하게 사용 가능한 워크스페이스 geo예요.
워크스페이스 geo를 설정하려면 Console에서 새 워크스페이스를 만드세요:
- Settings > Workspaces로 이동.
- 새 워크스페이스 만들기.
- 워크스페이스 geo 선택.
AWS의 Claude Platform: 워크스페이스 geo는 구성할 수 없어요. 이 플랫폼의 Claude Managed Agents 세션은 현재 유일하게 사용 가능한 워크스페이스 geo인
"us"의 유효 워크스페이스 geo로 실행돼요. 그 플랫폼 특유의 데이터 레지던시 고려 사항은 Claude Platform on AWS 참고.
요금
데이터 레지던시 요금은 모델 세대에 따라 달라져요:
- Claude 4.6 이상 모델: US 전용 추론(
inference_geo: "us")은 모든 토큰 요금 범주(입력 토큰, 출력 토큰, 캐시 쓰기, 캐시 읽기)에서 표준 요금의 1.1배로 책정돼요. - 글로벌 라우팅(
inference_geo: "global"): 표준 요금 적용. - 이전 모델:
inference_geo를 지원하지 않고(모델 가용성 참고) 표준 요금이 적용돼요. 매개변수를 포함한 요청은 400 오류를 반환해요.
이 요금은 Claude API(퍼스트파티)와 AWS의 Claude Platform에 적용돼요. Microsoft Foundry의 Claude에서 US Data Zone Standard 배포 유형을 사용하는 Azure 호스팅 배포에도 같은 1.1배 승수가 적용돼요. 파트너 운영 플랫폼(Bedrock·Google Cloud)은 자체 리전별 요금이 있어요. 데이터 레지던시 요금 참고.
Claude Managed Agents에도 같은 승수가 적용돼요. 에이전트의 모델 구성이 inference_geo를 "us"로 고정하면 그 에이전트로 실행되는 세션의 모델 요청이 표준 요금의 1.1배로 책정돼요.
Priority Tier 약정이 있다면 US 전용 추론의 1.1배 승수는 Priority Tier 용량에 대해 토큰이 계산되는 방식에도 영향을 미쳐요.
inference_geo: "us"로 소비된 각 토큰은 약정 TPM에서 1.1 토큰을 차감하며, 이는 프롬프트 캐싱 같은 다른 요금 승수가 소진율에 영향을 미치는 방식과 일치해요.
Batch API 지원
inference_geo 매개변수는 Batch API에서 지원돼요. 배치의 각 요청은 자체 inference_geo 값을 지정할 수 있어요.
기존 옵트아웃에서 마이그레이션
조직이 이전에 추론을 미국에 유지하기 위해 글로벌 라우팅을 옵트아웃했다면, 워크스페이스가 allowed_inference_geos: ["us"]와 default_inference_geo: "us"로 자동 구성됐어요. 코드 변경은 필요 없어요. 기존 데이터 레지던시 요구 사항은 새 geo 제어를 통해 계속 집행돼요.
무엇이 바뀌었나요?
기존 옵트아웃은 모든 요청을 US 기반 인프라로 제한하는 조직 수준 설정이었어요. 새 데이터 레지던시 제어는 이를 두 가지 메커니즘으로 대체해요:
- 요청별 제어:
inference_geo매개변수로 각 API 호출에"us"또는"global"을 지정할 수 있어 요청 수준의 유연성을 줘요. - 워크스페이스 제어: Console의
default_inference_geo와allowed_inference_geos설정으로 워크스페이스의 모든 키에 걸쳐 geo 정책을 집행할 수 있어요.
워크스페이스에 무슨 일이 있었나요?
워크스페이스가 자동으로 마이그레이션됐어요:
| 기존 설정 | 새 동등 설정 |
|---|---|
| 글로벌 라우팅 옵트아웃(US 전용) | allowed_inference_geos: ["us"], default_inference_geo: "us" |
워크스페이스의 키를 사용하는 모든 API 요청은 US 기반 인프라에서 계속 실행돼요. 현재 동작을 유지하기 위해 필요한 조치는 없어요.
글로벌 라우팅을 사용하려면
데이터 레지던시 요구 사항이 바뀌어 더 나은 성능·가용성을 위해 글로벌 라우팅을 활용하고 싶다면, 워크스페이스의 추론 geo 설정을 업데이트해 허용 geos에 "global"을 포함하고 default_inference_geo를 "global"로 설정하세요. 워크스페이스 수준 제한 참고.
요금 영향
이전 모델은 이 마이그레이션의 영향을 받지 않아요. 새 모델의 현재 요금은 요금 참고.
현재 제한 사항
- 공유 요금 한도: 요금 한도는 모든 geos에서 공유돼요.
- 추론 geo:
"us"와"global"만 사용할 수 있어요. - 워크스페이스 geo: 현재
"us"만 사용할 수 있어요. 워크스페이스 geo는 워크스페이스 생성 후 변경할 수 없어요.
다음 단계
- 요금 (Pricing) — 이동 — 데이터 레지던시 요금 상세 보기.
- 워크스페이스 (Workspaces) — 이동 — 워크스페이스 구성 알아보기.
- Usage and Cost API — 이동 — 데이터 레지던시별 사용량·비용 추적.