Residência de dados com Claude Code em região única no Amazon Bedrock

O desafio: inferência de IA dentro de uma única região AWS

Uma organização global com sede nos Estados Unidos chegou à AWS com uma exigência aparentemente simples: permitir que seus engenheiros usassem o Claude Code com uma restrição clara de residência de dados. O processamento das inferências do Amazon Bedrock precisava ocorrer em Londres (região eu-west-2), não apenas ser chamado a partir de Londres. O time de compliance havia traçado uma linha dura: prompts, respostas e todo processamento intermediário deveriam permanecer dentro de uma única região AWS.

A AWS explorou dois caminhos para resolver esse problema e documentou os detalhes — incluindo limitações, configurações e como verificar a conformidade via AWS CloudTrail. Vale reforçar um ponto importante antes de tudo: para a maioria das cargas de trabalho no Amazon Bedrock, a inferência entre regiões (cross-Region inference, ou CRIS) é a escolha padrão recomendada, pois distribui a carga, aumenta a capacidade disponível e dá acesso mais rápido a modelos novos. Os padrões descritos aqui se aplicam apenas quando o requisito de compliance exige uma região específica — não apenas uma geografia como “em algum lugar na UE”.

Dois endpoints, dois caminhos

O Amazon Bedrock expõe os modelos Claude por meio de dois endpoints distintos. A escolha entre eles determina como a residência de dados é garantida — e em quais regiões isso é possível.

Classic Amazon Bedrock (bedrock-runtime)

É a API de invocação original do Amazon Bedrock. O Claude Code a utiliza quando a variável de ambiente CLAUDE_CODE_USE_BEDROCK=1 está definida. Para manter as requisições em uma única região, é necessário criar um application inference profile apontando para o modelo base da região desejada — os perfis de inferência definidos pelo sistema são cross-region por padrão.

Mantle (bedrock-mantle)

É um endpoint mais recente do Amazon Bedrock que serve os modelos Claude no formato nativo da API da Anthropic. O Claude Code o utiliza quando CLAUDE_CODE_USE_MANTLE=1 está definido. O roteamento para uma única região é nativo: basta definir AWS_REGION e o Mantle resolve o endpoint para aquela região diretamente, sem necessidade de criar perfis de inferência adicionais.

Cada endpoint tem sua própria disponibilidade regional e linha de modelos:

  • Classic Amazon Bedrock: suporte a inferência in-region apenas em eu-west-2 (Londres), para os modelos anthropic.claude-opus-4-6-v1 e anthropic.claude-sonnet-4-6.
  • Mantle: suporte in-region em 7 regiões (Irlanda, Estocolmo, Tóquio, Melbourne, US East N. Virginia, US East Ohio e US West Oregon), com acesso aos modelos anthropic.claude-sonnet-5, anthropic.claude-opus-4-8 e anthropic.claude-haiku-4-5.

A escolha da região define o caminho. Para Londres (eu-west-2), somente o Caminho 2 (classic Amazon Bedrock) funciona. Para as sete regiões suportadas pelo Mantle, o Caminho 1 é mais simples e dá acesso a modelos mais recentes. Para outras regiões, nenhum dos dois padrões se aplica hoje.

Caminho 1: Mantle para regiões suportadas

Se o requisito de compliance aponta para uma das sete regiões com suporte nativo no Mantle, essa é a opção mais direta. Não é necessário criar nenhum recurso adicional na AWS além da política de Gerenciamento de Identidade e Acesso (IAM). A configuração resume-se a três variáveis de ambiente:

# Route Claude Code through the Mantle endpoint
# Ireland, an in-Region Mantle Region
export CLAUDE_CODE_USE_MANTLE=1
export AWS_REGION=eu-west-1

# Pin the model family aliases to Mantle model IDs
export ANTHROPIC_DEFAULT_OPUS_MODEL='anthropic.claude-opus-4-8'
export ANTHROPIC_DEFAULT_SONNET_MODEL='anthropic.claude-sonnet-5'
export ANTHROPIC_DEFAULT_HAIKU_MODEL='anthropic.claude-haiku-4-5'

