Author: Make.com Service User

  • Controle de Acesso por Documento nas Knowledge Bases do Amazon Quick com S3

    O problema: IA generativa e documentos sensíveis não combinam sem controle granular

    Muitas organizações estão adotando ferramentas de busca e chat com IA para que equipes encontrem respostas rapidamente em grandes repositórios de documentos. O desafio é que nem todo documento pode ser acessado por qualquer pessoa — contratos jurídicos, relatórios financeiros e dados de RH exigem restrições específicas por usuário ou grupo.

    Permissões grosseiras que controlam o acesso no nível da knowledge base inteira funcionam para cenários simples, mas não são suficientes quando a necessidade é restringir documentos ou pastas específicas a times, indivíduos ou sistemas autorizados. Para resolver isso, a AWS anunciou suporte a Listas de Controle de Acesso (ACL) no nível de documento para knowledge bases do Amazon Quick integradas ao Amazon Simple Storage Service (S3).

    Com esse recurso, quando um usuário faz uma pergunta no chat, o Quick avalia a identidade desse usuário em relação à configuração de ACL e retorna apenas o conteúdo que ele está autorizado a visualizar.

    Como funciona o controle de acesso por ACL no Amazon Quick

    O recurso de ACL do S3 no Amazon Quick permite anexar permissões de acesso diretamente aos documentos. As permissões são definidas com políticas padrão de ALLOW (permitir) e DENY (negar) para usuários individuais ou grupos, e o Quick aplica essas regras no momento da consulta.

    Há dois métodos de configuração de ACL, cada um adequado a diferentes necessidades operacionais:

    • Arquivo de ACL global (por exemplo, acl.json) — Um único arquivo centralizado que define permissões de acesso no nível de pasta (prefixo S3). Indicado para organizações com estruturas de permissão estáveis baseadas em pastas.
    • Arquivos de metadados por documento — Arquivos individuais de metadados ao lado de cada documento, contendo as entradas de controle de acesso específicas. Indicado quando as permissões mudam com frequência, pois apenas os documentos afetados precisam ser reindexados, e não estruturas de pastas inteiras.

    A escolha entre os dois métodos deve considerar a frequência de mudanças de permissão e o nível de granularidade necessário:

    • Arquivo de ACL global: granularidade no nível de pasta, um único arquivo para manter, mas uma mudança de permissão reindexará o prefixo inteiro afetado. Recomendado para estruturas de acesso estáveis.
    • Metadados por documento: granularidade no nível de documento individual, um arquivo de metadados por documento, e apenas os documentos alterados são reindexados. Recomendado para permissões que mudam com frequência.

    Comportamento de negação por padrão

    Um ponto crítico: ao habilitar ACLs em uma knowledge base do S3 no Quick, qualquer documento ou prefixo que não esteja explicitamente listado na configuração de ACL é negado por padrão. Esse comportamento é chamado de “fail closed” — o sistema nega o acesso quando nenhuma regra explícita existe.

    Por exemplo, se o bucket S3 tiver três pastas (/financeiro/, /juridico/ e /politicas/) e o arquivo de ACL conceder acesso apenas a /financeiro/ e /politicas/, a pasta /juridico/ será automaticamente negada para todos, mesmo sem uma regra DENY explícita para ela. Esse modelo de negação implícita funciona da mesma forma que o IAM da AWS.

    Além disso, se um usuário ou grupo tiver tanto uma entrada ALLOW quanto uma DENY para o mesmo documento ou prefixo, a regra DENY sempre tem precedência. Isso permite criar regras ALLOW amplas para um grupo e aplicar restrições pontuais com DENY para recursos específicos.

    Pré-requisitos para configurar ACLs no Amazon Quick

    Antes de começar, é necessário ter:

    • Uma conta AWS com o Amazon Quick habilitado. Caso ainda não tenha, consulte o guia de primeiros passos com o Amazon Quick.
    • Um bucket do Amazon S3 com os documentos que serão indexados.
    • Usuários provisionados no Quick com endereços de e-mail que correspondam às identidades nos arquivos de ACL. Veja detalhes em gerenciamento de acesso de usuários no Amazon Quick.
    • Acesso de administrador no Quick para configurar atribuições de políticas do IAM (Gerenciamento de Identidade e Acesso) e criação de knowledge bases.
    • Familiaridade com conceitos de IAM e sintaxe básica de JSON.
    • Uma knowledge base de teste ou não-produção para validar a configuração de ACL.

    Atenção: habilitar ACLs é uma operação irreversível. Não é possível desativá-las depois de ativadas. Se precisar remover a funcionalidade de ACL, será necessário criar uma nova knowledge base sem ACLs. Por isso, a AWS recomenda validar a configuração em ambiente de teste antes de aplicar em produção.

    Controlando quem pode criar knowledge bases com buckets S3 restritos

    As ACLs por documento controlam quais documentos os usuários podem acessar dentro de uma knowledge base, mas não controlam quem pode criar knowledge bases. Essa distinção é importante: sem controles adicionais, um usuário do Quick poderia criar uma nova knowledge base sobre o mesmo bucket sem habilitar ACLs, contornando os controles de acesso configurados.

    Para evitar isso, as atribuições de políticas do IAM no Quick permitem restringir quais buckets S3 usuários ou grupos específicos podem usar para criar knowledge bases.

    Passo 1: Criar uma política de acesso ao S3 no IAM

    Crie uma política do IAM no console do IAM especificando quais buckets S3 os usuários atribuídos podem acessar. O exemplo abaixo concede acesso a dois buckets específicos:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": "s3:ListAllMyBuckets",
          "Resource": "arn:aws:s3:::*"
        },
        {
          "Effect": "Allow",
          "Action": [
            "s3:ListBucket",
            "s3:ListBucketVersions",
            "s3:GetBucketLocation"
          ],
          "Resource": [
            "arn:aws:s3:::amzn-s3-demo-bucket1",
            "arn:aws:s3:::amzn-s3-demo-bucket2"
          ]
        },
        {
          "Effect": "Allow",
          "Action": [
            "s3:GetObject",
            "s3:GetObjectVersion"
          ],
          "Resource": [
            "arn:aws:s3:::amzn-s3-demo-bucket1/*",
            "arn:aws:s3:::amzn-s3-demo-bucket2/*"
          ]
        }
      ]
    }

    Substitua amzn-s3-demo-bucket1 e amzn-s3-demo-bucket2 pelos nomes reais dos buckets S3 que devem ser liberados.

    Passo 2: Atribuir a política no Quick

    Após criar a política do IAM, ela deve ser atribuída a usuários ou grupos pelo console de administração do Quick, em Permissões > Atribuições de políticas IAM. Usuários que não tiverem acesso explícito concedido por uma atribuição de política do IAM não poderão usar os buckets restritos para criar knowledge bases — embora ainda possam acessar uma knowledge base compartilhada com eles. Para mais detalhes, consulte a documentação sobre restrição de acesso a buckets S3 com atribuições de políticas IAM.

    Nota: políticas do IAM atribuídas pelo Quick têm precedência sobre políticas de nível de recurso AWS. Confirme que suas políticas do IAM atendem aos requisitos de acesso antes de atribuí-las.

    Planejando a estrutura de controle de acesso

    Antes de criar os arquivos de ACL, é necessário mapear as necessidades de acesso da organização: quais times, funções ou indivíduos precisam acessar quais conjuntos de documentos. Em seguida, escolha o método de ACL (global ou por documento) e alinhe as identidades — os nomes de usuário e grupo nos arquivos de ACL devem corresponder exatamente aos e-mails e nomes de grupo dos usuários no Quick (a correspondência de e-mail é insensível a maiúsculas, mas os nomes de grupo devem ser exatos). A associação de grupos é gerenciada no provedor de identidade (IdP), como o IAM Identity Center, e sincronizada com o Quick.

    Opção 1: Configurar ACL com arquivo global

    O arquivo de ACL global é um único arquivo JSON que mapeia prefixos S3 a entradas de controle de acesso. Ele deve ser carregado na raiz do bucket S3. O arquivo não precisa se chamar acl.json.

    Cada entrada no array JSON especifica um prefixo S3 e suas entradas de controle de acesso associadas. Cada item em aclEntries inclui:

    • Name — O e-mail do usuário ou o nome do grupo. Deve corresponder exatamente à identidade no Quick.
    • TypeUSER ou GROUP.
    • AccessALLOW ou DENY.

    Lembre-se: prefixos não listados no arquivo são negados por padrão. Após criar e carregar o arquivo no bucket, basta configurar a knowledge base no console do Quick apontando para o arquivo de ACL e iniciar uma sincronização. O Quick aplica as regras de ACL durante a indexação e apenas documentos com entradas ALLOW explícitas ficam disponíveis no chat.

    Opção 2: Configurar ACL com arquivos de metadados por documento

    Para controle por documento ou reindexação mais rápida quando as permissões mudam, é possível usar arquivos de metadados individuais. Cada documento no bucket S3 recebe um arquivo .metadata.json correspondente com as entradas de controle de acesso.

    O arquivo de metadados inclui um array AccessControlList. Apenas esse campo é obrigatório para a aplicação das ACLs. Os demais campos (DocumentId, Attributes, Title, ContentType) são opcionais e servem para enriquecimento de metadados:

    {
      "DocumentId": "finance-q3-report",
      "Attributes": {
        "_category": "financial-reports",
        "_created_at": "2025-10-01T00:00:00Z",
        "_source_uri": "s3://amzn-s3-demo-bucket/reports/q3-report.pdf"
      },
      "AccessControlList": [
        {
          "Name": "finance-team",
          "Type": "GROUP",
          "Access": "ALLOW"
        },
        {
          "Name": "contractor@example.com",
          "Type": "USER",
          "Access": "DENY"
        }
      ],
      "Title": "Q3 Financial Report",
      "ContentType": "PDF"
    }

    Para que a knowledge base encontre o arquivo de metadados correto, o sistema constrói o caminho S3 do arquivo de metadados adicionando o sufixo .metadata.json à chave S3 do documento. Por exemplo, se o arquivo for recipe.pdf, o arquivo de metadados esperado será recipe.pdf.metadata.json. Os arquivos de metadados podem ficar em um diretório dedicado (como s3://amzn-s3-demo-bucket/metadata) ou na mesma pasta do documento referenciado.

    Documentos sem arquivo de metadados — ou com arquivo de metadados que não inclua um AccessControlList — são negados por padrão quando as ACLs estão habilitadas.

    Verificando a configuração de ACL

    Após a sincronização da knowledge base, é possível verificar se as ACLs estão funcionando corretamente pelo chat e pelos fluxos do Quick. No chat, basta conectar à knowledge base com ACL habilitada, desabilitar a busca web para isolar os resultados à knowledge base e testar perguntas sobre documentos com e sem permissão de acesso. O Quick não deve retornar conteúdo de documentos não autorizados para o usuário em questão.

    O Amazon Quick também permite construir fluxos automatizados com consciência de ACL — pipelines que respeitam a governança de dados ao gerar resumos executivos, por exemplo, verificando quais documentos o usuário pode acessar antes de processá-los e, quando não há fontes internas acessíveis, realizando uma busca web como alternativa.

    Atualizando as ACLs após a configuração inicial

    O Quick não monitora os arquivos de ACL em tempo real. As permissões atualizadas entram em vigor na próxima sincronização da knowledge base, que ocorre diariamente por padrão. Para mudanças urgentes — como revogação de acesso — é recomendável acionar uma sincronização manual imediatamente após atualizar os arquivos de ACL no S3.

    O escopo de reindexação depende do método escolhido: com o arquivo de ACL global, o prefixo inteiro afetado é reindexado; com metadados por documento, apenas os documentos cujos arquivos de metadados foram alterados são reindexados. Para organizações com mudanças frequentes de permissão, os arquivos de metadados por documento oferecem atualizações de acesso mais rápidas.

    Segurança e auditoria dos arquivos de ACL

    A AWS recomenda restringir as permissões s3:PutObject nos arquivos de ACL e metadados a um conjunto limitado de administradores. Qualquer pessoa que possa modificar esses arquivos pode conceder a si mesma acesso a qualquer documento — portanto, o acesso de escrita aos arquivos de ACL deve ser tratado como uma operação privilegiada.

    Habilitar o versionamento S3 nos arquivos de ACL é uma boa prática para manter uma trilha de auditoria das mudanças de permissão. Todas as ações de criação e atualização de knowledge bases são registradas no AWS CloudTrail, incluindo se as ACLs estão habilitadas, o que fornece aos administradores uma trilha de auditoria de quem configurou as ACLs e quando. O Amazon Quick também oferece um recurso para monitorar o uso de armazenamento do índice, ajudando a rastrear o crescimento e detectar mudanças inesperadas no conteúdo indexado.

    Limitações importantes

    Antes de habilitar ACLs, é importante considerar:

    • ACLs não podem ser desabilitadas após ativadas. Se precisar remover a funcionalidade de ACL, será necessário criar uma nova knowledge base sem ACLs.
    • A correspondência de identidade do usuário é baseada em e-mail. O campo Name nas entradas de ACL deve corresponder exatamente ao endereço de e-mail associado à identidade do usuário no Quick. Se o e-mail de um usuário mudar, os arquivos de ACL devem ser atualizados e uma nova sincronização deve ser acionada.

    Para limitações adicionais, consulte a documentação sobre limitações do conector de dados S3 e limitações de ACL de knowledge base no Amazon Quick.

    Próximos passos

    Para aprofundar o tema, a AWS disponibiliza a documentação do conector Amazon S3 com referência detalhada de configuração, e o guia de boas práticas de ACL com recomendações para estruturar controles de acesso em escala. Para conhecer mais sobre o Amazon Quick, acesse a página do produto, explore os recursos de segurança do Quick e participe da comunidade Quick para tirar dúvidas e compartilhar experiências.

    Fonte

    Restrict access to sensitive documents in your Amazon Quick knowledge bases for Amazon S3 (https://aws.amazon.com/blogs/machine-learning/restrict-access-to-sensitive-documents-in-your-amazon-quick-knowledge-bases-for-amazon-s3/)

  • Amazon CloudFront anuncia Modo Passthrough para TLS Mútuo (Viewer)

    O que foi anunciado

    A AWS anunciou suporte ao modo passthrough para autenticação de TLS Mútuo (mTLS) no lado do visualizador (viewer) no Amazon CloudFront. Com essa novidade, os clientes podem encaminhar certificados de cliente diretamente para a origem, sem que o CloudFront precise realizar a verificação dos certificados por conta própria.

    Por que isso importa

    Até então, quem já tinha uma implementação de mTLS consolidada na origem precisava adaptar sua lógica de validação para funcionar na borda (edge) do CloudFront. O modo passthrough resolve exatamente esse atrito: ele permite que organizações continuem usando sua infraestrutura de validação existente, sem precisar replicar ou migrar essa lógica para o CloudFront.

    Vale lembrar que o CloudFront para mTLS de visualizador já oferecia dois modos anteriores — o modo obrigatório (required) e o modo opcional (optional) — ambos transferem a autenticação do certificado do cliente para o CloudFront por meio de repositórios de confiança (trust stores). O modo passthrough é uma terceira opção, pensada para quem não quer — ou não pode — configurar esses repositórios no CloudFront.

    Como funciona o modo passthrough

    No modo passthrough, o CloudFront encaminha todas as requisições para a origem acompanhadas da cadeia de certificados completa do cliente. Alguns pontos importantes sobre esse comportamento:

    • Sem cache: o armazenamento em cache não é realizado nesse modo, garantindo que cada requisição seja autenticada de ponta a ponta pela origem.
    • Connection functions preservadas: as funções de conexão, que permitem inspecionar ou transformar dados em nível de conexão, continuam sendo invocadas. Isso significa que ainda é possível processar os dados do certificado antes que eles cheguem à origem.
    • Sem configuração de trust store: não é necessário configurar nenhum repositório de confiança no CloudFront para usar esse modo.

    Disponibilidade e custo

    O modo passthrough do CloudFront Mutual TLS (viewer) está disponível sem custo adicional. Para explorar os detalhes técnicos e entender como configurar esse recurso, a AWS disponibiliza a documentação oficial do CloudFront Mutual TLS (Viewer).

    Fonte

    Amazon CloudFront announces Passthrough Mode for mutual TLS (Viewer) (https://aws.amazon.com/about-aws/whats-new/2026/05/amazon-cloudfront-mtls-passthrough/)

  • Amazon SageMaker AI agora suporta personalização serverless do modelo Qwen3.6

    O que foi anunciado

    A AWS anunciou que o Amazon SageMaker AI passou a oferecer suporte à personalização serverless do modelo Qwen3.6, com 27 bilhões de parâmetros. A novidade permite aplicar tanto o Ajuste Fino Supervisionado (SFT) quanto o Ajuste Fino por Reforço (RFT) diretamente sobre esse modelo, sem necessidade de gerenciar infraestrutura.

    O Qwen3.6 é um modelo de pesos abertos bastante popular, desenvolvido pelo Alibaba Cloud. Esse lançamento amplia o suporte que o SageMaker AI já oferecia para o Qwen3.5 e outros modelos conhecidos do mercado.

    O que muda na prática

    Antes desse anúncio, já era possível fazer o deploy do modelo base Qwen3.6 no SageMaker AI. Agora, com o suporte à personalização, os times também podem adaptar o modelo para domínios e fluxos de trabalho específicos, utilizando dados proprietários da própria organização.

    Essa capacidade de personalização permite que o modelo passe a refletir melhor o conhecimento de domínio, a terminologia e os padrões de qualidade da empresa — sem precisar treinar um modelo do zero. O processo parte de um modelo base já capaz e o especializa para casos de uso específicos, como:

    • Melhorar a precisão em tarefas de um domínio específico
    • Alinhar as respostas ao tom e à linguagem da organização
    • Aumentar a performance em novas tarefas usando dados rotulados internamente

    Por que o modo serverless importa

    Com a personalização serverless, o SageMaker AI cuida de todo o provisionamento de infraestrutura e da orquestração do treinamento automaticamente. Isso significa que as equipes podem se concentrar no que realmente importa — os dados e a avaliação dos resultados — sem precisar gerenciar clusters ou configurações de ambiente.

    Outro ponto relevante é o modelo de cobrança: você paga apenas pelo que utilizar, o que torna a abordagem mais acessível para times que não precisam de treinamento contínuo ou de larga escala.

    Disponibilidade e como começar

    A personalização serverless do Qwen3.6 no SageMaker AI está disponível nas seguintes regiões da AWS:

    • US East (N. Virginia)
    • US West (Oregon)
    • Asia Pacific (Tokyo)
    • EU (Ireland)

    Para iniciar um job de personalização, basta acessar a página de Modelos no Amazon SageMaker Studio. Para acesso programático, a AWS disponibiliza o SDK Python do SageMaker. Mais detalhes técnicos estão disponíveis na documentação oficial de personalização de modelos do SageMaker AI.

    Fonte

    SageMaker AI now supports serverless model customization for Qwen3.6 (https://aws.amazon.com/about-aws/whats-new/2026/05/amazon-sagemaker-ft-qwen3-6/)

  • Amazon CloudFront passa a suportar verificação de revogação OCSP para mTLS (Viewer)

    O que mudou no CloudFront

    A AWS anunciou suporte à verificação de revogação via Protocolo de Status de Certificado Online (OCSP — Online Certificate Status Protocol) para o mTLS (TLS Mútuo) do lado do viewer no Amazon CloudFront. Com essa novidade, o CloudFront passa a validar em tempo real, durante o estabelecimento da conexão, se o certificado do cliente foi revogado — sem depender de listas estáticas mantidas manualmente.

    Por que isso importa

    Em arquiteturas de confiança zero (zero-trust) e em setores regulados, garantir que apenas certificados válidos e não revogados estabeleçam conexões é um requisito fundamental. Antes desse suporte nativo, quem usava mTLS no CloudFront precisava implementar essa verificação de forma manual, usando CloudFront Functions combinadas com o KeyValueStore para manter listas de revogação estáticas. O problema evidente dessa abordagem: a lista só era tão atual quanto a última atualização manual — uma janela de risco considerável.

    Como funciona a verificação OCSP no CloudFront

    Com o suporte nativo ao OCSP, o CloudFront passa a consultar diretamente a URL do respondedor OCSP embutida no próprio certificado do cliente no momento da conexão. Essa consulta é feita junto à Autoridade Certificadora (CA — Certificate Authority) emissora, validando o status de revogação de forma dinâmica e em tempo real.

    Para evitar impacto na latência das conexões subsequentes, o CloudFront armazena em cache as respostas OCSP por até 30 minutos.

    Flexibilidade para lógica customizada

    O resultado da verificação OCSP fica disponível na connection function do CloudFront, o que permite implementar lógica personalizada a partir desse dado. Entre os casos de uso possíveis, a AWS cita:

    • Períodos de carência durante a rotação de certificados;
    • Exceções baseadas em endereço IP;
    • Combinação do resultado OCSP com listas de revogação próprias.

    Disponibilidade e custo

    A verificação de revogação OCSP para mTLS do viewer está disponível sem custo adicional. Para saber mais sobre como configurar esse recurso, a AWS disponibiliza a documentação oficial do CloudFront Mutual TLS (Viewer).

    Fonte

    Amazon CloudFront announces support for OCSP Revocation for Mutual TLS (Viewer) (https://aws.amazon.com/about-aws/whats-new/2026/05/amazon-cloudfront-mtls-ocsp/)

  • Amazon Bedrock Apresenta Ferramenta Avançada de Otimização e Migração de Prompts

    O Problema Real por Trás da Otimização de Prompts

    Quem trabalha com modelos de linguagem no dia a dia sabe bem o quanto é custoso — em tempo e esforço — ajustar prompts para obter respostas de qualidade. Seja ao migrar para um modelo novo ou simplesmente ao tentar melhorar o desempenho do modelo atual, o processo costuma consumir dias ou até semanas. Além disso, testar as mudanças sem introduzir regressões é um desafio constante para equipes de desenvolvimento.

    Para endereçar exatamente essa dor, a AWS anunciou o Advanced Prompt Optimization (Otimização Avançada de Prompts), uma nova ferramenta disponível no Amazon Bedrock que combina otimização de prompts com avaliação integrada dos resultados.

    O Que é o Advanced Prompt Optimization

    O Advanced Prompt Optimization é uma ferramenta que permite otimizar prompts para qualquer modelo disponível no Bedrock, com a capacidade de comparar o prompt original com o prompt otimizado em até 5 modelos simultaneamente. Isso torna a ferramenta útil tanto para quem está migrando de modelo quanto para quem quer extrair mais desempenho do modelo que já utiliza.

    Como Funciona na Prática

    O funcionamento é direto:

    • Se o objetivo é migrar de modelo, é possível selecionar o modelo atual como linha de base e comparar com até 4 outros modelos.
    • Se o objetivo é melhorar o modelo atual, basta selecioná-lo e visualizar o antes e o depois da otimização.

    A ferramenta recebe como entrada templates de prompt, exemplos de entradas do usuário para os valores das variáveis, respostas de referência opcionais e uma métrica de avaliação ou critério em linguagem natural. Um detalhe importante: o otimizador é compatível com entradas multimodais, incluindo arquivos nos formatos jpg, png e PDF.

    O Ciclo de Feedback e os Resultados Gerados

    O otimizador opera em um ciclo de feedback contínuo, ajustando o prompt e as respostas do modelo em direção à métrica de avaliação definida. Ao final do processo, a ferramenta entrega:

    • Os templates de prompt original e otimizado;
    • Pontuações de avaliação comparativas;
    • Estimativas de custo;
    • Informações de latência.

    Essa combinação de resultados permite que as equipes tomem decisões mais embasadas antes de colocar qualquer mudança em produção.

    Disponibilidade e Como Começar

    Para verificar em quais regiões o serviço está disponível, a AWS orienta consultar a documentação oficial. Informações de precificação estão disponíveis na página de preços do Bedrock. Para começar a usar, é possível acessar as APIs do Advanced Prompt Optimizer ou utilizar diretamente o Console do Bedrock.

    Fonte

    Amazon Bedrock Introduces Advanced Prompt Optimization and Migration Tool (https://aws.amazon.com/about-aws/whats-new/2026/05/amazon-bedrock-advanced-prompt-optimization-migration-tool/)

  • Melhore a precisão do seu bot com o Assisted NLU do Amazon Lex

    O desafio de entender como as pessoas realmente falam

    Quem já trabalhou com bots conversacionais sabe bem o problema: o usuário não fala do jeito que o sistema espera. A mesma solicitação pode vir de dezenas de formas diferentes, misturada com outras informações na mesma frase, ou de maneira ambígua o suficiente para confundir qualquer sistema tradicional de Compreensão de Linguagem Natural (NLU).

    Sistemas baseados em regras exigem que desenvolvedores configurem manualmente cada variação possível de uma frase — um trabalho enorme que ainda assim deixa lacunas. Um bot de reservas treinado com “reserve um hotel” vai falhar quando o usuário disser “preciso de um lugar para ficar”. Pedidos complexos como “quero uma suíte no centro de São Paulo do dia 15 ao 18 de dezembro” frequentemente perdem detalhes críticos. E frases ambíguas como “preciso de ajuda com minha reserva” deixam o bot sem saber se o usuário quer criar, visualizar, alterar ou cancelar.

    Para resolver esse problema, a AWS anunciou o Assisted NLU no Amazon Lex — um recurso que combina o aprendizado de máquina (ML) tradicional com grandes modelos de linguagem (LLM) para lidar com as variações naturais da comunicação humana. E o melhor: está incluído sem custo adicional no preço padrão do Amazon Lex.

    O que é o Assisted NLU e como ele funciona

    O Assisted NLU usa LLMs para aprimorar a classificação de intenções e a resolução de slots. Em vez de depender apenas de exemplos de frases configurados manualmente, o recurso utiliza os nomes e descrições das suas intenções e slots para entender o que o usuário está tentando fazer — lidando com erros de digitação, frases complexas e extração de múltiplos slots sem configuração manual adicional.

    Os resultados reportados pela AWS são expressivos: 92% de precisão na classificação de intenções e 84% de precisão na resolução de slots, em média. Clientes que já adotaram o recurso relataram aumentos de 11 a 15% na classificação de intenções, 23,5% menos respostas de fallback e 30% mais eficiência no tratamento de entradas com ruído.

    O recurso opera em dois modos:

    • Modo Primário (Primary): o LLM processa todas as entradas do usuário como principal mecanismo de classificação.
    • Modo Fallback: o NLU tradicional é usado primeiro; o LLM só é acionado quando a confiança está baixa ou quando a entrada seria roteada para a FallbackIntent.

    A ativação é feita diretamente no console do Amazon Lex, nas configurações de localidade do bot. Para configuração via código, a AWS disponibiliza a referência da API NluImprovementSpecification. Quem ainda não conhece o Amazon Lex pode começar pelo Guia de Introdução.

    Boas práticas de implementação

    Escolhendo o modo certo

    A escolha entre Modo Primário e Modo Fallback depende do contexto do seu bot:

    • Use o Modo Primário para bots novos ou quando você tem poucos exemplos de frases (menos de 20 por intenção). É o modo ideal para começar do zero com boas descrições.
    • Use o Modo Fallback quando o bot já tem boa performance e você quer que o LLM atue apenas nos casos limítrofes. Se mais de 30% das requisições estiverem acionando o LLM no Modo Fallback, vale considerar migrar para o Modo Primário.
    • Não troque para o Modo Primário sem testes A/B em bots que já performam bem — você pode introduzir latência sem ganho real de precisão.

    Escrevendo boas descrições de intenções

    As descrições de intenções funcionam como prompts para o LLM — não são documentação interna. A qualidade delas determina diretamente a precisão do sistema. A AWS recomenda um padrão consistente:

    “Intenção de [verbo de ação] [objeto/entidade] [contexto/restrições]”

    Exemplos práticos:

    • Bom: “Intenção de reservar ou garantir um quarto de hotel ou suíte para uma estadia”
    • Ruim: “TBD” ou “Intenção 1” — não fornece nenhum sinal para o LLM
    • Ruim: “Intenção de reservar e gerenciar reservas de hotel” — combinar múltiplas ações em uma intenção confunde a classificação

    Outros pontos importantes: evite linguagem que se sobreponha entre intenções diferentes, não inclua valores de slots ou exemplos específicos na descrição, e baseie as descrições no vocabulário real dos seus usuários.

    Escrevendo boas descrições de slots

    As descrições de slots fornecem contexto para que o LLM saiba exatamente qual informação extrair e como interpretá-la. O padrão recomendado é:

    [O que o slot captura] [restrições contextuais] [orientação sobre valores válidos]

    Alguns exemplos do que isso resolve na prática:

    • Se você tem dois slots do tipo AMAZON.Number (número de noites e número de hóspedes), a descrição é essencial para o LLM diferenciar qual “3” pertence a qual slot.
    • Para capturar códigos de aeroporto, use AMAZON.AlphaNumeric com a descrição “Código IATA válido de aeroporto (por exemplo, GRU, CGH, BSB)”. O LLM consegue mapear “voo saindo de Guarulhos” para GRU sem precisar de um catálogo completo de valores.
    • Para um slot de tipo de quarto com valores como Standard, Deluxe e Suíte, uma descrição detalhando as características de cada categoria permite que o LLM resolva entradas como “o quarto maior” ou “quarto com cozinha” para o valor correto.

    Nunca deixe descrições de slots em branco — especialmente em slots customizados. E lembre-se de atualizar as descrições sempre que a lógica de negócio mudar.

    Desambiguação de intenções

    Quando múltiplas intenções podem corresponder à entrada do usuário, o Assisted NLU apresenta opções de desambiguação. Para que isso funcione bem:

    • Use nomes e descrições de intenções claros e sem sobreposição.
    • Forneça nomes de exibição amigáveis para nomes técnicos de intenções.
    • Limite as opções de desambiguação a no máximo 3 ou 4 — se “reservar hotel” corresponde a 6 intenções, o design do bot precisa ser revisado.
    • Monitore quais pares de intenções frequentemente disparam desambiguação e refine-os continuamente.
    • Tenha uma estratégia de fallback clara quando o usuário não seleciona nenhuma opção.

    Testando sua implementação com o Test Workbench

    Após configurar as descrições, o próximo passo é validar tudo sistematicamente. A AWS recomenda usar o Test Workbench do Amazon Lex para medir como o Assisted NLU lida com variações reais de frases. A documentação do Test Workbench e um vídeo demonstrativo estão disponíveis para consulta.

    Atenção: ao configurar a execução do conjunto de testes, certifique-se de selecionar o bot e o alias onde o Assisted NLU está habilitado — o teste só exercita o recurso se o alias apontar para uma versão com o Modo Fallback ou Primário configurado.

    O que testar

    • Casos extremos: entradas com erros de digitação (“quero resrvar um quarto”), expressões coloquiais, pedidos ambíguos e frases incompletas.
    • Variações de slots built-in: formatos de data (“próxima terça”, “dia 15”), aliases de localização, variações de nome e formatos de e-mail.
    • Slots customizados: verifique se o vocabulário do usuário é mapeado corretamente para os valores definidos, especialmente no modo de expansão.

    Vale destacar um ponto de segurança importante: diferente de aplicações de IA generativa abertas, o Assisted NLU usa o LLM estritamente como um motor de classificação e extração, limitado pela definição do bot. O LLM não pode inventar novas intenções, acionar ações fora do escopo do bot ou retornar texto gerado livremente ao usuário. Mesmo assim, a AWS recomenda validar que entradas adversariais sejam roteadas de forma previsível para a FallbackIntent.

    Interpretando os resultados

    Após a execução dos testes, use as taxas de aprovação para priorizar esforços:

    • 0 a 30%: alta prioridade — reescreva a descrição da intenção e verifique sobreposições.
    • 30 a 70%: média prioridade — analise padrões nas falhas e refine as descrições.
    • 70 a 100%: baixa prioridade — ajustes menores ou nenhuma ação necessária.

    Iteração e versionamento seguro

    Para iterar com segurança sem impactar o tráfego em produção, a AWS recomenda usar o sistema de versionamento e aliases do Amazon Lex: refine as descrições na versão Draft, teste no alias de teste, crie uma versão numerada quando os resultados forem satisfatórios e promova para produção. Em caso de problemas, basta redirecionar o alias de produção para a versão anterior. Consulte o Guia de Versionamento e Aliases para detalhes.

    Do ponto de vista de controle de acesso, a AWS recomenda usar políticas do Gerenciamento de Identidade e Acesso (IAM) para restringir quem pode modificar definições do bot. As permissões lex:UpdateBotLocale, lex:UpdateIntent e lex:UpdateSlot devem ser limitadas a desenvolvedores autorizados. Mais detalhes em Gerenciamento de Identidade e Acesso para o Amazon Lex.

    Monitoramento em produção

    Com o bot em produção, a AWS recomenda habilitar logs de conversa no alias de produção para acompanhar a performance do Assisted NLU com tráfego real. Veja como configurar em Configurando Logs de Conversa.

    Os principais campos a monitorar são:

    • fulfilledByAssistedNlu: flag booleana que indica quando o LLM tratou a classificação ou resolução de slot.
    • nluConfidence: pontuação de confiança para a intenção selecionada.
    • missedUtterance: booleano que indica quando a FallbackIntent foi classificada.

    Para comparar os modos Primário e Fallback, crie versões separadas do bot para cada modo, aponte aliases diferentes para elas e compare as métricas no CloudWatch.

    Estratégia de implantação recomendada

    Para bots novos, a AWS recomenda começar com o Modo Primário, usando de 10 a 15 exemplos de frases por intenção e investindo na qualidade das descrições.

    Para bots existentes com boa performance, o ponto de partida é o Modo Fallback, com testes A/B antes de qualquer migração para o Modo Primário. Sempre mantenha uma versão anterior do bot disponível para rollback.

    O checklist de implantação sugerido inclui: métricas de baseline documentadas, testes com casos extremos em ambiente de desenvolvimento, logs de conversa habilitados, dashboard no CloudWatch configurado e procedimento de rollback definido.

    Conclusão

    O Assisted NLU representa uma evolução significativa para quem trabalha com bots no Amazon Lex. Ao combinar o NLU tradicional com LLMs, a AWS entrega um recurso que lida com a imprevisibilidade real da comunicação humana — sem exigir configuração manual exaustiva e sem custo adicional.

    A chave para extrair o máximo do recurso está na qualidade das descrições de intenções e slots: elas funcionam como prompts para o LLM e determinam diretamente a precisão do sistema. Com boas descrições, testes sistemáticos e uma estratégia de implantação gradual, é possível melhorar expressivamente a experiência conversacional dos usuários.

    Para habilitar o recurso no seu bot, acesse a documentação de habilitação do Assisted NLU no Amazon Lex Developer Guide.

    Fonte

    Improve bot accuracy with Amazon Lex Assisted NLU (https://aws.amazon.com/blogs/machine-learning/improve-bot-accuracy-with-amazon-lex-assisted-nlu/)

  • Automatizando a prontidão para criptografia pós-quântica com AWS Config

    O problema: saber onde você está antes de migrar

    A computação quântica avança em ritmo acelerado, e isso coloca em xeque os algoritmos criptográficos que protegem conexões TLS hoje. Migrar para criptografia pós-quântica (PQC) é inevitável — mas antes de qualquer migração, é preciso entender o estado atual dos seus endpoints. É exatamente para isso que a AWS desenvolveu o PQC Readiness Scanner: uma ferramenta automatizada que faz o inventário e o monitoramento contínuo das configurações TLS dos seus recursos na nuvem.

    O scanner avalia endpoints do Application Load Balancer (ALB), do Network Load Balancer (NLB) e do Amazon API Gateway, classificando cada um deles em um sistema de três níveis que facilita a priorização da migração.

    Contexto técnico: por que o TLS 1.3 é obrigatório para PQC

    Para tráfego web, os algoritmos de troca de chaves pós-quânticos são negociados exclusivamente dentro do TLS 1.3. Isso significa que conexões resistentes a ataques quânticos exigem dois requisitos simultâneos: suporte a TLS 1.3 e uso de algoritmos de troca de chaves PQC.

    Dentro do Modelo de Responsabilidade Compartilhada da AWS, a AWS garante a infraestrutura e habilita o suporte a PQC nos seus serviços. A responsabilidade de configurar os recursos para usar políticas de segurança compatíveis com PQC é do cliente. Para conexões TLS terminadas pela AWS — como ALB, NLB, API Gateway e CloudFront — o cliente escolhe a política de segurança que define quais versões de TLS e conjuntos de cifras serão aceitos em cada listener.

    Como o PQC Readiness Scanner funciona

    A solução é construída sobre pacotes de conformidade do AWS Config. Um pacote de conformidade é um conjunto de regras do AWS Config e ações de remediação que pode ser implantado como uma única entidade em uma conta e região, ou em toda uma organização via AWS Organizations.

    O scanner executa duas verificações por recurso:

    • O endpoint usa uma política de segurança compatível com PQC?
    • O endpoint ainda aceita TLS 1.0 ou 1.1 (protocolos legados)?

    Cada verificação retorna status COMPLIANT ou NON_COMPLIANT, com recomendações específicas de política. Com base nesses resultados, cada recurso é classificado em um dos três níveis do framework:

    Imagem original — fonte: Aws

    Os três níveis de prontidão

    • Nível 1 — PQ-ready (postura mais forte): O endpoint usa apenas TLS 1.3 com troca de chaves PQC. Esses recursos já estão no estado ideal. Nenhuma ação necessária.
    • Nível 2 — PQ-ready com compatibilidade retroativa: O endpoint suporta TLS 1.2 e TLS 1.3, com troca de chaves PQC negociada nas conexões TLS 1.3. Prioridade de migração baixa — esses recursos já oferecem proteção pós-quântica para clientes que suportam TLS 1.3, mantendo compatibilidade com clientes legados via TLS 1.2.
    • Nível 3 — Não PQ-ready: Inclui endpoints sem suporte a TLS 1.3 e endpoints com TLS 1.3, mas sem políticas de troca de chaves PQC. Prioridade alta — requerem atenção imediata.

    Escopo da avaliação

    O scanner avalia os seguintes serviços de borda da AWS que terminam conexões TLS em nome das aplicações:

    • ALB e NLB: Listeners com protocolos HTTPS, TLS e TCP SSL são avaliados.
    • API Gateway: REST APIs (endpoints regionais e privados), HTTP APIs (v2) e WebSocket APIs (v2) são avaliadas.

    O que fica de fora: Distribuições do Amazon CloudFront estão excluídas do escopo porque o TLS 1.3 com troca de chaves híbrida pós-quântica já é habilitado automaticamente nas políticas de segurança TLS do CloudFront para conexões viewer-to-edge. Nenhuma ação é necessária do lado do cliente para PQC no CloudFront.

    Quanto aos Classic Load Balancers, a recomendação da AWS é migrar para ALB ou NLB, pois o Classic Load Balancer não suporta TLS 1.3 nem troca de chaves PQC e não pode ser tornado PQ-ready.

    Arquitetura da solução

    O PQC Readiness Scanner combina quatro serviços principais:

    O pacote de conformidade implementa quatro regras customizadas do AWS Config, alimentadas por duas funções Lambda:

    • ELB PQ-ready: Verifica se os listeners dos load balancers usam políticas que suportam TLS 1.3 com algoritmos PQC.
    • ELB legacy TLS: Verifica se os listeners ainda permitem conexões TLS 1.0 ou 1.1.
    • API Gateway PQ-ready: Verifica se os endpoints do API Gateway usam políticas com suporte a TLS 1.3 e PQC.
    • API Gateway legacy TLS: Verifica se os endpoints do API Gateway ainda permitem TLS 1.0 ou 1.1.

    Pré-requisitos para implantação

    Antes de implantar a solução, você precisa ter:

    Implantação em conta única

    O deploy é feito em três fases. Os detalhes completos estão no repositório GitHub. As funções Lambda devem ser implantadas antes do pacote de conformidade, pois o pacote referencia os ARNs das funções como parâmetros.

    git clone https://github.com/aws-samples/sample-PQC-Readiness-using-AWS-Config.git
    cd sample-PQC-Readiness-using-AWS-Config/installation
    sam build

    Para implantar em uma ou mais regiões:

    # Make script executable (first time only)
    chmod +x deploy-per-regions.sh
    
    # Deploy to a single region
    ./deploy-per-regions.sh us-east-1
    
    # Deploy to multiple regions
    ./deploy-per-regions.sh us-east-1 us-west-2 eu-west-1

    O script automaticamente implanta as funções Lambda via SAM, provisiona o pacote de conformidade com as regras do Config, cria as roles IAM com permissões mínimas para operações de describe no ELB, ALB, NLB e API Gateway, e fornece mensagens de status claras ao longo do processo.

    Implantação multi-conta via Organizations

    Para implantação em múltiplas contas AWS, a solução usa CloudFormation StackSets para distribuir as funções Lambda em cada conta. Um ponto importante: regras do tipo CUSTOM_LAMBDA no AWS Config exigem que a função Lambda esteja na mesma conta que a regra — não é possível usar uma Lambda centralizada em uma conta para avaliar recursos em outras contas.

    Passo 1: Criar o bucket S3 compartilhado

    Antes de empacotar, é necessário criar um bucket S3 acessível por cada conta-alvo na organização. Esse bucket hospedará os artefatos de deploy que o CloudFormation StackSets distribuirá para as contas-membro.

    # Create the shared S3 bucket (run from management/central account)
    aws s3 mb s3://<your-org-shared-bucket> --region us-east-1

    Conceda acesso de leitura às contas-alvo via política de bucket:

    aws s3api put-bucket-policy \
      --bucket <your-org-shared-bucket> \
      --policy '{
      "Statement": [
        {
          "Sid": "BucketOwnerFullAccess",
          "Effect": "Allow",
          "Principal": {
            "AWS": "arn:aws:iam::<bucket-owner-account-id>:root"
          },
          "Action": "s3:*",
          "Resource": [
            "arn:aws:s3:::<your-org-shared-bucket>",
            "arn:aws:s3:::<your-org-shared-bucket>/*"
          ]
        },
        {
          "Sid": "CrossAccountReadAccess",
          "Effect": "Allow",
          "Principal": {
            "AWS": [
              "arn:aws:iam::<account-id-1>:root",
              "arn:aws:iam::<account-id-2>:root"
            ]
          },
          "Action": ["s3:GetObject", "s3:ListBucket"],
          "Resource": [
            "arn:aws:s3:::<your-org-shared-bucket>",
            "arn:aws:s3:::<your-org-shared-bucket>/*"
          ]
        }
      ]
    }'

    Atenção: o bucket deve estar na mesma região das implantações do StackSet. Para implantações multi-região, crie um bucket por região e execute o sam package separadamente para cada uma.

    Passo 2: Build e upload dos pacotes Lambda para o S3

    cd installation
    
    # Make script executable (first time only)
    chmod +x deploy-stacksets.sh
    
    # Build, package, upload to S3, and generate resolved template
    ./deploy-stacksets.sh <your-org-shared-bucket>

    Passo 3: Implantar as funções Lambda via StackSets

    # Create StackSet (--region sets the StackSet "home region" where it is managed)
    aws cloudformation create-stack-set \
      --stack-set-name pqc-readiness-lambda-functions \
      --template-body file://packaged-template.yaml \
      --capabilities CAPABILITY_IAM \
      --permission-model SERVICE_MANAGED \
      --auto-deployment Enabled=true,RetainStacksOnAccountRemoval=false \
      --region us-east-1
    
    # Deploy stack instances to member accounts
    aws cloudformation create-stack-instances \
      --stack-set-name pqc-readiness-lambda-functions \
      --deployment-targets OrganizationalUnitIds=ou-xxxx-xxxxxxxx \
      --regions us-east-1 \
      --region us-east-1

    Ponto de atenção sobre regiões: --region em cada comando define a região-home do StackSet (onde o recurso StackSet vive). --regions em create-stack-instances define as regiões-alvo onde as instâncias de stack serão criadas nas contas-membro. São valores independentes. StackSets com SERVICE_MANAGED devem ser criados a partir da conta de gerenciamento ou de uma conta de administrador delegado. A conta de gerenciamento em si é excluída das implantações de instâncias de stack — use o script deploy-per-regions.sh separadamente se precisar do scanner na conta de gerenciamento.

    Passo 4: Implantar o pacote de conformidade organizacional

    aws configservice put-organization-conformance-pack \
      --organization-conformance-pack-name pqc-legacy-tls-compliance \
      --template-body file://conformance-packs/pqc-legacy-tls-conformance-pack.yaml

    Isso cria as regras do Config em cada conta-membro, referenciando as funções Lambda locais de cada conta.

    Guia de migração e priorização

    Com os resultados em mãos, a priorização segue o framework de três níveis:

    Alta prioridade — Nível 3 (não PQ-ready)

    Recursos sem suporte a PQC e/ou que ainda permitem TLS 1.0 ou 1.1. A ação é atualizar para uma política PQ-ready — como as que terminam com -PQ-2025-09 (consulte a documentação de políticas de segurança do Elastic Load Balancing).

    Importante: antes de atualizar, audite as versões TLS dos seus clientes. Políticas PQ-ready exigem TLS 1.3; clientes legados que suportam apenas TLS 1.2 ou anterior falharão na negociação. A recomendação é começar por uma política de Nível 2 (compatível com TLS 1.2 e 1.3 com PQC), monitorar os logs de conexão para falhas de negociação TLS e só migrar para uma política TLS 1.3-only do Nível 1 após confirmar que os clientes suportam TLS 1.3 com PQC.

    Baixa prioridade — Nível 2 (PQ-ready com compatibilidade retroativa)

    Recursos usando TLS 1.3 com políticas PQ-ready que também suportam TLS 1.2. Esses recursos já oferecem proteção pós-quântica para conexões TLS 1.3. A ação recomendada é monitorar os logs, identificar o volume de conexões TLS 1.2 e planejar a migração desses clientes para TLS 1.3 com PQC quando for viável.

    Sem ação necessária — Nível 1 (PQ-ready, estado ideal)

    Recursos usando apenas TLS 1.3 com troca de chaves PQC. Esses recursos já estão no estado-alvo.

    Visualizando os resultados

    Em cada conta-membro, acesse o console do AWS Config na região implantada. Os pacotes de conformidade organizacionais aparecem com o prefixo OrgConformsPack- seguido de um sufixo aleatório (ex: OrgConformsPack-pqc-legacy-tls-compliance-gyv22je0). Ao clicar no pacote, você vê um resumo geral de conformidade para as quatro regras. Em Regras, as quatro regras com prefixo pqc- mostram contagens de recursos conformes e não conformes, anotações detalhadas por recurso, ARNs e configurações de política de segurança atuais.

    Conclusão

    O PQC Readiness Scanner resolve um problema real e imediato: saber exatamente quais endpoints precisam ser migrados primeiro, sem depender de revisões manuais de configuração. O sistema de níveis traduz achados técnicos em recomendações acionáveis — equipes conseguem entender os próximos passos sem precisar dominar criptografia. O scanner detecta automaticamente mudanças de configuração, ajudando a manter novos deployments dentro dos padrões de prontidão. Os relatórios nativos do AWS Config suportam requisitos de auditoria e permitem demonstrar progresso mensurável.

    Para começar, acesse o PQC Readiness Scanner, priorize os recursos de Nível 3 e acompanhe o progresso entre contas usando os aggregators do AWS Config.

    Recursos adicionais

    Fonte

    Automating post-quantum cryptography readiness using AWS Config (https://aws.amazon.com/blogs/security/automating-post-quantum-cryptography-readiness-using-aws-config/)

  • Controle onde seus agentes de IA navegam com políticas Chrome Enterprise no Amazon Bedrock AgentCore

    O problema: agentes de IA com acesso irrestrito à web

    Agentes de IA que navegam pela web sem restrições representam um risco real para organizações. Sem controles adequados, um agente pode acessar domínios não autorizados, armazenar credenciais no gerenciador de senhas do navegador ou baixar arquivos fora dos fluxos aprovados. Para empresas que operam serviços internos com uma Autoridade Certificadora (CA) privada, há ainda outro obstáculo: toda conexão HTTPS com esses serviços falha com erros de validação de certificado.

    Para endereçar esses cenários, a AWS anunciou que o Amazon Bedrock AgentCore Browser agora oferece suporte a políticas Chrome Enterprise e certificados CA raiz personalizados. Com isso, as organizações ganham controle granular sobre o comportamento de navegação dos agentes — e podem conectá-los a infraestrutura interna com segurança.

    O que muda com esse suporte

    As políticas Chrome Enterprise permitem configurar mais de 450 configurações do navegador, incluindo filtragem de URLs, restrições de download e controle do gerenciador de senhas, tudo via configuração JSON padrão do Chrome Enterprise. Já o suporte a certificados CA raiz personalizados permite que os agentes se conectem a serviços internos e trabalhem com proxies corporativos que interceptam SSL, sem precisar desabilitar a validação de certificados.

    Para referência completa das configurações disponíveis, a AWS disponibiliza a lista de políticas Chrome Enterprise.

    Por que aplicar políticas de navegador em agentes de IA

    As políticas Chrome Enterprise atendem a três necessidades organizacionais quando aplicadas a agentes de navegação:

    • Restringir o escopo do agente a domínios aprovados: listas de permissão e bloqueio de URLs limitam onde os agentes podem navegar. Um agente responsável por processar faturas em um portal específico não precisa de acesso a redes sociais ou mecanismos de busca. As políticas impõem esses limites no nível do navegador, independentemente do prompt ou do raciocínio do agente.
    • Desabilitar recursos arriscados do navegador: é possível desligar o gerenciador de senhas, bloquear downloads de arquivos, desativar o preenchimento automático e controlar dezenas de outras capacidades do navegador. Para agentes que interagem com sistemas sensíveis, esses controles reduzem o risco de armazenamento ou exfiltração não intencional de dados.
    • Separar o gerenciamento de políticas do desenvolvimento do agente: as políticas gerenciadas são configuradas no nível do navegador via API do plano de controle e se aplicam a todas as sessões criadas a partir daquele navegador. Isso permite que a equipe de segurança defina configurações aprovadas enquanto a equipe de desenvolvimento foca na lógica do agente, sem embutir decisões de política no código da aplicação.

    Como as políticas e certificados CA raiz são aplicados

    A integração funciona em duas camadas de aplicação de políticas, com uma configuração opcional de confiança de certificados:

    • Políticas gerenciadas operam no nível do navegador. Os arquivos JSON de política Chrome Enterprise são armazenados no Amazon Simple Storage Service (Amazon S3) e fornecidos ao criar um navegador via API do plano de controle. Essas políticas são armazenadas pelo serviço e aplicadas em todas as sessões. Elas mapeiam para o diretório /etc/chromium/policies/managed/ do Chrome e não podem ser substituídas por configurações de nível de sessão.
    • Políticas recomendadas operam no nível da sessão. Podem ser fornecidas ao iniciar uma sessão via API do plano de dados. Mapeiam para o diretório /etc/chromium/policies/recommended/ e funcionam como preferências do usuário. Se houver conflito entre uma política gerenciada e uma recomendada, a gerenciada tem precedência — comportamento padrão do Chrome.
    • Certificados CA raiz personalizados são armazenados no AWS Secrets Manager e referenciados ao criar um navegador ou um AgentCore Code Interpreter. O serviço importa o certificado para o repositório de confiança de certificados, fazendo com que conexões a serviços internos e proxies que interceptam SSL funcionem sem desabilitar a validação.

    Arquitetura da solução

    O diagrama abaixo ilustra como os arquivos JSON de política Chrome e os certificados CA raiz fluem do ambiente da organização pelo plano de controle e plano de dados do Amazon Bedrock AgentCore até a sessão de navegador isolada.

    Imagem original — fonte: Aws

    No ambiente da organização, os arquivos JSON de política ficam armazenados no Amazon S3, e os certificados CA raiz opcionais ficam no AWS Secrets Manager. O plano de controle busca a política no S3 ao chamar CreateBrowser (seta 1) e busca o certificado CA raiz no Secrets Manager, se configurado (seta 2, tracejada para indicar que é opcional). A aplicação chama a API CreateBrowser (seta 3) e depois a API StartBrowserSession (seta 4). O plano de controle passa os metadados de configuração do navegador para o plano de dados (seta 5). O plano de dados implanta políticas gerenciadas, recomendadas e certificados CA raiz na sessão isolada do navegador (seta 6). O Chrome lê a configuração mesclada na inicialização e aplica as políticas durante toda a sessão.

    Pré-requisitos

    Para seguir o tutorial, é necessário ter:

    • Python 3.10 ou superior
    • Uma conta AWS com acesso ao Amazon Bedrock AgentCore habilitado
    • Credenciais AWS configuradas (verificável com aws sts get-caller-identity)
    • Uma região AWS onde o Amazon Bedrock AgentCore esteja disponível (veja as regiões suportadas na documentação do AgentCore)
    • Acesso a um modelo de IA para conduzir o agente. O tutorial utiliza o Anthropic Claude via Amazon Bedrock. O AgentCore é agnóstico de modelo — outros provedores e frameworks de agentes podem ser substituídos. Para detalhes sobre configuração de diferentes modelos com o framework Strands Agents, veja Provedores de Modelos na documentação do Strands Agents.

    O notebook cria automaticamente os recursos AWS necessários, incluindo o bucket S3, a função de execução do Gerenciamento de Identidade e Acesso (IAM), o AgentCore Browser e o AgentCore Code Interpreter. Esse provisionamento automático é voltado para demonstração. Implantações em produção devem usar recursos pré-existentes com políticas IAM de menor privilégio revisadas pela equipe de segurança. Consulte o README do repositório de exemplos para detalhes completos sobre as políticas IAM.

    Importante: use credenciais temporárias do AWS IAM Identity Center ou do AWS Security Token Service (AWS STS). Não use chaves de acesso de longa duração. Siga o princípio do menor privilégio ao configurar permissões IAM.

    Configurando o ambiente

    O código completo do tutorial está disponível como um Jupyter notebook no repositório de exemplos. Clone e execute as células em sequência:

    git clone https://github.com/awslabs/amazon-bedrock-agentcore-samples.git
    cd amazon-bedrock-agentcore-samples/01-tutorials/05-AgentCore-tools/02-Agent-Core-browser-tool/13-browser-chrome-policies
    python3 -m venv .venv
    source .venv/bin/activate # On Windows: .venv\Scripts\activate
    pip install -r requirements.txt
    export AWS_REGION=us-west-2
    jupyter notebook browser-chrome-policies.ipynb

    Execute as células em sequência. A Parte 1 cobre as políticas Chrome Enterprise. A Parte 2 cobre os certificados CA raiz personalizados.

    Walkthrough: políticas Chrome Enterprise na prática

    Definindo a política Chrome Enterprise

    As primeiras células do notebook definem uma política Chrome Enterprise que restringe o navegador à documentação da AWS e desabilita recursos desnecessários para o agente:

    policy = {
        "URLBlocklist": ["*"],
        "URLAllowlist": [
            "docs.aws.amazon.com",
            ".aws.amazon.com",
            ".amazonaws.com",
        ],
        "PasswordManagerEnabled": False,
        "DownloadRestrictions": 3,
        "DeveloperToolsAvailability": 0,
        "BookmarkBarEnabled": False,
        "AutofillAddressEnabled": False,
        "AutofillCreditCardEnabled": False,
    }

    Cada configuração tem um propósito claro: URLBlocklist: ["*"] bloqueia todas as URLs por padrão; URLAllowlist libera apenas os domínios da AWS; PasswordManagerEnabled: false impede o armazenamento de credenciais; DownloadRestrictions: 3 bloqueia downloads; e as demais configurações desabilitam ferramentas de desenvolvimento, barra de favoritos e preenchimento automático.

    Vale destacar: o URLAllowlist usa o formato de padrão de filtro de URL do Chrome, que difere dos padrões glob típicos. Padrões como docs.aws.amazon.com correspondem ao domínio exato. Um ponto inicial, como .aws.amazon.com, corresponde a subdomínios. Para a sintaxe completa de padrões, consulte a documentação da política URLAllowlist.

    Atenção: o DeveloperToolsAvailability deve ser definido como 0 (ou omitido) para navegadores usados com Playwright ou outra automação baseada em CDP (Chrome DevTools Protocol). Definir esse valor como 2 desabilita o CDP no nível do Chrome, o que quebra silenciosamente a automação.

    Criando um navegador com políticas gerenciadas

    As próximas células criam um navegador personalizado que aplica a política em todas as sessões. O parâmetro-chave é o enterprise_policies com o tipo definido como MANAGED. A gravação de sessão também é habilitada para revisão posterior:

    from bedrock_agentcore.tools import BrowserClient
    
    client = BrowserClient(REGION)
    response = client.create_browser(
        name="docs_research_browser",
        execution_role_arn=EXECUTION_ROLE_ARN,
        network_configuration={"networkMode": "PUBLIC"},
        enterprise_policies=[
            {
                "location": {
                    "s3": {
                        "bucket": BUCKET_NAME,
                        "prefix": POLICY_KEY,
                    }
                },
                "type": "MANAGED",
            }
        ],
        recording={
            "enabled": True,
            "s3Location": {
                "bucket": BUCKET_NAME,
                "prefix": "policy-demo",
            },
        },
    )

    Demonstrando a aplicação da política com Playwright

    O notebook inicia uma sessão de navegador e usa o Playwright para navegar para duas URLs. A primeira, docs.aws.amazon.com, é permitida pela política e carrega com sucesso. A segunda, www.wikipedia.org, é bloqueada e o Chrome exibe uma página de erro. A saída esperada é:

    TEST 1: Navigate to docs.aws.amazon.com (ALLOWED)
    Page title: Overview - Amazon Bedrock AgentCore
    Page text preview: Amazon Bedrock AgentCore ...
    Result: PAGE LOADED SUCCESSFULLY
    
    TEST 2: Navigate to www.wikipedia.org (BLOCKED)
    Page title:
    Result: CHROME POLICY BLOCKED THIS URL

    Esse é o valor central das políticas Chrome: a restrição acontece no nível do navegador, independentemente do raciocínio ou das instruções de prompt do agente. Enquanto a célula é executada, é possível acompanhar o navegador ao vivo no console do Amazon Bedrock AgentCore.

    Como a gravação de sessão foi habilitada, também é possível reproduzir a sessão depois para observar a aplicação das políticas — com linha do tempo interativa, ações do usuário com timestamp e eventos de rede confirmando que apenas o tráfego permitido teve sucesso.

    Consulte o notebook de exemplo para o código completo.

    Parte 2: Certificados CA raiz personalizados

    Organizações que executam serviços internos com CAs privadas, ou roteiam tráfego por proxies corporativos que interceptam SSL, precisam que os agentes confiem nesses certificados não públicos. O AgentCore Browser e o AgentCore Code Interpreter suportam certificados CA raiz personalizados para esse propósito.

    Para demonstração, o tutorial usa https://untrusted-root.badssl.com, um site público que intencionalmente apresenta um certificado assinado por uma CA raiz não confiável. Conexões HTTPS a esse site falham com erros de validação de certificado — exatamente como ocorreria com serviços internos sem o CA raiz correto.

    O notebook executa três etapas:

    1. Armazenar o certificado CA raiz no AWS Secrets Manager: o certificado CA raiz não confiável do BadSSL está disponível publicamente (fonte: badssl.com/certs/ca-untrusted-root.crt). O notebook o salva no AWS Secrets Manager para que o Amazon Bedrock AgentCore possa importá-lo para o repositório de confiança de certificados.
    2. Demonstrar a falha sem o CA raiz: o notebook cria uma sessão padrão do AgentCore Code Interpreter e executa código Python que chama urllib.request.urlopen() contra o site não confiável. A conexão falha com um SSLCertVerificationError.
    3. Demonstrar o sucesso com o CA raiz: o notebook cria um AgentCore Code Interpreter personalizado que confia no certificado CA raiz do BadSSL usando o parâmetro certificates:
    from bedrock_agentcore.tools import CodeInterpreter, Certificate
    
    ci_client_with_ca = CodeInterpreter(REGION)
    response = ci_client_with_ca.create_code_interpreter(
        name="demo_rootca_interpreter",
        execution_role_arn=EXECUTION_ROLE_ARN,
        network_configuration={"networkMode": "PUBLIC"},
        certificates=[Certificate.from_secret_arn(secret_arn)],
    )

    Após executar o mesmo código urlopen() contra o interpretador personalizado, a saída mostra Status: 200. A conexão é bem-sucedida porque o CA raiz do BadSSL agora é confiável. Nenhuma alteração de código foi necessária — a confiança foi configurada no nível da infraestrutura.

    Consulte o notebook de exemplo para o código completo.

    Aplicando ao seu ambiente corporativo

    A demonstração com o badssl.com espelha dois cenários reais:

    • Serviços corporativos internos: armazene o certificado CA raiz da organização (aquele que assina certificados para o portal de RH, Jira, Artifactory e serviços similares) no AWS Secrets Manager e referencie o ARN do secret em certificates ao criar um navegador ou AgentCore Code Interpreter.
    • Proxies corporativos que interceptam SSL: armazene o certificado CA raiz do proxy (usado por Zscaler, Palo Alto Networks ou similares) no AWS Secrets Manager e referencie o ARN em certificates, combinando com as configurações de proxy.

    Os certificados CA raiz personalizados funcionam tanto com o AgentCore Browser quanto com o AgentCore Code Interpreter. No navegador, o certificado é importado para o repositório de confiança do Chrome. No interpretador, o serviço configura variáveis de ambiente como REQUESTS_CA_BUNDLE e SSL_CERT_FILE para que bibliotecas Python confiem na CA personalizada sem contornos no nível do código.

    É possível combinar certificados CA raiz com políticas Chrome em um único navegador. O exemplo a seguir cria um navegador conectado a uma Nuvem Privada Virtual (VPC) que confia em uma CA interna e restringe a navegação a uma intranet corporativa:

    from bedrock_agentcore.tools import BrowserClient, Certificate
    
    response = client.create_browser(
        name="internal_locked_down_browser",
        execution_role_arn=EXECUTION_ROLE_ARN,
        network_configuration={
            "networkMode": "VPC",
            "vpcConfig": {
                "securityGroups": ["sg-0123456789abcdef0"],
                "subnets": ["subnet-0123456789abcdef0"],
            }
        },
        enterprise_policies=[
            {
                "location": {
                    "s3": {
                        "bucket": "org-policies",
                        "prefix": "intranet-only-policy.json",
                    }
                },
                "type": "MANAGED",
            }
        ],
        certificates=[
            Certificate.from_secret_arn(
                "arn:aws:secretsmanager:us-west-2:123456789012:secret:corp-root-ca"
            )
        ],
    )

    Limpeza de recursos

    Para evitar cobranças, execute as células de limpeza ao final do notebook. Elas encerram as sessões de navegador ativas e excluem o navegador personalizado, o AgentCore Code Interpreter, a função IAM, o secret do Secrets Manager e o arquivo de política no S3. Sessões do Amazon Bedrock AgentCore Browser geram cobranças enquanto estão ativas. Para detalhes de preços, consulte a página de preços do Amazon Bedrock AgentCore.

    Próximos passos

    Para começar, crie um navegador com uma lista de permissão de URLs adaptada ao seu caso de uso. A lista de políticas Chrome Enterprise documenta mais de 450 configurações. Para agentes de entrada de dados que interagem com formulários sensíveis, considere desabilitar o preenchimento automático e o gerenciador de senhas. Para agentes que processam documentos em um portal específico, restrinja downloads e limite a navegação ao domínio desse portal.

    Se a organização usa infraestrutura de chave pública (PKI) privada, configure certificados CA raiz e teste a conectividade com os serviços internos. Para agentes que operam atrás de proxies que interceptam SSL, combine a configuração de CA raiz com o recurso de configuração de proxy para rotear o tráfego pelo proxy corporativo enquanto confia no seu certificado.

    Para mais informações sobre as capacidades do Amazon Bedrock AgentCore Browser, consulte a documentação do Amazon Bedrock AgentCore Browser. Para feedback, abra uma issue no repositório do Amazon Bedrock AgentCore Python SDK.

    Importante: o código de exemplo é destinado a desenvolvimento e demonstração. Para implantações em produção, siga o princípio do menor privilégio para permissões IAM, restrinja as políticas de bucket do Amazon S3 a entidades autorizadas, faça a rotação dos certificados do AWS Secrets Manager antes do vencimento e siga o pilar de segurança do AWS Well-Architected Framework.

    Fonte

    Control where your AI agents can browse with Chrome enterprise policies on Amazon Bedrock AgentCore (https://aws.amazon.com/blogs/machine-learning/control-where-your-ai-agents-can-browse-with-chrome-enterprise-policies-on-amazon-bedrock-agentcore/)

  • Agentes de voz em tempo real com Stream Vision Agents e Amazon Nova 2 Sonic

    O desafio de construir agentes de voz para produção

    Criar aplicações de voz com Inteligência Artificial (IA) que pareçam naturais e responsivas é um dos desafios de engenharia mais complexos no ecossistema de nuvem atual. Não basta conectar um modelo de linguagem a um microfone — é preciso orquestrar reconhecimento de fala, modelos de linguagem, síntese de voz e transporte de áudio em tempo real, tudo isso dentro de uma janela de poucos centenas de milissegundos para que a conversa flua de forma natural.

    Além do pipeline de IA em si, aplicações de voz em produção precisam lidar com conexões de rede instáveis, compatibilidade entre navegadores, timeouts de sessão e reconexão automática. Na prática, as equipes acabam gastando mais tempo construindo essa infraestrutura do que desenvolvendo as capacidades de IA em si.

    É exatamente esse problema que a solução apresentada pela AWS em parceria com a Stream busca resolver, combinando o framework Vision Agents com o Amazon Nova 2 Sonic via Amazon Bedrock.

    Os três componentes da solução

    A arquitetura proposta é composta por três peças principais que trabalham em conjunto:

    • Amazon Nova 2 Sonic: modelo de fundação do tipo fala-para-fala (speech-to-speech), disponível via Amazon Bedrock. Ele aceita áudio como entrada e produz áudio como saída, eliminando a necessidade de serviços separados de Reconhecimento Automático de Fala (STT — Speech-to-Text) e Síntese de Texto para Fala (TTS — Text-to-Speech). Oferece detecção nativa de turnos de conversa, streaming bidirecional em tempo real e chamada de funções (function calling).
    • Vision Agents (Stream): framework Python open-source para construir agentes de voz e vídeo em tempo real. Conta com arquitetura baseada em plugins, mais de 25 integrações, ferramentas de deploy para produção e SDKs de cliente para React, iOS, Android, Flutter e React Native.
    • Rede de borda (edge) da Stream: rede globalmente distribuída que entrega tempos de entrada tipicamente abaixo de 500ms e latência de áudio inferior a 30ms, funcionando como camada de transporte de mídia em tempo real entre clientes e o backend do agente.

    Como a arquitetura funciona

    O design do sistema é construído em torno de uma separação clara de responsabilidades: a infraestrutura da Stream cuida do transporte de mídia em tempo real e da conectividade com os clientes, enquanto o Amazon Nova Sonic roda na conta AWS do próprio cliente, mantendo dados sensíveis e lógica de negócio sob seu controle.

    Diagrama de arquitetura da solução com Stream Edge Network e conta AWS do cliente
    Imagem original — fonte: Aws

    O fluxo de mídia ponta a ponta funciona assim: o usuário se conecta via web ou mobile, e o áudio capturado pelo microfone é transmitido como Protocolo de Transporte em Tempo Real (RTP — Real-time Transport Protocol) sobre UDP até o nó de Unidade de Encaminhamento Seletivo (SFU — Selective Forwarding Unit) mais próximo da Stream. O SFU encerra a conexão WebRTC e repassa as faixas de áudio para o processo worker do Vision Agents, que decodifica o áudio para Modulação por Código de Pulso (PCM — Pulse Code Modulation) bruto e o transmite ao Amazon Nova 2 Sonic via API em tempo real do Bedrock. As respostas de áudio geradas pelo Nova Sonic percorrem o caminho inverso, chegando ao dispositivo do usuário com latência ponta a ponta tipicamente inferior a 500ms.

    A detecção de atividade de voz (VAD — Voice Activity Detection) roda no worker para identificar os limites da fala e eventos de interrupção (barge-in). O cancelamento de eco no navegador impede que o áudio do próprio agente redispare o VAD.

    Começando na prática

    Pré-requisitos

    Para começar, são necessários: credenciais AWS configuradas (via variáveis de ambiente, perfil da Interface de Linha de Comando (CLI — Command Line Interface) da AWS ou função IAM), uma conta Stream com chave e segredo da API de Áudio, Python 3.12 ou superior, o gerenciador de pacotes uv e o Vision Agents instalado.

    Passo 1: Criar o projeto e instalar as dependências

    mkdir voice-agent
    cd voice-agent
    uv init
    uv add "vision-agents[getstream,aws]" python-dotenv

    O extra vision-agents[aws] instala o plugin do Amazon Bedrock junto com suas dependências, incluindo boto3, aws-sdk-bedrock-runtime e o Silero VAD para detecção de atividade de voz.

    Passo 2: Configurar variáveis de ambiente

    Crie um arquivo .env na raiz do projeto. Para credenciais AWS, a recomendação é apontar para o perfil AWS via AWS_PROFILE, evitando armazenar chaves de acesso diretamente no arquivo.

    # Stream API credentials
    STREAM_API_KEY=test/geststream/api_key
    STREAM_API_SECRET=test/getstream/api_secret
    
    # AWS credentials
    AWS_PROFILE=your_aws_profile_name
    AWS_REGION=us-east-1

    Passo 3: Construir o primeiro agente de voz

    Com menos de 30 linhas de código Python, é possível ter um agente de voz totalmente funcional em tempo real, alimentado pelo Amazon Nova Sonic:

    import asyncio
    from dotenv import load_dotenv
    from vision_agents.core import Agent, User, Runner
    from vision_agents.core.agents import AgentLauncher
    from vision_agents.plugins import aws, getstream
    
    load_dotenv()
    
    async def create_agent(**kwargs) -> Agent:
        agent = Agent(
            edge=getstream.Edge(),
            agent_user=User(name="Helpful Assistant", id="agent"),
            instructions="You are a helpful voice assistant. Be concise and friendly.",
            llm=aws.Realtime(
                model="amazon.nova-2-sonic-v1:0",
                region_name="us-east-1",
                voice_id="matthew",
            ),
        )
        return agent
    
    async def join_call(agent: Agent, call_type: str, call_id: str, **kwargs) -> None:
        call = await agent.create_call(call_type, call_id)
        async with agent.join(call):
            await asyncio.sleep(2)
            await agent.llm.simple_response(
                text="Greet the user warmly and ask how you can help."
            )
        await agent.finish()
    
    # Run until the call ends
    if __name__ == "__main__":
        Runner(AgentLauncher(create_agent=create_agent, join_call=join_call)).cli()

    Passo 4: Executar o agente

    uv run main.py run

    Como funciona a integração com o Amazon Bedrock

    O Amazon Nova 2 Sonic utiliza uma API de streaming bidirecional orientada a eventos. Em vez do padrão requisição-resposta, essa abordagem permite que o áudio flua continuamente em ambas as direções de forma simultânea. O plugin AWS do Vision Agents gerencia essa complexidade por meio de uma sequência estruturada de eventos:

    • Inicialização da sessão: um evento sessionStart é enviado com a configuração de inferência (temperatura, máximo de tokens, top-p).
    • Configuração do prompt: um evento promptStart define o formato de saída de áudio (PCM a 24kHz), a voz selecionada e as definições de ferramentas.
    • Instruções do sistema: enviadas como bloco de conteúdo de texto com o papel SYSTEM.
    • Streaming de áudio: frames de áudio do microfone (~32ms cada) são transmitidos como eventos audioInput.
    • Streaming de resposta: o Nova Sonic retorna eventos audioOutput com a fala gerada.
    • Encerramento da sessão: eventos promptEnd e sessionEnd fecham a conexão de forma limpa.

    Cada bloco de conteúdo segue um padrão de três partes: contentStart → payload do conteúdo → contentEnd. Essa estrutura hierárquica permite que o modelo mantenha o contexto adequado ao longo da interação.

    Adicionando chamada de funções (function calling)

    Uma das capacidades mais relevantes do Amazon Nova 2 Sonic é a chamada de funções nativa durante conversas em tempo real. Isso permite que o agente de voz execute ações como consultar bancos de dados, chamar APIs e disparar fluxos de trabalho enquanto mantém uma conversa falada natural. O decorator @agent.llm.register_function é usado para definir as funções disponíveis ao modelo:

    import asyncio
    from dotenv import load_dotenv
    from typing import Dict, Any
    from vision_agents.core import Agent, User, Runner
    from vision_agents.core.agents import AgentLauncher
    from vision_agents.plugins import aws, getstream
    
    load_dotenv()
    
    async def create_agent(**kwargs) -> Agent:
        agent = Agent(
            edge=getstream.Edge(),
            agent_user=User(name="Weather Assistant", id="agent"),
            instructions="""You are a helpful weather assistant. When users ask about weather, use the get_weather function to fetch current conditions. You can also help with simple calculations.""",
            llm=aws.Realtime(
                model="amazon.nova-2-sonic-v1:0",
                region_name="us-east-1",
            ),
        )
    
        @agent.llm.register_function(
            name="get_weather",
            description="Get the current weather for a given city"
        )
        async def get_weather(location: str) -> Dict[str, Any]:
            # In production, call a real weather API
            return {
                "city": location,
                "temperature": 72,
                "condition": "Sunny",
                "humidity": "45%"
            }
    
        @agent.llm.register_function(
            name="calculate",
            description="Perform a mathematical calculation"
        )
        def calculate(operation: str, a: float, b: float) -> dict:
            operations = {
                "add": lambda x, y: x + y,
                "subtract": lambda x, y: x - y,
                "multiply": lambda x, y: x * y,
                "divide": lambda x, y: x / y if y != 0 else None,
            }
            result = operations.get(operation, lambda x, y: None)(a, b)
            return {"operation": operation, "a": a, "b": b, "result": result}
    
        return agent
    
    async def join_call(agent: Agent, call_type: str, call_id: str, **kwargs) -> None:
        await agent.create_user()
        call = await agent.create_call(call_type, call_id)
        async with agent.join(call):
            await asyncio.sleep(2)
            await agent.llm.simple_response(
                text="Greet the user and let them know you can check the weather."
            )
        await agent.finish()
    
    if __name__ == "__main__":
        Runner(AgentLauncher(create_agent=create_agent, join_call=join_call)).cli()

    Quando o modelo decide invocar uma função, o Nova 2 Sonic emite um evento toolUse com o nome da função e os argumentos. O plugin do Vision Agents intercepta esse evento, desserializa os argumentos, executa a função Python registrada e devolve o resultado via evento toolResult. O modelo então incorpora o resultado em sua resposta falada de forma natural.

    Integrações adicionais do plugin AWS

    Além do modo de fala-para-fala em tempo real, o plugin AWS do Vision Agents também oferece integração com modelos padrão via aws.LLM. Isso é útil para arquiteturas de pipeline customizadas que combinam um modelo do Amazon Bedrock com provedores separados de STT e TTS:

    from vision_agents.core import Agent, User
    from vision_agents.plugins import aws, getstream, cartesia, deepgram, smart_turn
    
    agent = Agent(
        edge=getstream.Edge(),
        agent_user=User(name="Custom Pipeline Agent"),
        instructions="Be helpful and concise.",
        llm=aws.LLM(
            model="anthropic.claude-3-haiku-20240307-v1:0",
            region_name="us-east-1"
        ),
        tts=cartesia.TTS(),
        stt=deepgram.STT(),
        turn_detection=smart_turn.TurnDetection(
            buffer_duration=2.0,
            confidence_threshold=0.5
        ),
    )

    Para síntese de voz em pipelines customizados, o plugin também inclui integração com o Amazon Polly via aws.TTS, com suporte a motores padrão e neural, entrada em Linguagem de Marcação de Síntese de Fala (SSML — Speech Synthesis Markup Language) para controle fino da fala, e múltiplos idiomas e vozes.

    Casos de uso relevantes

    Interfaces de voz em ambientes sem tela

    A combinação do Vision Agents com o Amazon Nova 2 Sonic é especialmente adequada para contextos onde os usuários não podem interagir com uma tela — como direção, serviços de campo, logística, saúde ou operações no local. Nesses cenários, a voz se torna a interface principal. O agente mantém o contexto ao longo da conversa, permitindo comandos de acompanhamento sem repetição de informações. Por exemplo, um motorista de entrega pode perguntar “Qual é minha próxima parada?”, receber as instruções faladas, dizer “Marcar a última entrega como concluída” e em seguida “Chamar o despachante”, tudo sem tocar na tela.

    Suporte telefônico de alto volume em escala

    O Vision Agents combinado ao Amazon Nova 2 Sonic também é projetado para lidar com grandes volumes de chamadas de suporte, onde agentes humanos se tornam um gargalo. Em horários de pico, centenas de clientes podem ligar com a mesma dúvida. Em vez de aguardar na fila, os chamadores são atendidos imediatamente por um agente de voz que consulta o status do pedido, explica o problema, oferece próximos passos e só encaminha para um agente humano quando necessário — transformando o sistema telefônico em uma camada de resolução contínua.

    Limpeza de recursos

    Para encerrar a chamada Stream e os processos do Vision Agent em execução:

    uv run main.py stop

    Importante: cobranças do Amazon Bedrock se aplicam a todas as chamadas de API ao Amazon Nova 2 Sonic. Sessões ativas podem continuar gerando custos até serem explicitamente encerradas.

    Para explorar mais

    O repositório do Vision Agents em https://github.com/GetStream/Vision-Agents é um bom ponto de partida, com exemplos adicionais, documentação de plugins e discussões da comunidade. Para detalhes de integração mais profundos, a documentação do plugin AWS está disponível em https://visionagents.ai/integrations/aws-bedrock. É possível criar uma conta de desenvolvedor Stream em https://getstream.io/ e começar a construir sem custo adicional.

    Fonte

    Real-time voice agents with Stream Vision Agents and Amazon Nova 2 Sonic (https://aws.amazon.com/blogs/machine-learning/real-time-voice-agents-with-stream-vision-agents-and-amazon-nova-2-sonic/)

  • De dados isolados a insights unificados: acesso cross-account ao Athena pelo Amazon QuickSight

    O problema dos dados em silos

    Grandes empresas raramente concentram todos os seus dados em uma única conta AWS. O cenário mais comum é justamente o oposto: uma instituição financeira, por exemplo, pode manter dados de banco de varejo em uma conta, investimentos em outra e gestão de riscos em uma terceira. Ao mesmo tempo, a área de BI (Business Intelligence) costuma operar de forma centralizada.

    Até agora, quem usava o Amazon Quick nesse tipo de ambiente tinha duas opções ruins: gerenciar múltiplas assinaturas do serviço — uma por conta de dados — ou absorver todos os custos de consulta na conta central, perdendo a visibilidade de gastos por unidade de negócio. A AWS acaba de resolver esse impasse com o lançamento do acesso cross-account ao Amazon Athena para o Amazon Quick.

    O que é o Amazon Quick e o papel do Athena

    O Amazon Quick é um serviço unificado de inteligência com IA que reúne dados estruturados e conteúdo corporativo não estruturado — documentos, e-mails, bases de conhecimento — em um único ambiente onde qualquer pessoa pode explorar, analisar e agir sobre as informações. Ele conta com mais de 40 integrações com aplicações e inclui o Amazon QuickSight, sua camada de BI com dashboards interativos, consultas em linguagem natural, relatórios e insights com ML (Machine Learning).

    O Amazon Athena, por sua vez, é um serviço de consulta interativa e serverless que analisa dados diretamente no Amazon Simple Storage Service (Amazon S3) usando SQL padrão, sem necessidade de gerenciar infraestrutura ou carregar dados previamente. Basta apontar o Athena para os dados no S3, definir o esquema via AWS Glue Data Catalog e começar a consultar.

    O novo recurso: acesso cross-account ao Athena

    Com o novo recurso anunciado pela AWS, é possível consultar dados do Athena em outras contas AWS diretamente a partir de uma implantação centralizada do Amazon Quick, usando encadeamento de funções IAM (Identity and Access Management). Os custos de consulta são cobrados na conta onde os dados residem — não na conta central.

    O mecanismo central é o role chaining (encadeamento de funções): o Amazon Quick, operando na conta central, assume uma primeira função IAM (Função A), que por sua vez assume uma segunda função IAM (Função B) na conta consumidora. É a Função B que executa as consultas no Athena e no AWS Glue Data Catalog, sem que credenciais de longo prazo sejam compartilhadas entre contas.

    Definições importantes

    • Conta Central do Quick (Source Account): conta AWS onde o Amazon Quick está implantado.
    • Conta Consumidora (Consumer Account): conta AWS onde residem os dados do Athena (bancos de dados, tabelas, dados no S3).
    • RunAsRole (Função A): função IAM na conta central que o Quick assume primeiro; não tem permissões de dados, apenas permissão para encadear na Função B.
    • Consumer Account Role (Função B): função IAM em cada conta consumidora que concede acesso ao Athena, AWS Glue e S3; confia na Função A.
    • Role Chaining: processo de credenciais em dois passos — o Quick assume a Função A, depois usa essas credenciais para assumir a Função B.
    • ExternalId: condição de segurança (definida como o ARN do DataSource) usada nas trust policies para prevenir ataques do tipo confused deputy.
    • Scope-Down Policy: política IAM inline aplicada em tempo de execução para restringir as credenciais encadeadas a assumir apenas a função consumidora específica.
    • Athena Workgroup: ambiente de execução do Athena na conta consumidora onde as consultas são executadas e os custos são rastreados.

    Arquitetura e padrões de implantação

    A AWS descreve três padrões arquiteturais que evoluem conforme a maturidade da organização.

    Padrão 1: Configuração básica com duas contas

    A configuração mais simples conecta uma conta central do Quick a uma única conta consumidora. É o ponto de partida ideal para validar o encadeamento de funções de ponta a ponta. A Função A, na conta central, encadeia na Função B via sts:AssumeRole, e o Athena executa a consulta com as credenciais da Função B.

    Padrão 2: Hub and Spoke

    A maioria das empresas centraliza o Quick em uma única conta (o hub) enquanto os dados ficam distribuídos por múltiplas contas de unidades de negócio (os spokes). Nesse modelo, a política de permissões da Função A lista os ARNs de múltiplas funções consumidoras, e uma fonte de dados separada é criada no Quick para cada conta.

    A grande vantagem desse padrão é a independência entre os spokes. Adicionar uma nova unidade de negócio exige apenas criar uma nova Função B na conta dessa unidade e registrar uma nova fonte de dados no Quick — sem alterar os spokes existentes. Cada spoke controla suas próprias permissões, definindo quais tabelas e prefixos S3 ficam visíveis para a conta central de BI. Os custos de consulta são atribuídos automaticamente a cada conta consumidora.

    Para escalar além de alguns poucos spokes, a AWS recomenda usar templates de AWS CloudFormation ou CDK para a configuração do lado consumidor, permitindo que equipes de unidades de negócio façam o onboarding de forma autônoma.

    Padrão 3: Data Mesh

    Em uma arquitetura de data mesh, produtores e consumidores são contas distintas. Uma conta produtora gerencia seus dados brutos e os disponibiliza para contas consumidoras — por exemplo, usando AWS Lake Formation com AWS RAM (Resource Access Manager) para compartilhar tabelas entre contas. A conta consumidora, contendo a Função B, o AWS Glue Data Catalog e o Athena workgroup, é o ponto ao qual o Amazon Quick se conecta via encadeamento de funções.

    Nesse modelo, um autor de BI no Quick pode consultar múltiplas contas consumidoras em um único dashboard, com custos atribuídos por conta consumidora. Em escala enterprise, uma única implantação do Amazon Quick pode se conectar a centenas de contas consumidoras.

    Como escolher o padrão certo

    A AWS recomenda começar com a configuração básica de duas contas para validar o encadeamento. A maioria das empresas evoluirá para o hub-and-spoke ao integrar novas unidades de negócio, pela simplicidade na atribuição de custos e na gestão de trust policies. Organizações com fortes limites de propriedade de dados e equipes de domínio dedicadas naturalmente migrarão para o data mesh.

    Passo a passo: configuração técnica

    Pré-requisitos

    • Amazon Quick Enterprise Edition ativo na conta central.
    • Acesso administrativo IAM em ambas as contas.
    • AWS CLI instalada e configurada com credenciais para ambas as contas, ou acesso ao Console de Gerenciamento AWS.
    • Familiaridade com conceitos IAM: trust policies, permission policies e assunção de funções (sts:AssumeRole).
    • Athena workgroup configurado na conta consumidora.
    • Bucket S3 na conta consumidora para resultados de consultas do Athena (geralmente com prefixo aws-athena-query-results-*).

    Etapa 1: Criar a Função A (RunAsRole) na conta central

    A Função A vive na conta central. O Amazon Quick a assume quando um usuário inicia uma consulta. Ela não tem permissões de dados — sua única função é encadear na conta consumidora. São necessários dois elementos: uma trust policy que permite ao serviço Quick assumi-la, e uma permission policy que permite assumir a Função B.

    Crie o arquivo role-a-trust-policy.json:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Service": "quicksight.amazonaws.com"
          },
          "Action": "sts:AssumeRole",
          "Condition": {
            "StringLike": {
              "aws:SourceAccount": "<Quick-account-id>",
              "aws:SourceArn": "arn:aws:quicksight:*:<Quick-account-id>:datasource/*"
            }
          }
        }
      ]
    }

    Crie a função via AWS CLI:

    aws iam create-role \
      --role-name qs-athena-cross-account-role-a \
      --assume-role-policy-document file://role-a-trust-policy.json" \
      --description "Quick Athena Cross Account - RunAsRole"

    Crie o arquivo role-a-permission-policy.json:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": "sts:AssumeRole",
          "Resource": "arn:aws:iam::<consumer-account-id>:role/<consumer-role-name>",
          "Condition": {
            "StringLike": {
              "sts:ExternalId": "arn:aws:quicksight:*:<Quick-account-id>:datasource/*"
            }
          }
        }
      ]
    }

    Anexe a política inline via AWS CLI:

    aws iam put-role-policy \
      --role-name qs-athena-cross-account-role-a \
      --policy-name AssumeConsumerRolePolicy \
      --policy-document file://role-a-permission-policy.json

    O principal IAM que criar a fonte de dados no Quick também precisa da permissão iam:PassRole sobre a Função A.

    Etapa 2: Criar a Função B na conta consumidora

    A Função B vive na conta consumidora, onde estão as tabelas do Athena, o AWS Glue Data Catalog e os dados no S3. A Função A a assume para executar as consultas.

    Crie o arquivo role-b-trust-policy.json:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "AWS": "arn:aws:iam::<Quick-account-id>:root"
          },
          "Action": "sts:AssumeRole",
          "Condition": {
            "StringLike": {
              "sts:ExternalId": "arn:aws:quicksight:*:<Quick-account-id>:datasource/*"
            }
          }
        }
      ]
    }

    Crie a função via AWS CLI:

    aws iam create-role \
      --role-name qs-athena-consumer-role \
      --assume-role-policy-document file://role-b-trust-policy.json \
      --description "Quick Athena Cross Account - Consumer Account Role"

    Crie o arquivo role-b-permission-policy.json com permissões para Athena, AWS Glue e S3. A AWS recomenda escopo para recursos específicos, não wildcards genéricos:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "athena:BatchGetQueryExecution",
            "athena:CancelQueryExecution",
            "athena:GetCatalogs",
            "athena:GetExecutionEngine",
            "athena:GetExecutionEngines",
            "athena:GetNamespace",
            "athena:GetNamespaces",
            "athena:GetQueryExecution",
            "athena:GetQueryExecutions",
            "athena:GetQueryResults",
            "athena:GetQueryResultsStream",
            "athena:GetTable",
            "athena:GetTables",
            "athena:ListQueryExecutions",
            "athena:RunQuery",
            "athena:StartQueryExecution",
            "athena:StopQueryExecution",
            "athena:ListWorkGroups",
            "athena:ListEngineVersions",
            "athena:GetWorkGroup",
            "athena:GetDataCatalog",
            "athena:GetDatabase",
            "athena:GetTableMetadata",
            "athena:ListDataCatalogs",
            "athena:ListDatabases",
            "athena:ListTableMetadata"
          ],
          "Resource": [
            "arn:aws:athena:<region>:<account-id>:workgroup/<your-workgroup>",
            "arn:aws:athena:<region>:<account-id>:datacatalog/<your-catalog>"
          ]
        },
        {
          "Effect": "Allow",
          "Action": [
            "glue:GetCatalog",
            "glue:GetCatalogs",
            "glue:GetDatabase",
            "glue:GetDatabases",
            "glue:GetTable",
            "glue:GetTables",
            "glue:GetPartition",
            "glue:GetPartitions",
            "glue:BatchGetPartition"
          ],
          "Resource": [
            "arn:aws:glue:<region>:<account-id>:catalog",
            "arn:aws:glue:<region>:<account-id>:database/<your-database>",
            "arn:aws:glue:<region>:<account-id>:table/<your-database>/*"
          ]
        },
        {
          "Effect": "Allow",
          "Action": [
            "s3:GetBucketLocation",
            "s3:GetObject",
            "s3:PutObject",
            "s3:AbortMultipartUpload",
            "s3:ListBucket",
            "s3:ListBucketMultipartUploads",
            "s3:ListMultipartUploadParts"
          ],
          "Resource": [
            "arn:aws:s3:::<your-data-bucket>",
            "arn:aws:s3:::<your-data-bucket>/*",
            "arn:aws:s3:::aws-athena-query-results-*",
            "arn:aws:s3:::aws-athena-query-results-*/*"
          ]
        }
      ]
    }

    Anexe a política inline via AWS CLI:

    aws iam put-role-policy \
      --role-name qs-athena-consumer-role \
      --policy-name AthenaGlueS3Access \
      --policy-document file://role-b-permission-policy.json

    Etapa 3: Criar a fonte de dados cross-account no Quick

    Com as funções configuradas, o próximo passo é criar a fonte de dados no Amazon Quick, na conta central. Isso pode ser feito via AWS CLI:

    aws quicksight create-data-source \
      --aws-account-id <Quick-account-id> \
      --data-source-id "athena-cross-account" \
      --name "Athena Cross Account - Consumer Data" \
      --type ATHENA \
      --data-source-parameters '{
        "AthenaParameters": {
          "WorkGroup": "primary",
          "RoleArn": "arn:aws:iam::<Quick-account-id>:role/qs-athena-cross-account-role-a",
          "ConsumerAccountRoleArn": "arn:aws:iam::<consumer-account-id>:role/qs-athena-consumer-role"
        }
      }' \
      --permissions '[{
        "Principal": "arn:aws:quicksight:<region>:<Quick-account-id>:user/default/<your-user>",
        "Actions": [
          "quicksight:DescribeDataSource",
          "quicksight:DescribeDataSourcePermissions",
          "quicksight:PassDataSource",
          "quicksight:UpdateDataSource",
          "quicksight:DeleteDataSource",
          "quicksight:UpdateDataSourcePermissions"
        ]
      }]' \
      --region <region>

    Ou via Python (Boto3):

    import boto3
    
    client = boto3.client('quicksight', region_name='us-east-1')
    
    response = client.create_data_source(
        AwsAccountId='<Quick-account-id>',
        DataSourceId='athena-cross-account',
        Name='Athena Cross Account - Consumer Data',
        Type='ATHENA',
        DataSourceParameters={
            'AthenaParameters': {
                'WorkGroup': 'primary',
                'RoleArn': 'arn:aws:iam::<Quick-account-id>:role/qs-athena-cross-account-role-a',
                'ConsumerAccountRoleArn': 'arn:aws:iam::<consumer-account-id>:role/qs-athena-consumer-role'
            }
        }
    )
    
    print(response['CreationStatus'])

    Para verificar se a fonte de dados foi criada com sucesso:

    aws quicksight describe-data-source \
      --aws-account-id <Quick-account-id> \
      --data-source-id "athena-cross-account" \
      --region <region> \
      --query 'DataSource.{Name:Name,Status:Status,Type:Type}'

    A saída esperada é:

    {
      "Name": "Athena Cross Account - Consumer Data",
      "Status": "CREATION_SUCCESSFUL",
      "Type": "ATHENA"
    }

    Etapa 4: Compartilhar a fonte de dados e criar datasets

    Com a fonte de dados ativa, ela pode ser compartilhada com autores do Quick usando o seguinte comando:

    aws quicksight update-data-source-permissions \
      --aws-account-id <Quick-account-id> \
      --data-source-id "athena-cross-account" \
      --grant-permissions '{
        "Principal": "arn:aws:quicksight:<region>:<Quick-account-id>:user/default/<author-user>",
        "Actions": [
          "quicksight:DescribeDataSource",
          "quicksight:DescribeDataSourcePermissions",
          "quicksight:PassDataSource"
        ]
      }' \
      --region <region>

    A partir daí, os autores podem acessar o Quick, navegar até Datasets, criar um novo dataset selecionando a fonte de dados cross-account e navegar pelos bancos de dados e tabelas AWS Glue da conta consumidora — tudo a partir da conta central, com os custos de consulta cobrados na conta consumidora.

    Conectando múltiplas contas consumidoras

    Para conectar contas consumidoras adicionais, basta repetir o processo de criação de funções para cada conta, atualizar a política de permissões da Função A para incluir o ARN da nova função consumidora, criar a Função B na nova conta com as políticas de trust e acesso a dados apropriadas, e criar uma nova fonte de dados no Quick com o novo ConsumerAccountRoleArn. Cada fonte de dados mapeia para uma conta consumidora.

    Segurança e atribuição de custos

    O modelo de segurança é construído em camadas. A condição ExternalId na trust policy da Função B previne ataques do tipo confused deputy — somente fontes de dados Quick da conta central autorizada conseguem completar o encadeamento. Além disso, o Quick aplica uma scope-down policy inline cada vez que assume a Função A, restringindo cada sessão a uma única função consumidora, mesmo quando a Função A tem permissões para múltiplas contas.

    A cadeia completa de funções é registrada no AWS CloudTrail em ambas as contas — desde o AssumeRole inicial na conta central até as consultas no Athena na conta consumidora. Isso fornece uma trilha de auditoria completa e suporta alertas sobre padrões anômalos.

    Quanto à atribuição de custos: como as consultas do Athena são executadas sob as credenciais da Função B na conta consumidora, todos os custos associados aparecem na fatura dessa conta. A conta central do Quick incorre apenas nos custos de sessão do Quick e armazenamento SPICE. Antes desse recurso, as organizações precisavam absorver todos os custos centralmente ou operar assinaturas separadas do Quick por unidade de negócio — o novo recurso elimina esse trade-off.

    O que isso significa para o futuro com IA agêntica

    À medida que capacidades de IA agêntica amadurecem, a habilidade de acessar dados onde eles residem — com governança, atribuição de custos e auditabilidade — se torna fundamental. O acesso cross-account ao Athena é um bloco de construção para esse futuro. O mesmo mecanismo de encadeamento de funções IAM pode ser estendido para agentes de IA que consultam o Athena em nome de usuários de negócio, aplicam regras de governança em tempo real e roteiam custos de computação para o proprietário dos dados — sem centralizar dados em uma única conta.

    Conclusão

    O acesso cross-account ao Athena para o Amazon Quick permite que empresas mantenham uma conta central de BI enquanto respeitam os limites de governança de dados e custos em ambientes multi-account. A abordagem de role chaining garante atribuição correta de custos, mantém a soberania de dados por unidade de negócio e se integra aos controles de segurança IAM existentes.

    Para começar, basta criar as funções IAM nas contas do Quick e consumidoras conforme descrito neste guia, e então criar a fonte de dados usando o parâmetro ConsumerAccountRoleArn. Mais detalhes estão disponíveis no Guia do Usuário do Amazon Quick.

    Fonte

    From siloed data to unified insights: Cross-account Athena Access for Amazon Quick (https://aws.amazon.com/blogs/machine-learning/from-siloed-data-to-unified-insights-cross-account-athena-access-for-amazon-quick/)