Ir al contenido

AgentCore Gateway a Agent

El generador connection puede registrar un agente (ya sea TypeScript o Python) como un destino de AgentCore Runtime de un AgentCore Gateway generado con protocol: http.

Una vez conectado, el Gateway redirige las solicitudes para el agente bajo <gatewayUrl>/<targetName>/invocations, firmando el tráfico saliente al runtime con IAM SigV4. Esto proporciona a tus agentes un único punto de entrada gobernado — y dado que los llamadores solo necesitan alcanzar el Gateway, los runtimes de agentes pueden ser desplegados dentro de una VPC detrás de él.

Antes de usar este generador, asegúrate de tener:

  1. Un proyecto agentcore-gateway generado con protocol: http
  2. Un componente de agente (ts#agent o py#agent) creado con infra: agentcore. Funciona tanto auth: iam (el Gateway lo invoca con su propio rol) como auth: cognito (el Gateway reenvía el JWT del llamador — consulta Reenvío de identidad del llamador).
Terminal window
pnpm nx g @aws/nx-plugin:connection
También puede realizar una ejecución en seco para ver qué archivos se cambiarían
Terminal window
pnpm nx g @aws/nx-plugin:connection --dry-run

Selecciona el proyecto Gateway como origen y el proyecto de agente como destino. Si el proyecto de agente contiene múltiples componentes, especifica targetComponent para desambiguar.

ParámetroTipoPredeterminadoDescripción
sourceProject Requeridostring-El proyecto de origen
targetProject Requeridostring-El proyecto de destino al que conectar
sourceComponent string-El componente de origen desde el que conectar (nombre del componente, ruta relativa a la raíz del proyecto de origen, o id del generador). Use '.' para seleccionar explícitamente el proyecto como origen.
targetComponent string-El componente de destino al que conectar (nombre del componente, ruta relativa a la raíz del proyecto de destino, o id del generador). Use '.' para seleccionar explícitamente el proyecto como destino.
preferInstallDependencies booleantrueSi se prefiere instalar las dependencias después de que se ejecute el generador. Establecer en false para diferir la instalación al ejecutar múltiples generadores en lote (la instalación aún se ejecuta si es necesario para que los generadores subsiguientes puedan calcular el grafo de proyectos de Nx); instalar una vez al final.

El generador conecta proyectos existentes en lugar de emitir nuevos archivos fuente. Los siguientes archivos se modifican:

  • Directoriopackages/<gateway>
    • project.json el destino dev del Gateway gana una dependencia en el <agent>-dev del agente
    • local-dev.ts ATTACHED_AGENTS actualizado para que el gateway local redirija al agente

El generador no puede conectar automáticamente el destino del agente en tu infraestructura porque no sabe qué stack o módulo instancia el Gateway. Agrega una única llamada a gateway.addAgent(agent) tú mismo.

En el stack donde instancias el Gateway, registra el agente como destino:

packages/infra/src/stacks/application-stack.ts
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/invocations
myGateway.addAgent(myAgent);

Para anular el nombre de destino predeterminado, pasa gatewayTargetName:

myGateway.addAgent(myAgent, { gatewayTargetName: 'my-target' });

El constructo otorga al rol de ejecución del Gateway acceso de invocación al runtime del agente y configura el destino con el proveedor de credenciales GATEWAY_IAM_ROLE, por lo que el Gateway firma las llamadas salientes con su propio rol.

Las solicitudes a <gatewayUrl origin>/<targetName>/invocations se reenvían al runtime del agente sin traducción de protocolo, por lo que los llamadores usan la misma forma de solicitud que usarían contra el runtime directamente — streams SSE (AG-UI), streaming JSON (Python HTTP) y A2A JSON-RPC todos se redirigen a través. Los llamadores se autentican con el Gateway (IAM SigV4 o Cognito JWT dependiendo del auth del Gateway) en lugar de con el agente.

Para conectar un sitio web a los agentes del Gateway, usa el generador connection.

Reenvío de identidad del llamador al runtime

Sección titulada «Reenvío de identidad del llamador al runtime»

Por defecto, el Gateway firma las llamadas salientes con su propio rol IAM (el proveedor de credenciales GATEWAY_IAM_ROLE), por lo que el runtime ve la identidad del Gateway, no la del llamador. Si en cambio quieres que el agente autorice sobre el llamador — por ejemplo para leer las reclamaciones sub o scope del usuario — coloca un agente Cognito detrás de un Gateway Cognito. El Gateway entonces reenvía el JWT del llamador al runtime sin cambios (el proveedor de credenciales JWT_PASSTHROUGH), y el runtime lo revalida.

Genera ambos extremos con auth: cognito y conéctalos como se indicó anteriormente:

  • un agente (ts#agent o py#agent) creado con auth: cognito, y
  • un Gateway creado con auth: cognito que coloca delante del mismo user pool de Cognito.

Todo lo demás es automático — gateway.addAgent(agent) (CDK) y el módulo de runtime Terraform generado manejan la conexión por ti basándose en el auth del agente:

  • el destino se crea con el proveedor de credenciales JWT_PASSTHROUGH (en lugar de GATEWAY_IAM_ROLE), y
  • el runtime incluye en la lista de permitidos el encabezado Authorization para que el token reenviado llegue a tu código de agente. Sin esta lista de permitidos, AgentCore valida el token pero elimina el encabezado antes de tu contenedor.

Los llamadores invocan el Gateway con Authorization: Bearer <jwt> (sin SigV4), y el agente lee las reclamaciones del encabezado Authorization — omitiendo la validación de firma, ya que el autorizador de entrada del runtime ya ha verificado el token:

packages/py_project/.../my_agent/main.py
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'], ...

Ejecutar el Gateway localmente con:

Terminal window
pnpm nx dev <gateway-name>

inicia un gateway local más cada agente adjunto en su puerto local asignado. El gateway local redirige las rutas /<targetName>/... al servidor local de cada agente, coincidiendo con el enrutamiento basado en rutas del Gateway desplegado.