O Claude Code não possui credenciais próprias — ele assina as chamadas ao Amazon Bedrock com as credenciais AWS já presentes no ambiente do desenvolvedor. A política de IAM (Gerenciamento de Identidade e Acesso da AWS) abaixo deve ser anexada ao principal IAM que os desenvolvedores utilizam (a role assumida via IAM Identity Center, por exemplo). Ela restringe chamadas Mantle apenas à região alvo:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowClaudeCodeMantleInIrelandOnly",
      "Effect": "Allow",
      "Action": [
        "bedrock-mantle:CreateInference",
        "bedrock-mantle:Get*",
        "bedrock-mantle:List*"
      ],
      "Resource": "arn:aws:bedrock-mantle:eu-west-1:111122223333:project/*",
      "Condition": {
        "StringEquals": {
          "aws:RequestedRegion": "eu-west-1"
        }
      }
    }
  ]
}

A condição aws:RequestedRegion rejeita qualquer chamada Mantle feita fora do endpoint da Irlanda — mesmo que o desenvolvedor configure AWS_REGION incorretamente, o IAM bloqueia a chamada. Um detalhe importante: no Mantle, o recurso da política é um projeto, não um modelo. Isso significa que a política de identidade controla apenas a região. Para restringir também os modelos permitidos, é necessário usar uma política de controle de serviço (SCP).

Caminho 2: Application inference profile para regiões não cobertas pelo Mantle

O requisito de compliance do cliente era especificamente Londres, e o Mantle não oferece roteamento in-region para eu-west-2 — o endpoint EU do Mantle roteia por toda a geografia europeia, podendo processar em Frankfurt, Irlanda ou Paris. O classic Amazon Bedrock é a única opção para London.

Há ainda uma restrição adicional: conforme os model cards do Claude Opus 4.6 e do Claude Sonnet 4.6, eu-west-2 é atualmente a única região onde esses modelos oferecem inferência in-region no classic Amazon Bedrock. As versões Opus 4.7 e 4.8 são Geo-only nesse endpoint.

O problema é que esses modelos não podem ser chamados diretamente pelo seu model ID — o Amazon Bedrock exige que sejam invocados por meio de um inference profile. Os perfis definidos pelo sistema são cross-region (prefixos eu. e global.), o que contradiz o requisito. A solução é criar um application inference profile apontando para o ARN (Nome de Recurso da Amazon) do modelo base na região desejada:

aws bedrock create-inference-profile \
  --region eu-west-2 \
  --inference-profile-name "claude-code-opus-london" \
  --model-source copyFrom="arn:aws:bedrock:eu-west-2::foundation-model/anthropic.claude-opus-4-6-v1"

aws bedrock create-inference-profile \
  --region eu-west-2 \
  --inference-profile-name "claude-code-sonnet-london" \
  --model-source copyFrom="arn:aws:bedrock:eu-west-2::foundation-model/anthropic.claude-sonnet-4-6"

Cada comando retorna um inferenceProfileArn no formato arn:aws:bedrock:eu-west-2:<account-id>:application-inference-profile/<id>. Esses ARNs são usados como identificadores de modelo no Claude Code. Application inference profiles também habilitam rastreamento de custo e uso por perfil na fatura AWS.

A configuração de ambiente fica assim:

# Route Claude Code through classic Bedrock in London
export CLAUDE_CODE_USE_BEDROCK=1
export AWS_REGION=eu-west-2

# Map the model aliases to the London application inference profiles
export ANTHROPIC_DEFAULT_OPUS_MODEL='arn:aws:bedrock:eu-west-2::application-inference-profile/'
export ANTHROPIC_DEFAULT_SONNET_MODEL='arn:aws:bedrock:eu-west-2::application-inference-profile/'

Para implantações em equipe, a recomendação é definir essas variáveis em um arquivo de configuração gerenciado em vez do shell individual de cada engenheiro, garantindo consistência e controle centralizado.

A política IAM para esse caminho inclui os ARNs dos perfis de inferência e dos modelos base, além das ações necessárias:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowClaudeCodeInLondonOnly",
      "Effect": "Allow",
      "Action": [
        "bedrock:InvokeModel",
        "bedrock:InvokeModelWithResponseStream",
        "bedrock:GetInferenceProfile",
        "bedrock:ListInferenceProfiles"
      ],
      "Resource": [
        "arn:aws:bedrock:eu-west-2::application-inference-profile/",
        "arn:aws:bedrock:eu-west-2::application-inference-profile/",
        "arn:aws:bedrock:eu-west-2::foundation-model/anthropic.claude-opus-4-6-v1",
        "arn:aws:bedrock:eu-west-2::foundation-model/anthropic.claude-sonnet-4-6"
      ],
      "Condition": {
        "StringEquals": {
          "aws:RequestedRegion": "eu-west-2"
        }
      }
    }
  ]
}

