Blog

  • Acelerando Chamadas de Ferramentas em Agentes de IA com Personalização de Modelos Sem Servidor no Amazon SageMaker

    O Desafio da Chamada de Ferramentas em Agentes de IA

    A capacidade de um agente de IA chamar as ferramentas corretas no momento adequado é o que o torna útil em produção. Sem isso, um agente não consegue consultar bancos de dados, disparar fluxos de trabalho, recuperar dados em tempo real ou agir em nome do usuário. Porém, modelos base frequentemente alucinam sobre quais ferramentas usar, passam parâmetros incorretos e tentam executar ações quando deveriam pedir esclarecimentos. Essas falhas prejudicam a confiança do usuário e impedem a implantação em produção.

    A personalização de modelos sem servidor no Amazon SageMaker AI oferece uma solução. Usando Aprendizado de Reforço com Recompensas Verificáveis (RLVR, na sigla em inglês para Reinforcement Learning with Verifiable Rewards), o modelo gera suas próprias respostas candidatas, recebe um sinal indicando a qualidade, e atualiza seu comportamento para favorecer o que funciona. O processo é gerenciado totalmente pelo SageMaker AI, sem necessidade de gerenciar infraestrutura.

    Como Funciona o RLVR para Chamada de Ferramentas

    A chamada de ferramentas tem um objetivo naturalmente verificável: o modelo chamou a função correta com os parâmetros corretos? Essa característica a torna um caso de uso perfeito para RLVR.

    O desafio com aprendizado de reforço autogestionado é a complexidade operacional. Procurement de GPUs, orquestração de memória entre fases de rollout e treinamento, infraestrutura de recompensa e checkpoint acumulam rapidamente. A sensibilidade a hiperparâmetros adiciona outra camada de complexidade. O SageMaker AI assume esse trabalho, permitindo que você se concentre no modelo, nos dados e na função de recompensa.

    O SageMaker AI suporta famílias de modelos que incluem Amazon Nova, GPT-OSS, Llama, Qwen e DeepSeek, com técnicas como Supervised Fine-Tuning (SFT), Direct Preference Optimization (DPO), RLVR e Reinforcement Learning from AI Feedback (RLAIF). As métricas de treinamento e validação são rastreadas por integração com MLflow.

    Por Que RLVR é Melhor que SFT para Chamada de Ferramentas

    Supervised Fine-Tuning (SFT) requer exemplos rotulados de cada comportamento que você quer que o modelo aprenda. Para chamada de ferramentas, isso significa exemplos de chamar uma ferramenta, pedir esclarecimentos e recusar. Mas chamada de ferramentas também exige que o modelo decida entre esses comportamentos, e SFT frequentemente não consegue generalizar essa tomada de decisão além dos padrões específicos nos dados de treinamento.

    RLVR funciona de forma diferente. Para cada prompt, o modelo gera múltiplas respostas candidatas (neste exemplo, oito). Uma função de recompensa verifica quais estão corretas. O modelo então atualiza sua política para favorecer o que funcionou, usando Group Relative Policy Optimization (GRPO). GRPO compara a pontuação de recompensa de cada candidato contra a pontuação média do grupo e reforça respostas que pontuam acima da média. Com o tempo, o modelo aprende o formato de uma chamada de ferramenta e quando chamar em comparação com quando pedir.

    Preparação de Dados para Treinamento

    Um dataset de chamada de ferramentas precisa ensinar mais do que invocações corretas de API. Agentes em produção enfrentam três situações distintas:

    • O usuário fornece informação suficiente e o modelo deve chamar uma ferramenta
    • A solicitação do usuário está faltando parâmetros obrigatórios e o modelo deve pedir esclarecimentos
    • A solicitação é prejudicial ou fora do escopo e o modelo deve recusar

    Foram gerados 1.500 exemplos de treinamento sintéticos a partir de esquemas de ferramentas (previsão de clima, busca de voos, tradução, conversão de moeda, estatísticas) usando Kiro, um IDE com IA, para produzir prompts com variação realista em fraseado e especificidade entre os três comportamentos.

    O formato segue um padrão JSONL simples, onde cada linha contém um prompt (instrução do sistema e solicitação do usuário) e uma verdade fundamental (ground truth) no campo reward_model que a função de recompensa usa para avaliar.

    Exemplos dos Três Comportamentos

    Executar quando o usuário fornece tudo o que a ferramenta precisa:

    {
      "prompt": [
        {"role": "system", "content": "You are a helpful assistant. When using tools, respond with: [...]"},
        {"role": "user", "content": "Get weather for San Francisco"}
      ],
      "reward_model": {
        "ground_truth": "[{\"name\": \"get_weather_forecast\", \"arguments\": {\"city\": \"San Francisco\"}}]"
      }
    }

    Esclarecer quando um parâmetro obrigatório está faltando:

    {
      "prompt": [
        {"role": "system", "content": "You are a helpful assistant. When using tools, respond with: [...]"},
        {"role": "user", "content": "Get the weather"}
      ],
      "reward_model": {
        "ground_truth": "To provide you with the weather information, could you please specify the location?"
      }
    }

    Executar com múltiplos parâmetros:

    {
      "prompt": [
        {"role": "system", "content": "You are a helpful assistant. When using tools, respond with: [...]"},
        {"role": "user", "content": "Convert 50 EUR to USD"}
      ],
      "reward_model": {
        "ground_truth": "[{\"name\": \"currency_convert\", \"arguments\": {\"amount\": 50, \"from\": \"EUR\", \"to\": \"USD\"}}]"
      }
    }

    Note a diferença entre “Get weather for San Francisco” (chamada de ferramenta) e “Get the weather” (pedido de esclarecimento). Essa é a distinção que GRPO aprende bem. Para cada prompt, o modelo gera oito candidatos, a função de recompensa os pontua, e as pontuações são calculadas na média do grupo. Candidatos acima da média são reforçados, e com o tempo o modelo aprende quando chamar e quando pedir.

    Definindo a Função de Recompensa

    A função de recompensa define o que significa “correto” para o seu caso de uso. É escrita como uma função Python que recebe a resposta do modelo e a verdade fundamental dos dados de treinamento, retornando uma pontuação numérica.

    A função extrai chamadas de ferramentas da resposta do modelo, as analisa como JSON e as compara contra a verdade fundamental. A lógica de pontuação completa lida com extração de resposta, análise flexível para formatos alternativos durante o treinamento inicial e casos extremos em torno de incompatibilidades de tipo JSON.

    Aqui está a lógica de pontuação central:

    # After extracting and parsing tool calls from model response and ground truth:
    # Compare tool names
    pred_names = {tool.get('name', '') for tool in pred_tools}
    gt_names = {tool.get('name', '') for tool in gt_tools}
    if pred_names == gt_names:
        # Right function(s) - check if arguments also match
        perfect_match = True
        for pred_tool in pred_tools:
            for gt_tool in gt_tools:
                if pred_tool.get('name') == gt_tool.get('name'):
                    if pred_tool.get('arguments') != gt_tool.get('arguments'):
                        perfect_match = False
        score = 1.0 if perfect_match else 0.5
    elif pred_names & gt_names:
        # Partial overlap in function names
        score = 0.5
    else:
        # Wrong function entirely
        score = 0.0

    Os três níveis (1.0, 0.5 e 0.0) dão a GRPO um sinal de aprendizado mais rico. Se vários dos oito candidatos acertam a função mas perdem um parâmetro, a pontuação 0.5 os distingue de respostas completamente erradas. Isso ajuda o modelo a reconhecer que está no caminho certo. Para casos de esclarecimento e recusa onde a verdade fundamental é linguagem natural (sem tags TOOLCALL), a função de recompensa verifica se o modelo também evitou chamar uma ferramenta. Uma chamada de API desnecessária quando o modelo deveria ter feito uma pergunta ganha 0.0.

    Configuração de Treinamento e Resultados

    Na página de configuração de personalização, você aponta para seu dataset de treinamento e função de recompensa, depois define seus hiperparâmetros. Neste exemplo, foram usados tamanho de lote 128, taxa de aprendizado de 5e-6, 3 épocas e 8 rollouts por prompt. A configuração de rollouts é o mecanismo central de GRPO. Para cada prompt de treinamento, o modelo gera oito respostas diferentes, a função de recompensa pontua cada uma, e respostas que pontuam acima da média do grupo são reforçadas. Métricas de treinamento e validação são registradas no MLflow.

    Em um exemplo prático, o treinamento levou aproximadamente 40 minutos. A métrica de Estatísticas de Recompensa de Treinamento (a mais importante) mostra que a recompensa média entre os rollouts começou em torno de 0.28 e subiu para 0.65–0.68 em 30 etapas, mais que dobrando. Os ganhos mais acentuados acontecem nos primeiros 10 passos conforme o modelo aprende o formato básico de chamada de ferramenta e a estrutura de decisão. Depois estabiliza após a etapa 20 conforme converge.

    Imagem original — fonte: Aws

    Os outros gráficos confirmam treinamento saudável. Policy Entropy diminui, significando que o modelo está ficando mais confiante em vez de adivinhar. Gradient Norm se estabiliza, significando que atualizações estão ficando menores e mais refinadas. Mean Advantage Estimate converge para zero, indicando que a política do modelo está estabilizando e a qualidade média de resposta está se alinhando com a linha de base de recompensa.

    Avaliação em Dados Não Vistos

    Após o treinamento ser concluído, você pode ver os modelos criados. É possível escolher continuar a personalização para iterar mais ajustando hiperparâmetros ou treinando com uma técnica diferente. Você também pode avaliar para comparar seu modelo personalizado contra o modelo base.

    A avaliação acontece em um conjunto de teste separado de 300 exemplos que foram excluídos do treinamento. O dataset de avaliação cobre os mesmos três comportamentos mas inclui ferramentas, fraseados e cenários que o modelo nunca viu. Testa search_restaurants, get_stock_price e calculate_standard_deviation, nenhum deles apareceu durante o treinamento. Inclui também casos de recusa para solicitações prejudiciais como gerar conteúdo violento ou criar malware, testando se o modelo generaliza comportamento seguro para ameaças novas.

    A avaliação executa métricas NLP padrão juntamente com sua função de recompensa personalizada contra o conjunto mantido em separado:

    • Tool Call Reward é sua métrica personalizada e a medida mais direta do que você treinou. Saltou de 0.35 para 0.55, uma melhoria de 57%. Em termos práticos, isso significa que o modelo fine-tuned toma a decisão correta de chamada de ferramenta significativamente mais frequentemente. Chama a função correta com os parâmetros corretos quando deve, pede esclarecimento quando informação está faltando e recusa quando apropriado.
    • F1 Score, Rouge1 e RougeL melhoraram 14–19 pontos percentuais, refletindo melhor geração de nomes de função corretos, chaves de parâmetros e valores em todo o contexto.
    • Exact Match dobrou de 11% para 21%. Essa métrica requer correspondência de saída caractere-por-caractere, então até pequenas diferenças de formatação contam como erro. Os 21% de correspondência exata ao lado de 64.6% F1 sugerem que o modelo frequentemente acerta a semântica mesmo quando a formatação da superfície difere ligeiramente.

    Todos os resultados estão em dados mantidos em separado com ferramentas e cenários que o modelo não viu durante o treinamento. As melhorias se transferem para ferramentas novas, significando que o modelo aprendeu padrões gerais de chamada de ferramenta em vez de memorizar o conjunto de treinamento.

    Exemplos de Respostas do Modelo Fine-Tuned

    Execução de ferramenta:

    Prompt: "What's the stock price of AMZN?"

    Resposta do modelo: [{"name": "get_stock_price", "arguments": {"ticker": "AMZN"}}]

    Esclarecimento:

    Prompt: "Find me a restaurant nearby"

    Resposta do modelo: "I'd be happy to help you find a restaurant! Could you please provide the cuisine type or location you're interested in?"

    Quase acerto:

    Prompt: "What's the standard deviation of 10, 20, 30, 40, 50?"

    Resposta do modelo: [{"name": "calculate_standard_deviation", "arguments": {"numbers": "10, 20, 30, 40, 50"}}]

    No caso de quase acerto, o modelo selecionou a ferramenta correta mas passou os números como string em vez de array. Isso recebe uma pontuação de recompensa de 0.5 (função correta, formato de parâmetro errado) e representa o tipo de erro que você teria como alvo em próxima iteração através de dados de treinamento adicional ou refinamento da função de recompensa.

    Implantação do Modelo Fine-Tuned

    Com avaliação confirmando melhoria, você pode implantar o modelo fine-tuned diretamente da página de detalhes do modelo. Escolha Implantar e selecione seu alvo de implantação: seja um endpoint do SageMaker AI ou Amazon Bedrock. Você também pode baixar os pesos do modelo de Amazon S3 para implantação autogestionada.

    Próximos Passos para Melhorias

    Para aumentar a precisão, você pode expandir seus dados de treinamento com ferramentas adicionais, casos extremos e conversas multi-turn para cobrir mais dos cenários que seus agentes encontram em produção. Você também pode refinar sua função de recompensa para penalizar modos de falha específicos, como o problema string-vs-array mostrado anteriormente, ou adicionar crédito parcial para outros padrões de quase acerto.

    Se você estiver executando fluxos de trabalho com agentes, seus logs de produção são uma fonte de dados de treinamento de alta qualidade que pode tornar o modelo ainda mais eficaz para seu caso de uso específico.

    Além de chamada de ferramentas, RLVR se aplica a outras tarefas de raciocínio onde a correção é verificável, como planejamento multi-etapa, extração de dados estruturados ou geração de código.

    Acessando a Funcionalidade

    Embora este artigo caminhe através do fluxo de trabalho de interface do usuário, um SDK para acesso programático também está disponível. Para mais informações, consulte a documentação de personalização de modelo SageMaker AI.

    Para começar, experimente personalização de modelo de IA sem servidor no Amazon SageMaker AI com seus próprios casos de uso.

    Fonte

    Accelerate agentic tool calling with serverless model customization in Amazon SageMaker AI (https://aws.amazon.com/blogs/machine-learning/accelerate-agentic-tool-calling-with-serverless-model-customization-in-amazon-sagemaker-ai/)

  • CloudTroop Weekly #006 — 2026-w14





    CloudTroop Weekly #006 — 2026-w14

    5 de abril de 2026

    Resumo da Semana

    A semana foi dominada por segurança e IA agêntica em produção. A AWS entregou ferramentas que mudam a régua: pentests contínuos com IA, Bedrock Guardrails entre contas e controle de domínios para agentes autônomos saíram do papel. Ao mesmo tempo, ficou claro que frameworks tradicionais de segurança não dão conta de agentes autônomos — novos controles determinísticos são necessários. Compliance também ganhou força, com automação de evidências e guia prático para ISO 27001:2022. Quem opera multi-conta e workloads de IA precisa revisar postura agora.

    O que muda na prática

    • Pentests deixam de ser eventos pontuais: o AWS Security Agent automatiza avaliações contínuas com IA, reduzindo custo em até 90% e eliminando janelas cegas entre ciclos de auditoria.
    • Governança de IA agêntica vira obrigação operacional: Bedrock Guardrails entre contas e controle de domínios via Network Firewall permitem centralizar políticas de segurança para agentes em produção sem configuração manual por conta.
    • Coleta de evidências de compliance pode ser automatizada: a combinação de IA com fluxos de captura reduz drasticamente o esforço manual em auditorias, mudando o papel do time de GRC de executor para revisor.

    Ações da semana

    • Habilite o Bedrock Guardrails com escopo entre contas na sua organização AWS e mapeie quais workloads de IA generativa ainda operam sem controles centralizados — é configuração de horas, não dias.
    • Acesse o guia de conformidade ISO/IEC 27001:2022 para AWS e identifique pelo menos três controles da sua certificação que podem ser mapeados diretamente para serviços que você já usa.

    Top 10 da Semana

    1

    Testes de Penetração Contínuos com AWS Security Agent agora GA

    Reduz em até 90% o custo de pentests ao automatizá-los com IA 24/7, mudando avaliações periódicas para contínuas.

    Para quem: Times de segurança e arquitetos responsáveis por compliance e postura de segurança em nuvem.

    Segurança, IA

    2

    Quatro Princípios de Segurança para Sistemas de IA Autônoma

    Frameworks tradicionais de segurança são insuficientes para agentes autônomos; este guia define controles determinísticos externos essenciais.

    Para quem: Arquitetos de soluções e engenheiros de segurança que constroem ou governam sistemas de IA agêntica.

    Segurança, IA agêntica

    3

    Bedrock Guardrails: proteções entre contas agora GA

    Permite centralizar controles de segurança de IA em toda a organização AWS sem configuração manual por conta.

    Para quem: Equipes de segurança e cloud governance que gerenciam múltiplas contas com workloads de IA generativa.

    Segurança, IA

    4

    AWS KMS e Encryption SDK superam limites da criptografia AES-GCM

    Elimina o risco operacional de ultrapassar limites de criptografia simétrica em escala sem rastreamento manual de chaves.

    Para quem: Engenheiros de segurança e desenvolvedores que implementam criptografia em aplicações de alto volume na AWS.

    Segurança, Criptografia

    5

    Controle de domínios para agentes de IA com Bedrock AgentCore

    Resolve um gap crítico de segurança ao restringir o acesso à internet de agentes de IA com filtragem corporativa via Network Firewall.

    Para quem: Engenheiros de segurança e arquitetos que colocam agentes de IA em produção com acesso à internet.

    Segurança, IA agêntica

    6

    Amazon Bedrock AgentCore Evaluations: avalie agentes em produção

    Oferece avaliação sistemática de agentes de IA em três níveis hierárquicos, essencial para garantir qualidade antes e após o deploy.

    Para quem: Engenheiros de ML e times de produto que desenvolvem e operam agentes de IA baseados em Bedrock.

    IA agêntica, Qualidade

    7

    Amazon ECS: Daemons Gerenciados para instâncias ECS

    Simplifica o deploy centralizado de agentes de segurança e observabilidade em toda a frota de containers, reduzindo drift de configuração.

    Para quem: Engenheiros de plataforma e DevOps que operam clusters ECS com requisitos de segurança e observabilidade uniformes.

    Containers, Operações

    8

    Guia de Conformidade ISO/IEC 27001:2022 para AWS disponível

    Fornece mapeamento prático de controles ISO 27001:2022 para serviços AWS, acelerando certificações e auditorias de SGSI.

    Para quem: Arquitetos de segurança, equipes de compliance e profissionais que conduzem ou preparam auditorias ISO 27001.

    Compliance, Segurança

    9

    CloudWatch integra achados CSPM do Security Hub org-wide

    Centraliza vulnerabilidades e achados de conformidade de múltiplas contas no CloudWatch, unificando observabilidade e postura de segurança.

    Para quem: Times de segurança e SREs responsáveis por monitoramento centralizado em ambientes multi-conta.

    Observabilidade, Segurança

    10

    Automatizando coleta de evidências de conformidade com IA

    Reduz drasticamente o esforço manual de auditorias ao gerar fluxos automatizados de captura de evidências a partir de documentos de compliance.

    Para quem: Profissionais de GRC, auditores internos e equipes de compliance que gerenciam evidências para certificações regulatórias.

    Compliance, IA


  • Amazon Bedrock Guardrails anuncia disponibilidade geral de proteções entre contas

    Controle de segurança centralizado para modelos de IA

    A AWS anunciou a disponibilidade geral de uma capacidade significativa no Amazon Bedrock Guardrails: as proteções entre contas (cross-account safeguards). Essa funcionalidade permite que as equipes de segurança central de uma organização implementem automaticamente controles de segurança em todas as contas AWS, eliminando a necessidade de configurações repetitivas em cada conta individual.

    O Amazon Bedrock Guardrails já oferecia salvaguardas configuráveis capazes de bloquear até 88% do conteúdo prejudicial em múltiplas modalidades (texto, imagem e outros formatos), tanto em prompts de entrada quanto em respostas dos modelos de fundação. Agora, com as proteções entre contas, essa capacidade ganhou uma camada de automação e centralização organizacional.

    Como funcionam as proteções entre contas

    O mecanismo é direto: administradores podem especificar um identificador de guardrail da conta de gerenciamento em uma nova política do Amazon Bedrock que se propaga automaticamente para todas as entidades membro, incluindo unidades organizacionais (OUs) e contas individuais. Dessa forma, toda e qualquer invocação de modelo no Amazon Bedrock passa automaticamente pelos mesmos controles de segurança definidos centralmente.

    Esse modelo de enforçamento oferece três níveis de implementação:

    • Proteção de baseline organizacional: Define um padrão de segurança uniforme para toda a organização
    • Controles por conta: Permite ajustes específicos conforme necessidade de departamentos ou unidades de negócio
    • Salvaguardas específicas de aplicação: Completa as políticas organizacionais com proteções direcionadas para casos de uso particulares

    Durante as invocações do modelo, múltiplos guardrails são aplicados de forma conjunta, garantindo que o conteúdo prejudicial seja bloqueado mesmo com regras em diferentes níveis de hierarquia.

    Disponibilidade e acesso

    A funcionalidade já está disponível em todas as regiões comerciais da AWS e em regiões GovCloud onde o Bedrock Guardrails é suportado. Ela pode ser acessada tanto pelo console de gerenciamento da AWS quanto através das APIs suportadas.

    Para quem deseja aprofundar a implementação dessa capacidade, a AWS disponibiliza recursos complementares. Recomendamos consultar o artigo de blog sobre guardrails centralizados, explorar a documentação completa do Amazon Bedrock Guardrails e conferir a página de serviço do Amazon Bedrock Guardrails para informações adicionais. Também existe documentação específica sobre políticas do Amazon Bedrock no guia de organizações da AWS.

    Impacto para equipes de segurança

    Essa mudança reduz significativamente o overhead operacional de grandes organizações que precisam manter padrões de segurança consistentes em dezenas ou centenas de contas AWS. Em vez de replicar manualmente cada guardrail em cada ambiente, as equipes de segurança central podem agora estabelecer políticas uma única vez e deixar que elas se propaguem automaticamente para toda a infraestrutura de IA da organização.

    Fonte

    Amazon Bedrock Guardrails announces general availability of cross-account safeguards (https://aws.amazon.com/about-aws/whats-new/2026/04/bedrock-guardrails-cross-account-safeguards/)

  • Agentes de Troubleshooting e Upgrade do Apache Spark Agora Disponíveis como Poderes Kiro

    Automação Inteligente para Operações com Apache Spark

    A AWS anunciou a disponibilidade de dois agentes especializados para Apache Spark no Amazon EMR, agora integrados como poderes no Kiro — uma plataforma que oferece acesso em um clique a operações Spark assistidas por inteligência artificial. Essa integração representa um avanço significativo na forma como engenheiros de dados lidam com desafios comuns em ambientes de processamento de dados em larga escala.

    Os novos poderes transformam a experiência dos profissionais ao reduzir drasticamente o tempo necessário para resolver problemas. Enquanto troubleshooting manual poderia demandar horas, o agente especializado comprime esse processo em minutos. De forma similar, atualizações de versão do Spark — que tradicionalmente consumiam meses de planejamento e execução — agora podem ser completadas em semanas.

    Capacidades dos Agentes

    Agente de Troubleshooting

    O agente de diagnóstico funciona através de análise profunda de logs, métricas e configurações. Ele opera tanto no EMR em EC2 quanto no EMR Serverless, oferecendo uma visão integrada do ambiente. Quando um job Spark falha, o agente identifica a causa raiz e fornece recomendações de código específicas para aplicações PySpark, acelerando a recuperação de falhas.

    Agente de Upgrade

    O agente de atualização automatiza o processo de upgrade de versões Spark, como migração do EMR 6.5 para EMR 7.12. A ferramenta gerencia transformação de código e resolução de dependências, realizando validação remota e comparação de qualidade de dados no EMR — tarefas que normalmente exigem intervenção manual extensiva.

    Segurança e Auditoria

    Ambos os poderes conectam aos agentes Spark através do MCP Proxy para AWS, utilizando autenticação baseada em papéis IAM. Cada ação executada pelos agentes é registrada no AWS CloudTrail, garantindo rastreabilidade completa e conformidade com políticas de auditoria empresariais.

    Como Começar

    Os agentes estão disponíveis em todas as regiões comerciais da AWS. Para iniciá-los, engenheiros de dados podem instalar o poder de troubleshooting do Apache Spark ou o poder de upgrade diretamente do Kiro IDE. A documentação dos agentes de troubleshooting e agentes de upgrade fornece instruções detalhadas para configuração e uso.

    Impacto para Equipes de Dados

    Essa inovação tem implicações práticas significativas para organizações que operam Apache Spark em escala. A redução de tempo em troubleshooting libera recursos de engenharia para trabalhos de maior valor agregado. A aceleração de upgrades de versão reduz ciclos de manutenção e permite que equipes aproveitem mais rapidamente melhorias de performance e segurança em versões mais recentes.

    Fonte

    Apache Spark troubleshooting and upgrade agents now available as Kiro powers (https://aws.amazon.com/about-aws/whats-new/2026/04/amazon-emr-spark-troubleshooting-upgrade-kiro-power/)

  • Como AWS KMS e AWS Encryption SDK Superam os Limites da Criptografia Simétrica

    Entendendo o Desafio da Criptografia em Escala

    Aplicações que operam em larga escala e lidam com volumes significativos de dados criptografados enfrentam um desafio técnico importante: acompanhar os limites de criptografia e gerenciar a rotação de chaves de forma eficiente. Este artigo explora como a AWS Key Management Service (AWS KMS) e o AWS Encryption SDK resolvem automaticamente os limites de criptografia do padrão AES-GCM (Advanced Encryption Standard em Galois Counter Mode), utilizando métodos de derivação de chaves. Isso elimina a necessidade de os desenvolvedores rastrearem manualmente esses limites.

    A abordagem utiliza chaves derivadas que são geradas a partir de uma chave principal por meio de um valor aleatório chamado nonce. Dessa forma, cada operação de criptografia usa uma chave única, permitindo que a chave principal seja reutilizada por muito mais tempo. Métodos similares de derivação de chaves têm sido propostos em esquemas recentes como o (KC-)XAES, DNDK v2, e outros trabalhos acadêmicos da comunidade criptográfica.

    Os Limites da Criptografia Simétrica

    Criptografia AEAD e AES-GCM

    Algoritmos de criptografia simétrica protegem grandes volumes de dados, tanto em trânsito quanto em repouso. Os cifras modernos também autenticam os dados usando uma tag de autenticação — essas são chamadas de cifras AEAD (Authenticated Encryption with Additional Data). Exemplos incluem o AES-GCM e o ChaCha20/Poly1305.

    O AES-GCM é o algoritmo de criptografia mais amplamente utilizado e foi padronizado pelo NIST na especificação SP 800-38D. Este algoritmo utiliza uma chave de 128 ou 256 bits (K), um vetor de inicialização (IV) de 96 bits e criptografa um texto simples (P), autenticando também dados adicionais (AAD). O resultado é um texto cifrado (C) e uma tag de autenticação (T).

    Na descriptografia, o receptor recupera o texto simples original utilizando a chave, o IV e os dados autenticados, depois valida a tag para garantir a integridade da mensagem.

    Limite de Invocações de Criptografia

    Um requisito crítico para a segurança do AES-GCM é que o par (chave K, IV) nunca se repita durante toda a vida útil da chave. Se isso acontecer, as propriedades de segurança do algoritmo são comprometidas. A especificação SP 800-38D exige que a implementação mantenha uma probabilidade de reutilização inferior a 1 em 4,29 bilhões (menor que 2⁻³²).

    Isso pode ser alcançado utilizando um IV determinístico que não se repete ou um IV aleatório. Se um IV aleatório é usado, torna-se necessário trocar a chave após 2³² criptografias. Protocolos comuns como TLS ou IKEv2/IPsec evitam colisões do par (K, IV) usando IVs determinísticos que começam com um valor aleatório e são incrementados para cada conexão.

    Limite de Volume de Dados

    Além do limite de invocações, existe também um limite relacionado ao volume total de dados que pode ser criptografado com a mesma chave. O contador de blocos no AES-GCM é de 32 bits, o que resulta em um limite de 2³²-2 bytes (aproximadamente 68,72 GB) por operação de criptografia, ou seja, por cada par único (K, IV).

    Quando não se restringe o volume total de dados criptografados, reduz-se a garantia de segurança de indistinguibilidade — a capacidade de um adversário de não conseguir distinguir entre dois textos cifrados diferentes. Quanto maior a proteção de indistinguibilidade, menor é o total de bytes que podem ser criptografados sob uma única chave.

    A especificação do NIST sugere um limite de 2⁶⁸ bytes protegidos sob uma chave única, o que fornece uma probabilidade de indistinguibilidade de 50%. Porém, margens de segurança mais conservadoras baseadas em diferentes análises criptográficas são frequentemente utilizadas. A AWS adota uma abordagem ainda mais conservadora, impondo por padrão uma probabilidade de indistinguibilidade negligenciável (menor que 2⁻³²).

    Quando se atinge os limites de dados do AES-GCM para uma determinada margem de segurança, é necessário fazer a rotação da chave simétrica. Em aplicações modernas de criptografia em larga escala, esses limites (por exemplo, 2³² criptografias com IVs aleatórios ou o volume máximo de dados por chave) podem ser atingidos. Rastrear esses limites em sistemas distribuídos com muitas sessões concorrentes adiciona complexidade operacional significativa. A AWS compartilhou essas dificuldades em um documento detalhado e uma apresentação no terceiro Workshop do NIST sobre Modos de Cifra em Blocos de 2023.

    Como AWS KMS Utiliza Chaves Derivadas

    A AWS KMS é um serviço gerenciado que permite criar e controlar as chaves utilizadas para criptografar e assinar dados. A API Encrypt do KMS suporta criptografia simétrica e assimétrica. Para criptografia com chaves simétricas, o AWS KMS utiliza AES-GCM com chaves de 256 bits para criptografar um texto simples de até 4 KB.

    Quando uma solicitação ao KMS Encrypt é feita, ela inclui o texto simples e o identificador da chave simétrica gerenciada pelo cliente armazenada no KMS. A chamada da API de Encrypt usa a chave para derivar uma chave de criptografia simétrica antes de criptografar o texto simples.

    O processo funciona da seguinte forma: a AWS KMS gera um nonce aleatório de 128 bits e produz uma chave simétrica de 256 bits a partir da chave principal especificada, utilizando uma função de derivação de chaves (KDF). Essa função recebe a chave, um rótulo e contexto, um nonce específico da invocação, e um comprimento de saída desejado, produzindo material de chave do tamanho especificado.

    Para o AWS KMS, a função KDF é o Counter Mode KDF conforme a especificação SP 800-108r1 do NIST, que produz 256 bits de material de chave utilizando HMAC-SHA256 como função pseudoaleatória. A chave derivada é produzida com uma chamada ao HMAC-SHA256 com a chave principal:

    Subsequentemente, o AWS KMS gera um IV aleatório de 96 bits e criptografa o texto simples de entrada com AES-GCM. O resultado inclui o IV, o nonce, o texto cifrado e a tag de autenticação. Estes componentes são retornados em um blob de texto cifrado (CiphertextBlob) que pode ser descriptografado em chamadas posteriores à API Decrypt.

    Intuitivamente, o nonce aleatório de 128 bits usado para derivar uma chave única de criptografia sob uma chave gerenciada permite que o chamador ultrapasse significativamente o limite de 2³² invocações de criptografia sob essa chave. Além disso, o limite de 4 KB no tamanho da carga útil para uma chamada AWS Encrypt garante que o volume total de dados criptografados sob uma chave de criptografia permaneça bem abaixo dos limites totais de criptografia do NIST ou de outras margens mais conservadoras. Para mais detalhes sobre os fundamentos matemáticos e criptográficos desse esquema, consulte o artigo Key Management Systems at the Cloud Scale.

    Como AWS Encryption SDK Aplica Modos de Chave Derivada

    O AWS Encryption SDK é uma biblioteca de criptografia do lado do cliente usada para criptografar e descriptografar dados. Pode ser configurado para usar cache de chaves de dados, reduzindo chamadas de API ao criptografar múltiplas cargas úteis.

    Usar uma chave derivada baseada em nonce para cada invocação de AES-GCM elimina a necessidade de os clientes acompanharem o volume total de dados que criptografam sob uma única chave de dados. Embora o AWS Encryption SDK ofereça muita flexibilidade para acomodar diversos cenários de criptografia, a configuração padrão lida com derivação de chaves e dimensionamento de frames automaticamente, elimando a necessidade de ajustar essas configurações para a maioria dos casos de uso.

    Para derivar uma chave diferente para cada invocação, assim como o AWS KMS, o SDK utiliza um valor aleatório gerado, a chave principal e contexto específico da invocação na KDF. O valor aleatório tem 256 bits na configuração padrão. A KDF subjacente é a Função de Derivação de Chaves baseada em HMAC (HKDF — HMAC-based Extract-and-Expand Key Derivation Function) com SHA512 como o hash padrão.

    A chave derivada é produzida com uma chamada ao HKDF com a chave principal, usando um rótulo constante e um contexto que consiste em constantes concatenadas com um valor aleatório de 256 bits. Subsequentemente, o AWS Encryption SDK usa a chave derivada para criptografar o conteúdo do usuário, dividido em frames de 4 KB por padrão.

    Cada frame de texto simples é criptografado com AES-GCM usando um IV determinístico que consiste em um contador de frames, onde o ID do frame é menor que 2³². O dado autenticado adicional (AAD) é específico do frame de dados do Encryption SDK. Na descriptografia, o receptor deriva a chave da mesma forma e descriptografa o texto cifrado para produzir o texto simples do frame, validando a tag de autenticação.

    O tamanho padrão de 4 KB por frame garante que por padrão não mais que 2⁴⁴ bytes (2³² frames de 4 KB cada) possam ser criptografados sob uma única chave de criptografia. Isso está bem abaixo do limite sugerido pelo NIST (2⁶⁸ bytes), mesmo com cache de chaves de dados. Também está bem abaixo do requisito conservador da AWS de probabilidade de indistinguibilidade menor que 2⁻³².

    O limite de invocações por chave, mesmo com cache de chaves de dados, excede as contagens de criptografia na maioria das aplicações em larga escala.

    Considerações sobre Versões Anteriores

    Enquanto a configuração padrão do AWS Encryption SDK faz escolhas conservadoras, se você estiver usando a versão legada 1.0 ou fizer alterações de configuração, poderá ter garantias de segurança menores. Por exemplo, um tamanho máximo customizado de frame de 2³²-1 bytes levaria a um tamanho total de texto simples maior, que ainda está abaixo do limite sugerido pelo NIST de 2⁶⁸ bytes, mas não necessariamente abaixo de outras margens conservadoras.

    Vale notar que a configuração padrão do AWS Encryption SDK também fornece propriedades de segurança menos conhecidas, como compromisso de chave. A string de comprometimento é produzida de forma similar à chave derivada, utilizando a chave principal e HKDF.

    Conclusão

    Ao derivar uma chave única para cada chamada de criptografia, a AWS KMS e o AWS Encryption SDK eliminam a necessidade de rastrear manualmente os limites do AES-GCM. Para compreender os fundamentos acadêmicos dos limites do AES-GCM, consulte a especificação SP 800-38D e o rascunho draft-irtf-cfrg-aead-limits.

    Para leitura adicional sobre a análise criptográfica do esquema de derivação de chaves utilizado no KMS, consulte Key Management Systems at the Cloud Scale. Para mais detalhes sobre a derivação de chaves AES-GCM do Encryption SDK, veja a referência de algoritmos do AWS Encryption SDK.

    Fonte

    How AWS KMS and AWS Encryption SDK overcome symmetric encryption bounds (https://aws.amazon.com/blogs/security/how-aws-kms-and-aws-encryption-sdk-overcome-symmetric-encryption-bounds/)

  • Amazon SageMaker Data Agent: novas capacidades de visualização e suporte a materialized views

    Novas funcionalidades do Data Agent no SageMaker

    A AWS expandiu as capacidades do Amazon SageMaker Data Agent com recursos que vão muito além da simples geração de código. O serviço agora oferece uma abordagem completa para fluxos de análise de dados, integrando visualização interativa, suporte a fontes externas e otimização automática de consultas — tudo operado por prompts em linguagem natural dentro dos notebooks do SageMaker Unified Studio.

    Gráficos interativos sob demanda

    Uma das novidades mais práticas é a geração automática de gráficos interativos. Você pode simplesmente solicitar ao Data Agent: “plot monthly revenue trends by region for 2025” (plote as tendências de receita mensal por região para 2025). O sistema gera um gráfico interativo diretamente no notebook, permitindo que você passe o mouse sobre os pontos de dados e realize modificações — sem precisar escrever uma única linha de código.

    Integração com Snowflake e dados externos

    O Data Agent agora permite que suas análises atravessem múltiplas plataformas. Quando você trabalha simultaneamente com dados da AWS e Snowflake, é possível consultar tabelas Snowflake através de conexões externas e combiná-las com dados do AWS Glue Data Catalog em um único comando. Essa integração elimina a necessidade de movimentar dados ou escrever lógica complexa de join manualmente.

    Otimização automática com materialized views

    Um dos recursos mais inteligentes é a capacidade do agente em analisar seus notebooks e sugerir otimizações. Você pode pedir: “analyze my notebook and suggest which queries would benefit from materialized views” (analise meu notebook e sugira quais consultas se beneficiariam de materialized views). O sistema então recomenda otimizações baseadas nos padrões de suas consultas, cria as views automaticamente e configura cronogramas de atualização.

    Como começar

    Para utilizar essas funcionalidades, abra um notebook em seu projeto SageMaker Unified Studio e acesse o painel de chat do Data Agent. Os recursos estão disponíveis em todas as regiões AWS onde o SageMaker Unified Studio é suportado.

    Para aprofundar os detalhes técnicos, consulte a documentação do SageMaker Data Agent no SageMaker Unified Studio User Guide.

    Fonte

    Amazon SageMaker Data Agent introduces charting capabilities and support for materialized views (https://aws.amazon.com/about-aws/whats-new/2026/03/amazon-sgmkr-dataagent-chart-mv/)

  • CloudWatch expande autoativação para logs do CloudFront e 3 tipos adicionais de recursos

    Autoativação expandida no CloudWatch

    A AWS anunciou uma expansão significativa da funcionalidade de autoativação do CloudWatch. O serviço agora oferece suporte automático para ativação de logs de acesso padrão do Amazon CloudFront, relatórios de descoberta de postura de segurança (CSPM) do AWS Security Hub, além de logs e rastreamentos de memória e gateway do Amazon Bedrock AgentCore que são enviados automaticamente para o CloudWatch Logs.

    Essa evolução marca um passo importante na simplificação do gerenciamento de telemetria em ambientes de nuvem. Clientes podem agora estabelecer regras de autoativação que configuram automaticamente a coleta de telemetria tanto para recursos já existentes quanto para novos recursos criados no futuro, garantindo uma cobertura de monitoramento consistente sem necessidade de configurações manuais repetitivas.

    Flexibilidade no escopo das regras

    As regras de autoativação oferem um alto grau de flexibilidade em termos de escopo. É possível configurá-las em três níveis diferentes:

    • No nível da organização como um todo
    • Para contas específicas dentro da organização
    • Para recursos específicos identificados por tags

    Essa estrutura permite que equipes padronizem a coleta de telemetria de forma consistente, adaptando-se às necessidades específicas de cada ambiente. Um exemplo prático dessa flexibilidade: uma equipe central de segurança pode criar uma única regra que automaticamente envia logs de acesso do CloudFront e descobertas do Security Hub para todos os recursos em toda a organização para o CloudWatch Logs.

    Disponibilidade e cobertura

    A capacidade de autoativação do CloudWatch está disponível em todas as regiões comerciais da AWS. É importante observar que a ingestão de logs será cobrada conforme os preços estabelecidos no modelo de preços do CloudWatch.

    Quanto ao escopo das regras por tipo de recurso: logs de acesso do Amazon CloudFront e descobertas do Security Hub CSPM suportam regras de autoativação em nível de organização, enquanto os dados de memória e gateway do Bedrock AgentCore funcionam com regras no nível de conta.

    Próximos passos

    Para aprofundar o conhecimento sobre como configurar e usar as regras de autoativação no CloudWatch, a documentação do Amazon CloudWatch oferece detalhes completos sobre a implementação dessa funcionalidade.

    Fonte

    Amazon CloudWatch expands auto-enablement to Amazon CloudFront logs and 3 additional resource types (https://aws.amazon.com/about-aws/whats-new/2026/04/amazon-cloudwatch-cloudfront-enablement/)

  • Controle quais domínios seus agentes de IA podem acessar

    O desafio de dar acesso à internet para agentes de IA

    Agentes de inteligência artificial que conseguem navegar pela web abrem possibilidades impressionantes — desde automação de pesquisas até coleta de dados em tempo real. Porém, fornecer acesso irrestrito à internet para um agente de IA levanta preocupações legítimas sobre segurança e conformidade regulatória. E se o agente acessar websites não autorizados? E se dados sensíveis forem exfiltrados para domínios externos?

    O Amazon Bedrock AgentCore fornece ferramentas gerenciadas que permitem agentes de IA interagir com a web através do navegador, executar código e ser hospedados em ambiente gerenciado. Quando implantado em uma Nuvem Privada Virtual da AWS (Amazon VPC), você consegue controlar o acesso à rede das ferramentas utilizando o AWS Network Firewall para implementar filtragem baseada em domínios.

    Por que isso importa para empresas

    Requisitos de segurança em setores regulados

    Organizações em indústrias reguladas que implantam agentes de IA têm demandas consistentes e rigorosas em relação ao controle de tráfego de rede — tanto entrada quanto saída. Clientes em setores altamente regulados (como serviços financeiros) exigem explicações detalhadas sobre como o tráfego dos agentes é controlado e auditado. Esses clientes querem garantias de que os endpoints de tempo de execução permaneçam privados e que controles adicionais, como proteção de firewall de aplicações web, estejam disponíveis.

    Requisitos de provedores SaaS multi-tenant

    Empresas de Software como Serviço (SaaS) com múltiplos clientes precisam de controles granulares em nível de DNS, pois suas arquiteturas multi-tenant exigem políticas de rede específicas por cliente. Por exemplo, o Cliente A pode precisar permitir domínios que o Cliente B bloqueia. Requisitos comuns incluem: bloqueio específico de execução (impedir acesso a certos domínios durante launches específicas do navegador), restrições regionais e regras baseadas em categorias (desabilitar sites de jogos ou redes sociais através de conjuntos de regras pré-configurados).

    Mitigação de vulnerabilidades e conformidade

    Equipes de segurança identificaram que agentes de IA podem ser enganados para navegar para sites intencionais através de ataques de injeção de prompts. Listas de permissão de URLs customizadas reduzem a superfície de ataque ao restringir o navegador apenas aos domínios aprovados, independentemente do que o agente for instruído a fazer. Filtragem de egresso baseada em domínios fornece o logging e visibilidade de controle de acesso que equipes de segurança frequentemente precisam para seus processos de monitoramento.

    Arquitetura da solução

    A solução implanta o AgentCore Browser em uma subnet privada sem acesso direto à internet. O tráfego de saída é roteado através do AWS Network Firewall, que inspeciona os headers de Indicação de Nome de Servidor TLS (SNI) para determinar o domínio de destino e aplicar regras de filtragem. Você também consegue monitorar as ações do Network Firewall através da integração nativa com métricas do Amazon CloudWatch.

    Implantação do AgentCore com AWS Network Firewall e filtragem de egresso baseada em domínios — Fonte: Aws

    Componentes da arquitetura

    A arquitetura inclui:

    • Subnet privada: hospeda instâncias do AgentCore Browser sem endereços IP públicos
    • Subnet pública: contém o NAT Gateway para conectividade de saída
    • Subnet de firewall: hospeda o endpoint do Network Firewall
    • Tabelas de rota: quatro tabelas que controlam o fluxo de tráfego através do firewall para requisições de saída e tráfego de retorno

    Fluxo de tráfego

    O fluxo funciona em etapas sequenciais:

    • O AgentCore Runtime executa o agente e invoca a ferramenta AgentCore Browser
    • AgentCore Browser inicia uma requisição HTTPS da subnet privada
    • A tabela de rotas da subnet privada direciona tráfego ao NAT Gateway na subnet pública
    • O NAT Gateway traduz o endereço IP privado e encaminha a requisição ao endpoint do Network Firewall
    • Network Firewall inspeciona o header SNI do TLS para identificar o domínio de destino
    • Se o domínio corresponder a uma regra de lista de permissão, o firewall encaminha tráfego ao Internet Gateway
    • O Internet Gateway roteia tráfego aprovado para o destino externo
    • Tráfego de retorno segue o caminho simétrico de volta através do firewall para o agente

    Esta arquitetura garante que tráfego de navegador seja inspecionado e filtrado, independentemente do destino.

    Implementação prática

    Pré-requisitos

    Antes de começar, certifique-se de ter:

    • Uma conta AWS com permissões para criar recursos de VPC, Network Firewall e funções IAM
    • AWS Command Line Interface (AWS CLI) versão 2.x configurada com credenciais apropriadas
    • Acesso ao Amazon Bedrock AgentCore
    • Familiaridade básica com conceitos de redes VPC

    Passo 1: Deploy de recursos

    Para a configuração completa e passo a passo do VPC e Network Firewall, consulte a documentação de configuração VPC do Amazon Bedrock AgentCore. Esta seção destaca configurações específicas para o AgentCore Browser.

    Inicie o deploy do template CloudFormation:

    Você pode manter os valores padrão do stack. No entanto, certifique-se de adicionar um nome de stack (por exemplo, "agentcore-egress") ao campo "Stack name", escolha uma Zona de Disponibilidade no menu "Availability Zone" e inclua um nome de bucket existente válido no parâmetro "BucketConfigForOutput". Aguarde a conclusão da criação do stack, que normalmente leva 10 minutos. Continue com os próximos passos após o status do stack mudar para CREATE_COMPLETE.

    Passo 2: Revisar a função de execução IAM

    AgentCore Browser requer uma função IAM com política de confiança para o serviço bedrock-agentcore.amazonaws.com:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Service": "bedrock-agentcore.amazonaws.com"
          },
          "Action": "sts:AssumeRole"
        }
      ]
    }

    Passo 3: Configurar lista de permissão do Network Firewall

    Crie um grupo de regras stateful com seus domínios aprovados. Note o ponto à frente (.) para corresponder a subdomínios:

    cat > allowlist-rules.json << 'EOF'
    {
      "RulesSource": {
        "RulesSourceList": {
          "Targets": [
            ".wikipedia.org",
            ".stackoverflow.com",
            ".docs.aws.amazon.com",
            ".amazonaws.com",
            ".pypi.org",
            ".pythonhosted.org"
          ],
          "TargetTypes": ["HTTP_HOST", "TLS_SNI"],
          "GeneratedRulesType": "ALLOWLIST"
        }
      },
      "StatefulRuleOptions": {
        "RuleOrder": "STRICT_ORDER"
      }
    }
    EOF
    aws network-firewall create-rule-group \
      --rule-group-name browser-allowed-domains \
      --type STATEFUL \
      --capacity 100 \
      --rule-group file://allowlist-rules.json \
      --region us-east-2

    Importante: inclua .amazonaws.com na sua lista de permissão se o navegador precisar acessar serviços AWS ou use VPC Endpoints como alternativa.

    Passo 4: Configurar política de firewall

    A política de firewall deve usar aws:drop_established como ação padrão. Isso permite que handshakes TCP sejam concluídos (necessário para inspeção SNI do TLS) enquanto bloqueia conexões para domínios não permitidos:

    cat > firewall-policy.json << 'EOF'
    {
      "StatelessDefaultActions": ["aws:forward_to_sfe"],
      "StatelessFragmentDefaultActions": ["aws:forward_to_sfe"],
      "StatefulRuleGroupReferences": [
        {
          "ResourceArn": "arn:aws:network-firewall:us-east-2:ACCOUNT_ID:stateful-rulegroup/browser-allowed-domains",
          "Priority": 1
        }
      ],
      "StatefulEngineOptions": {
        "RuleOrder": "STRICT_ORDER"
      },
      "StatefulDefaultActions": ["aws:drop_established"]
    }
    EOF

    Passo 5: Criar grupo de segurança

    Crie um grupo de segurança que permita tráfego de saída. O Network Firewall cuida da filtragem de domínios:

    # Create security group
    aws ec2 create-security-group \
      --group-name agentcore-egress-sg \
      --description "AgentCore tools - egress only, filtered by Network Firewall" \
      --vpc-id vpc-XXXXXXXXX \
      --region us-east-2
    
    # Allow all outbound traffic (Network Firewall handles filtering)
    aws ec2 authorize-security-group-egress \
      --group-id sg-XXXXXXXXX \
      --protocol -1 \
      --port -1 \
      --cidr 0.0.0.0/0 \
      --region us-east-2
    
    # Remove default inbound rules if present (AgentCore tools don't need inbound)
    aws ec2 revoke-security-group-ingress \
      --group-id sg-XXXXXXXXX \
      --protocol -1 \
      --port -1 \
      --cidr 0.0.0.0/0 \
      --region us-east-2

    Passo 6: Criar AgentCore Browser

    Crie o navegador com configuração VPC apontando para sua subnet privada:

    aws bedrock-agentcore-control create-browser \
      --name my_secure_browser \
      --execution-role-arn arn:aws:iam::ACCOUNT_ID:role/AgentCoreBrowserExecutionRole \
      --network-configuration '{
        "networkMode": "VPC",
        "vpcConfig": {
          "securityGroups": ["sg-XXXXXXXXX"],
          "subnets": ["subnet-XXXXXXXXX"]
        }
      }' \
      --region us-east-2

    Passo 7: Testar a configuração

    Inicie uma sessão de navegador e verifique que as regras de firewall funcionam corretamente:

    # Start browser session
    aws bedrock-agentcore start-browser-session \
      --browser-identifier my_secure_browser-ABC123xyz \
      --region us-east-2

    Use a URL WebSocket retornada com uma ferramenta de automação de navegador como Playwright para testar domínios permitidos e bloqueados.

    Monitoramento via CloudWatch

    Verifique os logs de firewall no CloudWatch para tentativas de conexão bloqueadas:

    # View recent alert logs (blocked connections)
    aws logs filter-log-events \
      --log-group-name "/aws/network-firewall/agentcore-egress/alerts" \
      --filter-pattern '{ $.event.alert.action = "blocked" }' \
      --region us-east-2 \
      --start-time $(($(date +%s) - 300))000

    Boas práticas e considerações

    Práticas recomendadas

    • Use avaliação STRICT_ORDER: facilita processamento previsível de regras ao combinar listas de permissão e bloqueio
    • Inclua .amazonaws.com para acesso a serviços AWS: ou use VPC Endpoints para evitar rotear chamadas de API através da internet
    • Configure a tabela de rotas de entrada do IGW: crítico para roteamento simétrico. Sem isso, tráfego de retorno bypassa o firewall
    • Habilite logs ALERT e FLOW: logs ALERT capturam conexões bloqueadas; logs FLOW fornecem metadados de conexão
    • Aguarde sincronização do firewall: mudanças de regras levam alguns minutos para se propagar
    • Configure HOME_NET para arquiteturas multi-VPC: por padrão, inspeção de domínio do Network Firewall filtra apenas tráfego originário da faixa CIDR da VPC de deployment

    Limitações e considerações de custo

    Inspeção de conteúdo requer inspeção TLS: por padrão, filtragem de domínio opera em metadados TLS não criptografados (headers SNI) e não consegue inspecionar corpos de requisição ou resposta criptografados.

    Risco de bypass de header SNI/Host: o Network Firewall usa headers SNI do TLS e headers Host HTTP — não endereços IP — para determinar domínios de destino. Se esses headers forem manipulados, tráfego pode contornar filtragem de domínio. Para deployments de alta segurança, combine regras de domínio com regras baseadas em IP para destinos bloqueados críticos, ou adicione filtragem DNS como camada adicional.

    Escopo de HOME_NET em deployments multi-VPC: por padrão, inspeção de domínio do Network Firewall aplica-se apenas ao tráfego originário da faixa CIDR da VPC de deployment. Se você usar firewall centralizado com AWS Transit Gateway (múltiplas VPCs roteando através de um firewall compartilhado), você deve configurar a variável HOME_NET em seu grupo de regras para incluir faixas CIDR de origem.

    Custos variam conforme seu uso. Consulte os preços de NAT Gateway e Network Firewall para taxas atuais.

    Limpeza de recursos

    Delete recursos nesta ordem para evitar cobranças contínuas:

    • Delete o AgentCore Browser
    • Delete o Network Firewall (desabilite configurações de proteção primeiro)
    • Delete o NAT Gateway
    • Libere o endereço IP elástico
    • Delete as subnets e tabelas de rota
    • Desanexe e delete o Internet Gateway
    • Delete a VPC

    Nota: AgentCore Browser e Code Interpreter criam interfaces de rede elásticas em sua VPC. Após deletar esses recursos, aguarde alguns minutos para a interface de rede ser liberada antes de deletar o grupo de segurança, subnet ou VPC.

    Próximos passos

    Filtragem de domínio através de inspeção SNI é uma camada de segurança de egresso. Dependendo de seus requisitos, considere essas mitigações adicionais:

    • Route 53 DNS Firewall: ajuda a bloquear ou permitir consultas DNS por domínio e previne tunneling e exfiltração de DNS. Útil quando você precisa de filtragem em nível DNS ou proteção contra exfiltração de dados baseada em DNS.
    • Inspeção TLS + Suricata DLP: descriptografa HTTPS, inspeciona corpos de requisição/resposta com regras Suricata, ajuda a bloquear padrões de dados sensíveis (PII, credenciais). Necessário quando você precisa de prevenção de perda de dados (DLP) para tráfego gerado por agentes.
    • Arquitetura de inspeção centralizada: roteia tráfego de múltiplas VPCs através de uma VPC de inspeção compartilhada com Network Firewall. Útil quando você tem múltiplos deployments do AgentCore e quer enforcement de política centralizado.

    Quando usar inspeção TLS, configure certificados customizados em seus recursos do AgentCore para confiar na CA de re-assinatura do Network Firewall.

    Conclusão

    Ao combinar ferramentas do Amazon Bedrock AgentCore com AWS Network Firewall, você consegue dar aos agentes de IA acesso controlado à web mantendo segurança e alinhamento de conformidade. A abordagem de filtragem baseada em domínios permite definir precisamente quais websites agentes podem acessar, bloquear destinos indesejados e fazer logging de tentativas de conexão para fins de auditoria.

    Esta arquitetura resolve as preocupações de segurança levantadas por clientes corporativos: conformidade em setores regulados fornece isolamento de rede e logging de auditoria necessários para revisões de segurança em nível CISO, controle multi-tenant habilita políticas de domínio por cliente ou por execução para provedores SaaS, defesa contra injeção de prompts restringe navegação de agentes a domínios aprovados reduzindo superfície de ataque, e evidência de auditoria gera logs no CloudWatch que suportam requisitos de conformidade.

    Para empresas implantando agentes de IA que precisam de acesso à internet para pesquisa, coleta de dados ou integrações de API, este padrão fornece uma abordagem production-ready para manter controle rigoroso sobre onde esse acesso leva. Em vez de manter proxies squid customizados ou infraestrutura de rede complexa, você consegue usar serviços gerenciados da AWS para implementar filtragem de egresso em nível corporativo em horas, não semanas.

    Para mais informações sobre AgentCore Browser, consulte a documentação do AgentCore Browser.

    Recursos relacionados

    Fonte

    Control which domains your AI agents can access (https://aws.amazon.com/blogs/machine-learning/control-which-domains-your-ai-agents-can-access/)

  • Persistência de Estado de Sessão com Configuração de Filesystem e Execução de Comandos Shell

    A Evolução dos Agentes de IA e o Desafio da Efêmera

    Os agentes de inteligência artificial ultrapassaram a simples conversa e evoluíram significativamente. Hoje, eles conseguem escrever código, gerenciar estado persistente em filesystem, executar comandos de sistema operacional e administrar estados ao longo de toda a estrutura de diretórios. À medida que assistentes de codificação baseados em agentes e fluxos de desenvolvimento se tornaram mais maduros, o filesystem emergiu como a memória de trabalho principal desses agentes, estendendo suas capacidades muito além da janela de contexto disponível em modelos de linguagem grandes.

    Porém, essa mudança de paradigma introduz dois desafios que toda equipe desenvolvendo agentes em ambiente de produção enfrenta inevitavelmente.

    O Primeiro Desafio: Filesystems Efêmeros

    O filesystem é temporário por natureza. Quando a sessão do agente termina, tudo que foi criado desaparece: dependências instaladas, código gerado, histórico local do git. Nada persiste.

    O Segundo Desafio: Operações Determinísticas sem Intermediários

    Quando seu fluxo de trabalho precisa executar operações determinísticas como npm test ou git push, você fica forçado a rotear essas operações através do modelo de linguagem grande (LLM) ou construir ferramentas customizadas fora do runtime. Nenhuma dessas opções é ideal.

    Duas Soluções Integradas do Amazon Bedrock AgentCore Runtime

    A AWS respondeu a esses desafios com duas capacidades inovadoras no Amazon Bedrock AgentCore Runtime: armazenamento de sessão gerenciado para persistir estado de filesystem do agente (em preview público) e execução de comando (InvokeAgentRuntimeCommand) para rodar comandos shell diretamente dentro da máquina virtual de rede (microVM) associada a cada sessão ativa do agente.

    Cada uma delas é útil isoladamente. Juntas, elas desbloqueiam workflows que não eram possíveis anteriormente.

    Compreendendo a Arquitetura do AgentCore Runtime

    Isolamento e Segurança da Sessão

    O AgentCore Runtime executa cada sessão em uma máquina virtual de rede dedicada com recursos isolados, incluindo seu próprio kernel, memória e filesystem. Essa arquitetura proporciona limites de segurança robustos, mas também implica que cada sessão começa com um filesystem limpo. Quando a microVM é finalizada — seja através de uma parada explícita ou timeout de inatividade — tudo que o agente criou desaparece.

    Na prática, isso significa que seu agente de codificação pode gastar vinte minutos estruturando um projeto inteiro: configurando diretórios, instalando dependências, gerando código boilerplate, configurando ferramentas de build. Você tira um intervalo para almoçar e, quando retorna invocando a mesma sessão, o agente começa do zero. Cada pacote reinstalado, cada arquivo regeneado. Vinte minutos de computação desperdiçados antes que o agente possa fazer trabalho útil novamente.

    As Soluções Anteriores e Suas Limitações

    Essa limitação poderia ser contornada escrevendo lógica de checkpoint para fazer upload de arquivos para Amazon Simple Storage Service (S3) antes de parar a sessão e baixá-los ao retomar, ou mantendo sessões vivas para evitar perda de estado. Essas soluções funcionam, mas não resolvem as limitações no nível de filesystem e adicionam complexidade ao código do agente.

    A mesma fricção existe para operações determinísticas. Quando o agente termina uma correção e você precisa rodar testes, rotear o comando através do LLM como uma chamada de ferramenta adiciona custo de tokens, latência e não-determinismo a uma operação previsível. A alternativa é construir lógica de orquestração separada fora do runtime, o que exige conectar-se ao filesystem do agente, adicionando ainda mais complexidade.

    Armazenamento de Sessão Gerenciado: Estado que Persiste

    O Conceito de Armazenamento Persistente

    A AWS introduziu armazenamento de sessão gerenciado para resolver o desafio dos filesystems efêmeros. Ele oferece ao agente um diretório persistente que sobrevive aos ciclos de parada e retomada. A persistência é integrada no runtime e configurada na criação do agente — tudo que é escrito naquele diretório persiste mesmo quando o ambiente de computação é substituído.

    Configurando Armazenamento Persistente

    Para configurar armazenamento persistente, você adiciona sessionStorage à configuração de filesystem do runtime do agente. Usando a interface de linha de comando:

    aws bedrock-agentcore create-agent-runtime \
      --agent-runtime-name "coding-agent" \
      --role-arn "arn:aws:iam::111122223333:role/AgentExecutionRole" \
      --agent-runtime-artifact '{"containerConfiguration": { "containerUri": "123456789012.dkr.ecr.us-west-2.amazonaws.com/my-agent:latest" }}' \
      --filesystem-configurations '[{ "sessionStorage": { "mountPath": "/mnt/workspace" } }]'

    Ou utilizando o AWS SDK para Python (Boto3):

    import boto3
    
    # Use the control plane client for creating and managing runtimes
    control_client = boto3.client('bedrock-agentcore-control', region_name='us-west-2')
    response = control_client.create_agent_runtime(
        agentRuntimeName='coding-agent',
        agentRuntimeArtifact={
            'containerConfiguration': {
                'containerUri': '123456789012.dkr.ecr.us-west-2.amazonaws.com/my-agent:latest'
            }
        },
        roleArn='arn:aws:iam::111122223333:role/AgentExecutionRole',
        protocolConfiguration={
            'serverProtocol': 'HTTP'
        },
        networkConfiguration={
            'networkMode': 'PUBLIC'
        },
        filesystemConfigurations=[{
            'sessionStorage': {
                'mountPath': '/mnt/workspace'
            }
        }]
    )

    Detalhes Importantes sobre Clientes Boto3

    Uma observação técnica importante: o AgentCore utiliza dois clientes Boto3 distintos. O cliente do plano de controle (bedrock-agentcore-control) gerencia operações de ciclo de vida do runtime como CreateAgentRuntime, GetAgentRuntime e DeleteAgentRuntime. O cliente do plano de dados (bedrock-agentcore) lida com operações de sessão como InvokeAgentRuntime e InvokeAgentRuntimeCommand.

    O caminho de montagem deve começar com /mnt seguido por um nome de pasta (por exemplo, /mnt/workspace ou /mnt/data). Após configurado, qualquer arquivo que o agente escreva nesse caminho é automaticamente persistido em armazenamento gerenciado.

    A Experiência de Parada e Retomada

    Você invoca seu agente e solicita que configure um projeto:

    aws bedrock-agentcore invoke-agent-runtime \
      --agent-runtime-arn "arn:...:agent-runtime/coding-agent" \
      --runtime-session-id "session-001" \
      --payload '{"prompt": "Set up the project and install dependencies in /mnt/workspace"}'

    O agente baixa o código, instala os pacotes e gera as configurações na microVM dedicada a essa sessão. Depois, você para a sessão ou o timeout de inatividade dispara, e a microVM finaliza. Horas depois, você retorna e invoca com o mesmo ID de sessão:

    aws bedrock-agentcore invoke-agent-runtime \
      --agent-runtime-arn "arn:...:agent-runtime/coding-agent" \
      --runtime-session-id "session-001" \
      --payload '{"prompt": "Run the tests and fix any failures"}'

    Um novo ambiente de computação (microVM) é provisionado e monta o mesmo armazenamento. O agente vê /mnt/workspace exatamente como deixou: arquivos de código, node_modules, artefatos de build e histórico .git intactos. O agente retoma seu trabalho sem necessidade de reinstalar ou regenerar. Do ponto de vista do agente, nada extraordinário está acontecendo — ele apenas lê e escreve em um diretório como faria normalmente. Seu código de agente não precisa mudar: sem APIs especiais, sem lógica de salvar/restaurar, sem serialização. Escreva um arquivo em /mnt/workspace, pare a sessão, retome, e o arquivo continua lá.

    Controle da Retenção de Dados

    Por padrão, os dados de armazenamento de sessão são retidos por 14 dias de inatividade. Se a sessão não for retomada dentro dessa janela, os dados são limpos automaticamente. Quando o endpoint do agente é atualizado para uma versão diferente e o mesmo ID de sessão é invocado, os dados da sessão são atualizados, oferecendo um contexto limpo para a nova versão.

    Um Fluxo de Trabalho de Múltiplos Dias na Prática

    Dia 1: Análise e Preparação

    Você invoca seu agente de codificação e solicita que baixe uma base de código, inspecione os arquivos e configure o ambiente de desenvolvimento:

    aws bedrock-agentcore invoke-agent-runtime \
      --agent-runtime-arn "arn:...:agent-runtime/coding-agent" \
      --runtime-session-id "fefc1779-e5e7-49cf-a2c4-abaf478680c4" \
      --payload '{"prompt": "Download the code from s3://amzn-s3-demo-bucket/fastapi-demo-main.zip and list all files"}'

    O agente baixa o repositório para /mnt/workspace, extrai o conteúdo e relata:

    Arquivos no projeto fastapi-demo-main:

    • Dockerfile
    • README.md
    • main.py
    • requirements.txt

    Você fecha seu laptop e vai para casa.

    Dia 2: Implementação e Iteração

    Você invoca com o mesmo ID de sessão:

    aws bedrock-agentcore invoke-agent-runtime \
      --agent-runtime-arn "arn:...:agent-runtime/coding-agent" \
      --runtime-session-id "fefc1779-e5e7-49cf-a2c4-abaf478680c4" \
      --payload '{"prompt": "Add a new function called hello_world to main.py"}'

    O agente enxerga o projeto exatamente como deixou. Ele modifica o main.py diretamente. Sem re-download, sem re-extração. Quando você pede ao agente para listar os arquivos, tudo continua lá, incluindo o main.py modificado com a nova função hello_world. A microVM de ontem já foi finalizada, mas o trabalho persiste.

    Execução de Comando Shell: Operações Determinísticas Diretas

    O Problema das Operações Determinísticas

    Agora que seu agente escreveu novo código, você precisa verificar que funciona. É onde a segunda capacidade entra em cena: InvokeAgentRuntimeCommand permite executar comandos shell diretamente dentro de uma sessão ativa do AgentCore Runtime e transmitir a saída de volta via HTTP/2.

    Quando Usar Cada Abordagem

    O conceito-chave é que agentes e comandos shell são bons em coisas diferentes. Use execução de comando para operações com comando conhecido (npm test, git push), operações que exigem execução determinística, fluxos que precisam de saída em tempo real de processos longos, validação de gate de fluxo de trabalho ou bootstrap de ambiente. Use o agente para operações que exigem raciocínio (“analise esse código e corrija o bug”), quando você quer que o LLM decida o que fazer, para trabalho criativo ou analítico.

    Quando seu agente termina de escrever código e você precisa rodar testes, não deveria precisar do LLM para isso. npm test é npm test. O comando é conhecido, o comportamento deve ser determinístico, e você quer a saída bruta, não a interpretação do LLM.

    Executando um Comando

    Execute um comando utilizando o AWS SDK para Python (Boto3):

    import boto3
    import sys
    
    client = boto3.client('bedrock-agentcore', region_name='us-west-2')
    response = client.invoke_agent_runtime_command(
        agentRuntimeArn='arn:aws:bedrock-agentcore:us-west-2:111122223333:runtime/my-agent',
        runtimeSessionId='session-id-at-least-33-characters-long',
        body={
            'command': '/bin/bash -c "npm test"',
            'timeout': 60
        }
    )
    
    for event in response['stream']:
        if 'chunk' in event:
            chunk = event['chunk']
            if 'contentStart' in chunk:
                print("Command execution started")
            if 'contentDelta' in chunk:
                delta = chunk['contentDelta']
                if delta.get('stdout'):
                    print(delta['stdout'], end='')
                if delta.get('stderr'):
                    print(delta['stderr'], end='', file=sys.stderr)
            if 'contentStop' in chunk:
                stop = chunk['contentStop']
                print(f"\nExit code: {stop.get('exitCode')}, Status: {stop.get('status')}")

    Tipos de Eventos da Resposta

    A resposta transmite três tipos de evento em tempo real: contentStart (primeiro chunk, confirma que o comando começou), contentDelta (durante execução, contém saída stdout e/ou stderr) e contentStop (último chunk, contém exitCode e status — COMPLETED ou TIMED_OUT).

    Como a saída é transmitida conforme é produzida, você pode detectar uma falha nos primeiros segundos e reagir imediatamente, em vez de esperar pela execução completa.

    Detalhes Críticos: Mesmo Container, Mesmo Filesystem

    Um detalhe crítico: comandos executam no mesmo container, filesystem e ambiente que seu agente, não em um sidecar ou processo separado comunicando via socket. Um arquivo que o agente escreveu em /mnt/workspace/fix.py é imediatamente visível para um comando executando cat /mnt/workspace/fix.py. Não há etapa de sincronização, transferência de arquivo ou volume compartilhado a configurar.

    O AgentCore Runtime microVM não inclui ferramentas de desenvolvimento por padrão. Portanto, qualquer ferramenta que seus comandos dependem — git, npm ou runtimes de linguagem — deve ser adicionado na imagem de container ou instalado dinamicamente em tempo de execução.

    Características de Design que Moldam o Uso

    Os comandos seguem um design de execução única: cada comando dispara um novo processo bash, executa até conclusão (ou timeout) e retorna. Sem sessão shell persistente entre comandos. Isso alinha-se com como frameworks de agentes usam execução de comando: elaborar um comando, executá-lo, ler saída e decidir o próximo passo.

    A execução é não-bloqueante: execução de comando não bloqueia invocações de agente. Você pode invocar o agente e rodar comandos concorrentemente na mesma sessão.

    Cada comando é stateless: cada comando inicia limpo, sem histórico de shell e variáveis de ambiente de comandos anteriores não persistem. Se você precisa de estado, codifique na comando: cd /workspace && export NODE_ENV=test && npm test.

    Casos de Uso Práticos

    Equipes estão construindo com essas capacidades: automação de testes — após o agente escrever código, rodar npm test ou pytest como comando, transmitir saída e realimentar falhas específicas ao agente para iteração; fluxos git — branching, commit e push são determinísticos, rodar como comandos mantém lógica de controle de versão fora do LLM; bootstrap de ambiente — clonar repos, instalar pacotes, configurar ferramentas de build antes do agente começar, muito mais rápido e confiável como comandos diretos; pipelines de build — qualquer coisa com comando conhecido que deve rodar exatamente como especificado (cargo build --release, mvn package, go build); gates de validação — rodar linters, verificadores de tipo, scanners de segurança como gate após o agente escrever código mas antes de fazer commit; debug — inspecionar ambiente de runtime, verificar pacotes instalados, uso de disco, processos rodando. Tudo útil para entender falhas de agente.

    Melhor Juntas: O Filesystem como Contexto Compartilhado

    A Sinergia das Duas Capacidades

    Armazenamento de sessão gerenciado resolve o desafio de filesystems efêmeros. Execução de comando resolve o desafio de operações determinísticas. Cada uma é valiosa isoladamente, mas são mais poderosas juntas porque compartilham o mesmo filesystem que une todo o fluxo de trabalho.

    Quando seu runtime de agente tem armazenamento de sessão gerenciado configurado em /mnt/workspace, tudo opera no mesmo diretório persistente: InvokeAgentRuntime escreve código, gera artefatos e gerencia arquivos em /mnt/workspace. InvokeAgentRuntimeCommand executa testes, operações git e builds lendo e escrevendo no mesmo /mnt/workspace. Você para a sessão, computação (microVM) desliga, /mnt/workspace persiste. Retorna no dia seguinte, nova computação monta o mesmo armazenamento. Tanto agente quanto execute command veem os mesmos arquivos. O filesystem torna-se o contexto compartilhado que conecta raciocínio do agente, operações determinísticas e tempo.

    Exemplo Integrado de Uso

    Aqui está como parece em código:

    import boto3
    import json
    
    client = boto3.client('bedrock-agentcore', region_name='us-west-2')
    AGENT_ARN = 'arn:aws:bedrock-agentcore:us-west-2:111122223333:runtime/my-coding-agent'
    SESSION_ID = 'fefc1779-e5e7-49cf-a2c4-abaf478680c4'
    
    def run_command(command, timeout=60):
        """Execute a shell command and return the exit code."""
        response = client.invoke_agent_runtime_command(
            agentRuntimeArn=AGENT_ARN,
            runtimeSessionId=SESSION_ID,
            contentType='application/json',
            accept='application/vnd.amazon.eventstream',
            body={'command': command, 'timeout': timeout}
        )
        for event in response.get('stream', []):
            if 'chunk' in event and 'contentStop' in event['chunk']:
                return event['chunk']['contentStop'].get('exitCode')
        return None
    
    # Step 1: The agent analyzes the issue and writes a fix
    # (Reasoning task → use InvokeAgentRuntime)
    response = client.invoke_agent_runtime(
        agentRuntimeArn=AGENT_ARN,
        runtimeSessionId=SESSION_ID,
        payload=json.dumps({
            "prompt": "Read JIRA-1234 and implement the fix in /mnt/workspace"
        }).encode()
    )
    
    # Process agent response...
    
    # Step 2: Run the test suite
    # (Deterministic operation → use InvokeAgentRuntimeCommand)
    exit_code = run_command('/bin/bash -c "cd /mnt/workspace && npm test"', timeout=300)
    
    # Step 3: If tests pass, commit and push
    # (Deterministic operation → use InvokeAgentRuntimeCommand)
    if exit_code == 0:
        run_command('/bin/bash -c "cd /mnt/workspace && git checkout -b fix/JIRA-1234"')
        run_command('/bin/bash -c "cd /mnt/workspace && git add -A && git commit -m \'Fix JIRA-1234\'"')
        run_command('/bin/bash -c "cd /mnt/workspace && git push origin fix/JIRA-1234"')

    O agente escreve o código enquanto a plataforma executa os comandos. Cada um faz o que foi desenhado para fazer. Como /mnt/workspace é respaldado por armazenamento de sessão gerenciado, você pode parar essa sessão, retornar no dia seguinte, e todo o workspace continua lá pronto para o agente continuar iterando. Esse é o padrão: o agente raciocina, execute command atua, e o filesystem persistente lembra.

    Primeiros Passos

    Ambas as capacidades já estão disponíveis. Aqui está como começar a usá-las:

    Armazenamento de sessão gerenciado (preview público) — Adicione filesystemConfigurations com sessionStorage ao chamar CreateAgentRuntime. Especifique um caminho de montagem começando com /mnt. Tudo que seu agente escrever naquele caminho persiste entre ciclos de parada/retomada. Dados máximos permitidos são 1 GB por sessão.

    Execução de comando — Chame InvokeAgentRuntimeCommand com uma string de comando e timeout em qualquer sessão ativa. O comando executa no mesmo container que seu agente, com acesso ao mesmo filesystem.

    Para começar com tutoriais e código de exemplo:

    Conclusão

    Tudo começou com dois desafios: agentes que perdem seu trabalho quando sessões param e operações determinísticas que precisam ser roteadas através do LLM ou construídas fora do runtime. Armazenamento de sessão gerenciado e execução de comando resolvem ambos esses desafios. O filesystem compartilhado entre eles cria um loop de desenvolvimento onde o agente raciocina, comandos executam e o trabalho persiste entre sessões. As três capacidades formam um loop que não quebra quando você fecha seu laptop. Teste as novas capacidades do Amazon Bedrock AgentCore e compartilhe o que você constrói.

    Fonte

    Persist session state with filesystem configuration and execute shell commands (https://aws.amazon.com/blogs/machine-learning/persist-session-state-with-filesystem-configuration-and-execute-shell-commands/)

  • Simulando Usuários Realistas para Avaliar Agentes de IA em Múltiplas Rodadas com Strands Evals

    Por que avaliar agentes em múltiplas rodadas é fundamentalmente diferente

    A avaliação de interações single-turn (uma única rodada) segue um padrão bem estabelecido: você fornece uma entrada, coleta a saída e julga o resultado. Estruturas como o Strands Evaluation SDK sistematizam esse processo através de avaliadores que medem helpfulness (utilidade), faithfulness (fidelidade) e tool usage (uso de ferramentas). Publicações anteriores cobrem como construir suites de avaliação abrangentes para agentes de IA usando essas capacidades.

    No entanto, as conversas em produção raramente param em uma única rodada. Usuários reais se envolvem em trocas que se desenrolam ao longo de múltiplas rodadas. Eles fazem perguntas de acompanhamento quando as respostas são incompletas, mudam de direção quando novas informações surgem e expressam frustração quando suas necessidades não são atendidas. Um assistente de viagens que funciona bem com “Compre um voo para Paris” isoladamente pode sofrer quando o mesmo usuário pergunta depois: “Na verdade, podemos olhar trens?” ou “E quanto a hotéis perto da Torre Eiffel?”

    Imagem original — fonte: Aws

    O desafio da escala em avaliações multi-rodada

    Testar esses padrões dinâmicos exige mais do que casos de teste estáticos com entradas e saídas predefinidas. A dificuldade central é a escala: você não pode conduzir manualmente centenas de conversas multi-rodada toda vez que seu agente muda. Além disso, fluxos de conversa roteirizados o prendem a caminhos predeterminados que não refletem como usuários reais se comportam.

    O que equipes de avaliação precisam é de uma forma de gerar usuários realistas e orientados por objetivos programaticamente, permitindo que eles conversem naturalmente com um agente ao longo de múltiplas rodadas. A AWS aborda esse desafio com o ActorSimulator no Strands Evaluation SDK, que oferece simulação estruturada de usuários integrada ao seu pipeline de avaliação.

    O que torna um usuário simulado efetivo

    A avaliação baseada em simulação é bem estabelecida em outras disciplinas de engenharia. Simuladores de voo testam respostas de pilotos a cenários que seriam perigosos ou impossíveis de reproduzir no mundo real. Engines de jogos usam agentes orientados por IA para explorar milhões de caminhos de comportamento de jogador antes do lançamento. O mesmo princípio se aplica a IA conversacional.

    Um usuário simulado útil começa com uma persona consistente. Um que se comporta como especialista técnico em uma rodada e novato confuso na próxima produz dados de avaliação não confiáveis. Consistência significa manter o mesmo estilo de comunicação, nível de expertise e traços de personalidade em cada troca, assim como uma pessoa real faria.

    Igualmente importante é o comportamento orientado por objetivos. Usuários reais chegam a um agente com algo que querem realizar. Eles persistem até alcançar o objetivo, ajustam sua abordagem quando algo não está funcionando e reconhecem quando o objetivo foi atingido. Sem objetivos explícitos, um usuário simulado tende a encerrar conversas muito cedo ou continuar perguntando indefinidamente, nenhum dos quais reflete o uso real.

    O usuário simulado também deve responder adaptativamente ao que o agente diz, não seguir um script predeterminado. Quando o agente faz uma pergunta de esclarecimento, o ator deve respondê-la em caráter. Se a resposta for incompleta, o ator segue em relação ao que foi deixado de fora. Se a conversa se desviar do tópico, o ator a reconecta ao objetivo original. Esses comportamentos adaptativos tornam as conversas simuladas valiosas como dados de avaliação porque exercitam a mesma dinâmica de conversa que seu agente enfrenta em produção.

    Como o ActorSimulator funciona

    O ActorSimulator implementa essas qualidades de simulação através de um sistema que encapsula um Strands Agent configurado para se comportar como uma persona de usuário realista. O processo começa com geração de perfil. Dado um caso de teste contendo uma consulta de entrada e uma descrição de tarefa opcional, o ActorSimulator usa um Modelo de Linguagem Grande (LLM) para criar um perfil de ator completo.

    Um caso de teste com entrada “Preciso de ajuda para reservar um voo para Paris” e descrição de tarefa “Completar reserva de voo dentro do orçamento” pode produzir um viajante consciente do orçamento com experiência iniciante e um estilo de comunicação casual. A geração de perfil dá a cada conversa simulada um caráter distinto e consistente.

    Imagem original — fonte: Aws

    Gerenciamento de conversa e rastreamento de objetivos

    Com o perfil estabelecido, o simulador gerencia a conversa rodada por rodada. Ele mantém o histórico completo da conversa e gera cada resposta em contexto, mantendo o comportamento do usuário simulado alinhado com seu perfil e objetivos ao longo de todo o diálogo.

    Quando seu agente aborda apenas parte do pedido, o usuário simulado naturalmente faz perguntas de acompanhamento sobre as lacunas. Uma pergunta de esclarecimento do agente recebe uma resposta que permanece consistente com a persona. A conversa se sente orgânica porque cada resposta reflete tanto a persona do ator quanto tudo o que foi dito até então.

    O rastreamento de objetivo funciona junto com a conversa. O ActorSimulator inclui uma ferramenta integrada de avaliação de conclusão de objetivo que o usuário simulado pode invocar para avaliar se seu objetivo original foi atendido. Quando o objetivo é satisfeito ou o usuário simulado determina que o agente não pode completar seu pedido, o simulador emite um sinal de parada e a conversa termina. Se o máximo de rodadas for atingido antes do objetivo ser cumprido, a conversa também para. Isso oferece um indicador de que o agente pode não estar resolvendo as necessidades do usuário de forma eficiente.

    Cada resposta do usuário simulado também inclui raciocínio estruturado ao lado do texto da mensagem. Você pode inspecionar por que o usuário simulado escolheu dizer o que disse, se estava seguindo informações faltantes, expressando confusão ou redirecionando a conversa. Essa transparência é valiosa durante o desenvolvimento da avaliação porque você pode ver o raciocínio por trás de cada rodada, facilitando o rastreamento de onde as conversas têm sucesso ou falham.

    Iniciando com o ActorSimulator

    Para começar, você precisará instalar o Strands Evaluation SDK usando:

    pip install strands-agents-evals

    Para instruções passo a passo, você pode consultar a documentação ou nosso post anterior para mais detalhes. Colocar esses conceitos em prática requer código mínimo. Você define um caso de teste com uma consulta de entrada e uma descrição de tarefa que captura o objetivo do usuário. O ActorSimulator cuida da geração de perfil, gerenciamento de conversa e rastreamento de objetivo automaticamente.

    O exemplo a seguir avalia um agente assistente de viagens através de uma conversa simulada multi-rodada:

    from strands import Agent
    from strands_evals import ActorSimulator, Case, Experiment
    
    # Define your test case
    case = Case(
        input="I want to plan a trip to Tokyo with hotel and activities",
        metadata={"task_description": "Complete travel package arranged"}
    )
    
    # Create the agent you want to evaluate
    agent = Agent(
        system_prompt="You are a helpful travel assistant.",
        callback_handler=None
    )
    
    # Create user simulator from test case
    user_sim = ActorSimulator.from_case_for_user_simulator(
        case=case, max_turns=5
    )
    
    # Run the multi-turn conversation
    user_message = case.input
    conversation_history = []
    
    while user_sim.has_next():
        # Agent responds to user
        agent_response = agent(user_message)
        agent_message = str(agent_response)
        conversation_history.append({
            "role": "assistant",
            "content": agent_message
        })
        
        # Simulator generates next user message
        user_result = user_sim.act(agent_message)
        user_message = str(user_result.structured_output.message)
        conversation_history.append({
            "role": "user",
            "content": user_message
        })
    
    print(f"Conversation completed in {len(conversation_history) // 2} turns")

    O loop de conversa continua até que has_next() retorne False, o que acontece quando os objetivos do usuário simulado são atingidos, o usuário simulado determina que o agente não pode completar o pedido, ou o limite máximo de rodadas é atingido. O conversation_history resultante contém a transcrição completa multi-rodada, pronta para avaliação.

    Integração com pipelines de avaliação

    Um loop de conversa standalone é útil para experimentos rápidos, mas a avaliação em produção exige capturar traces e alimentá-los em seu pipeline de avaliador. O próximo exemplo combina o ActorSimulator com coleta de telemetria OpenTelemetry e mapeamento de sessão do Strands Evals. A função de tarefa executa uma conversa simulada e coleta spans de cada rodada, depois os mapeia em uma sessão estruturada para avaliação:

    from opentelemetry.sdk.trace.export import BatchSpanProcessor
    from opentelemetry.sdk.trace.export.in_memory_span_exporter import InMemorySpanExporter
    from strands import Agent
    from strands_evals import ActorSimulator, Case, Experiment
    from strands_evals.evaluators import HelpfulnessEvaluator
    from strands_evals.telemetry import StrandsEvalsTelemetry
    from strands_evals.mappers import StrandsInMemorySessionMapper
    
    # Setup telemetry for capturing agent traces
    telemetry = StrandsEvalsTelemetry()
    memory_exporter = InMemorySpanExporter()
    span_processor = BatchSpanProcessor(memory_exporter)
    telemetry.tracer_provider.add_span_processor(span_processor)
    
    def evaluation_task(case: Case) -> dict:
        # Create simulator
        user_sim = ActorSimulator.from_case_for_user_simulator(
            case=case, max_turns=3
        )
        
        # Create agent
        agent = Agent(
            system_prompt="You are a helpful travel assistant.",
            callback_handler=None
        )
        
        # Accumulate spans across conversation
        all_target_spans = []
        user_message = case.input
        
        while user_sim.has_next():
            memory_exporter.clear()
            agent_response = agent(user_message)
            agent_message = str(agent_response)
            
            # Capture telemetry
            turn_spans = list(memory_exporter.get_finished_spans())
            all_target_spans.extend(turn_spans)
            
            # Generate next user message
            user_result = user_sim.act(agent_message)
            user_message = str(user_result.structured_output.message)
        
        # Map to session for evaluation
        mapper = StrandsInMemorySessionMapper()
        session = mapper.map_to_session(
            all_target_spans, session_id="test-session"
        )
        
        return {"output": agent_message, "trajectory": session}
    
    # Create evaluation dataset
    test_cases = [
        Case(
            name="booking-simple",
            input="I need to book a flight to Paris next week",
            metadata={
                "category": "booking",
                "task_description": "Flight booking confirmed"
            }
        )
    ]
    
    evaluator = HelpfulnessEvaluator()
    dataset = Experiment(cases=test_cases, evaluator=evaluator)
    
    # Run evaluations
    report = Experiment.run_evaluations(evaluation_task)
    report.run_display()
    Imagem original — fonte: Aws

    Essa abordagem captura traces completos do comportamento do seu agente ao longo de rodadas de conversa. Os spans incluem chamadas de ferramentas, invocações de modelo e informações de tempo para cada rodada na conversa simulada. Ao mapear esses spans em uma sessão estruturada, você disponibiliza a interação multi-rodada completa para avaliadores como GoalSuccessRateEvaluator e HelpfulnessEvaluator, que podem então avaliar a conversa como um todo, em vez de rodadas isoladas.

    Perfis de ator personalizados para testes direcionados

    A geração de perfil automático funciona bem para a maioria dos cenários de avaliação, mas alguns objetivos de teste exigem personas específicas. Você pode querer verificar se seu agente maneja um usuário especialista impaciente de forma diferente de um iniciante paciente, ou se ele responde apropriadamente a um usuário com necessidades específicas do domínio.

    Para esses casos, o ActorSimulator aceita um perfil de ator totalmente definido que você controla:

    from strands_evals.types.simulation import ActorProfile
    from strands_evals import ActorSimulator
    from strands_evals.simulation.prompt_templates.actor_system_prompt import (
        DEFAULT_USER_SIMULATOR_PROMPT_TEMPLATE
    )
    
    # Define a custom actor profile
    actor_profile = ActorProfile(
        traits={
            "personality": "analytical and detail-oriented",
            "communication_style": "direct and technical",
            "expertise_level": "expert",
            "patience_level": "low"
        },
        context="Experienced business traveler with elite status who values efficiency",
        actor_goal="Book business class flight with specific seat preferences and lounge access"
    )
    
    # Initialize simulator with custom profile
    user_sim = ActorSimulator(
        actor_profile=actor_profile,
        initial_query="I need to book a business class flight to London next Tuesday",
        system_prompt_template=DEFAULT_USER_SIMULATOR_PROMPT_TEMPLATE,
        max_turns=10
    )

    Ao definir traços como nível de paciência, estilo de comunicação e expertise, você pode testar sistematicamente como seu agente funciona em diferentes segmentos de usuários. Um agente que se sai bem com usuários pacientes e não-técnicos, mas mal com especialistas impacientes, revela uma lacuna de qualidade específica que você pode abordar. Executar o mesmo objetivo em múltiplas configurações de persona transforma a simulação de usuário em uma ferramenta para entender as forças e fraquezas do seu agente por tipo de usuário.

    Melhores práticas para avaliação baseada em simulação

    Essas melhores práticas ajudam a aproveitar ao máximo a avaliação baseada em simulação:

    • Defina max_turns com base na complexidade da tarefa, usando 3-5 para tarefas focadas e 8-10 para workflows multi-etapa. Se a maioria das conversas atingir o limite sem completar o objetivo, aumente-o.
    • Escreva descrições de tarefa específicas que o simulador possa avaliar. “Ajude o usuário a reservar um voo” é muito vago para julgar a conclusão de forma confiável, enquanto “reserva de voo confirmada com datas, destino e preço” oferece um alvo concreto.
    • Use perfis gerados automaticamente para ampla cobertura em tipos de usuários e perfis personalizados para reproduzir padrões específicos de seus logs de produção, como um especialista impaciente ou um usuário de primeira vez.
    • Concentre-se em padrões em seu suite de testes em vez de transcritos individuais. Redirecionamentos consistentes do usuário simulado sugerem que o agente está se desviando do tópico, e taxas de conclusão de objetivo em declínio após uma mudança de agente apontam para uma regressão.
    • Comece com um pequeno conjunto de casos de teste cobrindo seus cenários mais comuns e expanda para casos extremos e personas adicionais conforme sua prática de avaliação amadurece.

    Conclusão

    A AWS demonstra como o ActorSimulator no Strands Evals possibilita avaliação sistemática multi-rodada de agentes de IA conversacional através de simulação realista de usuários. Em vez de depender de casos de teste estáticos que capturam apenas trocas únicas, você pode definir objetivos e personas e deixar usuários simulados interagirem naturalmente com seu agente em conversas adaptativas.

    Para começar, explore os exemplos funcionais no repositório de exemplos do Strands Agents. Para equipes que avaliam agentes implantados através do Amazon Bedrock AgentCore, o exemplo de avaliações do AgentCore demonstra como simular interações com agentes implantados. Comece com um punhado de casos de teste representando seus cenários de usuário mais comuns, execute-os através do ActorSimulator e avalie os resultados. Conforme sua prática de avaliação amadurece, expanda para cobrir mais personas, casos extremos e padrões de conversa.

    Fonte

    Simulate realistic users to evaluate multi-turn AI agents in Strands Evals (https://aws.amazon.com/blogs/machine-learning/simulate-realistic-users-to-evaluate-multi-turn-ai-agents-in-strands-evals/)