AgentCore Gateway para Agent
O gerador connection pode registrar um agente (TypeScript ou Python) como um destino de Runtime do AgentCore de um AgentCore Gateway gerado com protocol: http.
Uma vez conectado, o Gateway faz proxy das requisições para o agente em <gatewayUrl>/<targetName>/invocations, assinando o tráfego de saída para o runtime com IAM SigV4. Isso fornece aos seus agentes um único ponto de entrada governado — e como os chamadores só precisam alcançar o Gateway, os runtimes dos agentes podem ser implantados dentro de uma VPC atrás dele.
Pré-requisitos
Seção intitulada “Pré-requisitos”Antes de usar este gerador, certifique-se de ter:
- Um projeto
agentcore-gatewaygerado comprotocol: http - Um componente de agente (
ts#agentoupy#agent) criado cominfra: agentcore. Tantoauth: iam(o Gateway o invoca com sua própria função) quantoauth: cognito(o Gateway encaminha o JWT do chamador — veja Encaminhando a identidade do chamador para o runtime) funcionam.
Executar o Gerador
Seção intitulada “Executar o Gerador”- Instale o Nx Console VSCode Plugin se ainda não o fez
- Abra o console Nx no VSCode
- Clique em
Generate (UI)na seção "Common Nx Commands" - Procure por
@aws/nx-plugin - connection - Preencha os parâmetros obrigatórios
- Clique em
Generate
pnpm nx g @aws/nx-plugin:connectionyarn nx g @aws/nx-plugin:connectionnpx nx g @aws/nx-plugin:connectionbunx nx g @aws/nx-plugin:connectionVocê também pode realizar uma execução simulada para ver quais arquivos seriam alterados
pnpm nx g @aws/nx-plugin:connection --dry-runyarn nx g @aws/nx-plugin:connection --dry-runnpx nx g @aws/nx-plugin:connection --dry-runbunx nx g @aws/nx-plugin:connection --dry-runSelecione o projeto Gateway como origem e o projeto do agente como destino. Se o projeto do agente contiver múltiplos componentes, especifique targetComponent para desambiguar.
| Parâmetro | Tipo | Padrão | Descrição |
|---|---|---|---|
| sourceProject Obrigatório | string | - | O projeto de origem |
| targetProject Obrigatório | string | - | O projeto de destino para conectar |
| sourceComponent | string | - | O componente de origem para conectar (nome do componente, caminho relativo à raiz do projeto de origem, ou id do gerador). Use '.' para selecionar explicitamente o projeto como origem. |
| targetComponent | string | - | O componente de destino para conectar (nome do componente, caminho relativo à raiz do projeto de destino, ou id do gerador). Use '.' para selecionar explicitamente o projeto como destino. |
| preferInstallDependencies | boolean | true | Se deve preferir instalar dependências após a execução do gerador. Defina como false para adiar a instalação ao executar múltiplos geradores em lote (uma instalação ainda é executada se necessário para que os geradores subsequentes possam calcular o grafo de projetos Nx); instale uma vez no final. |
Saída do Gerador
Seção intitulada “Saída do Gerador”O gerador conecta projetos existentes em vez de emitir novos arquivos de origem. Os seguintes arquivos são modificados:
Directorypackages/<gateway>
- project.json o destino
devdo Gateway ganha uma dependência no<agent>-devdo agente - local-dev.ts
ATTACHED_AGENTSatualizado para que o gateway local faça proxy para o agente
- project.json o destino
Adicionando o destino do agente à sua stack
Seção intitulada “Adicionando o destino do agente à sua stack”O gerador não pode conectar automaticamente o destino do agente à sua infraestrutura porque ele não sabe qual stack ou módulo instancia o Gateway. Adicione uma única chamada para gateway.addAgent(agent) você mesmo.
Na stack onde você instancia o Gateway, registre o agente como um destino:
const myAgent = new MyAgent(this, 'MyAgent');const myGateway = new MyGateway(this, 'MyGateway');
// Register the agent as a runtime target of the Gateway. The target name// defaults to the agent's `agentName` (its class name in kebab-case,// e.g. `MyAgent` -> `my-agent`), and forms the target's invocation path:// <gatewayUrl>/my-agent/invocationsmyGateway.addAgent(myAgent);Para substituir o nome de destino padrão, passe gatewayTargetName:
myGateway.addAgent(myAgent, { gatewayTargetName: 'my-target' });O construtor concede à função de execução do Gateway acesso de invocação ao runtime do agente e configura o destino com o provedor de credenciais GATEWAY_IAM_ROLE, para que o Gateway assine chamadas de saída com sua própria função.
No arquivo Terraform onde você instancia o Gateway, conecte o destino do agente:
module "my_agent" { source = "../../common/terraform/src/app/agents/my-agent" # ...}
module "my_gateway" { source = "../../common/terraform/src/app/gateways/my-gateway"
# The Gateway signs outbound calls to the runtime with its own role and # validates access at target creation, so it needs invoke access first. additional_iam_policy_statements = [ { Effect = "Allow" Action = [ "bedrock-agentcore:InvokeAgentRuntime", "bedrock-agentcore:InvokeAgentRuntimeWithWebSocketStream", # A2A targets additionally serve their agent card via the gateway "bedrock-agentcore:GetAgentCard", ] Resource = [ module.my_agent.agent_core_runtime_arn, "${module.my_agent.agent_core_runtime_arn}/*", ] } ]}
# Register the agent as a runtime target of the Gateway. The target name# forms the invocation path: <gatewayUrl>/my-agent/invocationsresource "aws_bedrockagentcore_gateway_target" "my_agent" { gateway_identifier = module.my_gateway.gateway_id name = "my-agent" # AgentCore fills in a description when none is set, which the provider # reports as an inconsistent result after apply — so always set one. description = "Agent runtime target my-agent"
target_configuration { http { agentcore_runtime { arn = module.my_agent.agent_core_runtime_arn } } }
credential_provider_configuration { gateway_iam_role {} }}Invocando o agente através do Gateway
Seção intitulada “Invocando o agente através do Gateway”Requisições para <gatewayUrl origin>/<targetName>/invocations são encaminhadas para o runtime do agente sem tradução de protocolo, então os chamadores usam a mesma forma de requisição que usariam diretamente contra o runtime — streams SSE (AG-UI), streaming JSON (Python HTTP) e A2A JSON-RPC todos fazem proxy. Os chamadores se autenticam com o Gateway (IAM SigV4 ou Cognito JWT dependendo do auth do Gateway) em vez de com o agente.
Para conectar um website aos agentes do Gateway, use o gerador connection.
Encaminhando a identidade do chamador para o runtime
Seção intitulada “Encaminhando a identidade do chamador para o runtime”Por padrão, o Gateway assina chamadas de saída com sua própria função IAM (o provedor de credenciais GATEWAY_IAM_ROLE), então o runtime vê a identidade do Gateway, não a do chamador. Se, em vez disso, você quiser que o agente autorize com base no chamador — por exemplo, para ler as claims sub ou scope do usuário — coloque um agente Cognito atrás de um Gateway Cognito. O Gateway então encaminha o JWT do chamador para o runtime sem alterações (o provedor de credenciais JWT_PASSTHROUGH), e o runtime o revalida.
Gere ambas as extremidades com auth: cognito e conecte-as como acima:
- um agente (
ts#agentoupy#agent) criado comauth: cognito, e - um Gateway criado com
auth: cognitofronteando o mesmo user pool do Cognito.
Todo o resto é automático — gateway.addAgent(agent) (CDK) e o módulo de runtime Terraform gerado cuidam da conexão para você com base no auth do agente:
- o destino é criado com o provedor de credenciais
JWT_PASSTHROUGH(em vez deGATEWAY_IAM_ROLE), e - o runtime coloca o cabeçalho
Authorizationna lista de permissões para que o token encaminhado chegue ao código do seu agente. Sem essa lista de permissões, o AgentCore valida o token mas remove o cabeçalho antes do seu contêiner.
Os chamadores invocam o Gateway com Authorization: Bearer <jwt> (sem SigV4), e o agente lê as claims do cabeçalho Authorization — pulando a validação de assinatura, já que o autorizador de entrada do runtime já verificou o token:
import jwt # PyJWT
@app.post('/invocations')async def invoke(input: InvokeInput, request: Request): token = request.headers['authorization'].removeprefix('Bearer ') claims = jwt.decode(token, options={'verify_signature': False}) # authorize on claims['sub'], claims['scope'], ...Desenvolvimento Local
Seção intitulada “Desenvolvimento Local”Executar o Gateway localmente com:
pnpm nx dev <gateway-name>yarn nx dev <gateway-name>npx nx dev <gateway-name>bunx nx dev <gateway-name>inicia um gateway local mais cada agente anexado em sua porta local atribuída. O gateway local faz proxy dos caminhos /<targetName>/... para o servidor local de cada agente, correspondendo ao roteamento baseado em caminho do Gateway implantado.