Uma vantagem desse caminho em relação ao Mantle: o ARN do modelo base no resource da política permite restringir região e modelos em uma única política de identidade, sem precisar de SCP.

Verificando a conformidade com AWS CloudTrail

Toda chamada do Claude Code ao Amazon Bedrock deve aparecer no AWS CloudTrail da região alvo — e em nenhuma outra. A forma de consultar depende do caminho utilizado, pois os dois endpoints registram eventos de maneiras distintas.

Caminho 2 (classic Amazon Bedrock)

As invocações de modelo são registradas como InvokeModel na event source bedrock.amazonaws.com. Para consultar:

aws cloudtrail lookup-events \
  --region eu-west-2 \
  --lookup-attributes AttributeKey=EventName,AttributeValue=InvokeModel

Um evento em conformidade contém:

{
  "eventName": "InvokeModel",
  "eventSource": "bedrock.amazonaws.com",
  "awsRegion": "eu-west-2",
  "requestParameters": {
    "modelId": "arn:aws:bedrock:eu-west-2:111122223333:application-inference-profile/opus-london"
  }
}

Caminho 1 (Mantle)

O Mantle registra inferências como CreateInference na event source bedrock-mantle.amazonaws.com, e esse é um evento de dados do CloudTrail. Antes de verificar qualquer coisa, é necessário habilitar os data events do bedrock-mantle com um advanced event selector em uma trail ou event data store. Após habilitar o logging, a consulta é feita no AWS CloudTrail Lake:

SELECT eventName, awsRegion, element_at(requestParameters, 'model') AS model
FROM 
WHERE eventSource = 'bedrock-mantle.amazonaws.com'
AND eventName = 'CreateInference'

Independentemente do caminho, três verificações confirmam a conformidade: (1) o campo awsRegion de todos os eventos deve corresponder à região alvo; (2) a mesma consulta executada em todas as outras regiões deve retornar zero resultados; (3) qualquer evento com errorCode: AccessDenied deve ser rastreável a um teste intencional.

Comparativo entre os dois caminhos

  • Caminho 1 (Mantle): 7 regiões suportadas, modelos mais recentes (Sonnet 5, Opus 4.8, Haiku 4.5), zero recursos AWS adicionais a criar, 3 variáveis de ambiente.
  • Caminho 2 (classic Amazon Bedrock): apenas Londres disponível, modelos Opus 4.6 e Sonnet 4.6, criação de 2 application inference profiles, 4 variáveis de ambiente.

Antes de definir qual caminho seguir, a recomendação é verificar o status in-region atual nos model cards do Amazon Bedrock, pois a disponibilidade muda à medida que novos modelos chegam às regiões.

Limpeza e próximos passos

Para remover os application inference profiles criados no Caminho 2:

aws bedrock delete-inference-profile \
  --region eu-west-2 \
  --inference-profile-identifier 

aws bedrock delete-inference-profile \
  --region eu-west-2 \
  --inference-profile-identifier 

Application inference profiles não geram custo por si só — o custo vem das invocações de modelo. Remover perfis não utilizados mantém a conta organizada e reduz a superfície de invocação acidental. O Caminho 1 não requer limpeza além de desanexar a política IAM.

O Claude Code pode executar os dois endpoints na mesma sessão: defina CLAUDE_CODE_USE_BEDROCK=1 e CLAUDE_CODE_USE_MANTLE=1 juntos, e os model IDs no formato Mantle roteiam para o Mantle enquanto os demais vão para o classic Invoke — útil em migrações ou quando diferentes famílias de modelos estão em endpoints distintos.

Para começar, acesse o console do Amazon Bedrock e verifique as tabelas de disponibilidade regional para os modelos desejados em ambos os endpoints. A documentação oficial cobre em detalhes os inference profiles, a inferência cross-region e o Claude Code no Amazon Bedrock.

Conteúdo relacionado

Fonte

Enforcing data residency with single-Region Claude Code on Amazon Bedrock (https://aws.amazon.com/blogs/machine-learning/enforcing-data-residency-with-single-region-claude-code-on-amazon-bedrock/)

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *