AgentCore Gateway a Agent
El generador connection puede registrar un agente (ya sea TypeScript o Python) como un destino de tiempo de ejecución de AgentCore 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 tiempo de ejecución 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 tiempos de ejecución de los agentes pueden ser desplegados dentro de una VPC detrás de él.
Requisitos previos
Sección titulada «Requisitos previos»Antes de usar este generador, asegúrate de tener:
- Un proyecto
agentcore-gatewaygenerado conprotocol: http - Un componente de agente (
ts#agentopy#agent) creado coninfra: agentcore. Funciona tantoauth: iam(el Gateway lo invoca con su propio rol) comoauth: cognito(el Gateway reenvía el JWT del llamador — ver Reenvío de identidad del llamador al tiempo de ejecución).
Ejecutar el generador
Sección titulada «Ejecutar el generador»- Instale el Nx Console VSCode Plugin si aún no lo ha hecho
- Abra la consola Nx en VSCode
- Haga clic en
Generate (UI)en la sección "Common Nx Commands" - Busque
@aws/nx-plugin - connection - Complete los parámetros requeridos
- Haga clic en
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:connectionTambién puede realizar una ejecución en seco para ver qué archivos se cambiarían
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-runSelecciona el proyecto Gateway como origen y el proyecto del agente como destino. Si el proyecto del agente contiene múltiples componentes, especifica targetComponent para desambiguar.
Opciones
Sección titulada «Opciones»| Parámetro | Tipo | Predeterminado | Descripción |
|---|---|---|---|
| sourceProject Requerido | string | - | El proyecto de origen |
| targetProject Requerido | string | - | 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 | boolean | true | Si 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. |
Salida del generador
Sección titulada «Salida del generador»El generador conecta proyectos existentes en lugar de emitir nuevos archivos fuente. Los siguientes archivos son modificados:
Directoriopackages/<gateway>
- project.json el destino
devdel Gateway gana una dependencia en el<agent>-devdel agente - local-dev.ts
ATTACHED_AGENTSactualizado para que el gateway local redirija al agente
- project.json el destino
Agregar el destino del agente a tu stack
Sección titulada «Agregar el destino del agente a tu stack»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 un 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 sobrescribir 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 tiempo de ejecución 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.
En el archivo Terraform donde instancias el Gateway, conecta el destino del 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 {} }}Invocar el agente a través del Gateway
Sección titulada «Invocar el agente a través del Gateway»Las solicitudes a <gatewayUrl origin>/<targetName>/invocations se reenvían al tiempo de ejecución del agente sin traducción de protocolo, por lo que los llamadores usan la misma forma de solicitud que usarían contra el tiempo de ejecución 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 de conexión de sitio web React a AgentCore Gateway.
Reenvío de identidad del llamador al tiempo de ejecución
Sección titulada «Reenvío de identidad del llamador al tiempo de ejecución»Por defecto, el Gateway firma las llamadas salientes con su propio rol de IAM (el proveedor de credenciales GATEWAY_IAM_ROLE), por lo que el tiempo de ejecución ve la identidad del Gateway, no la del llamador. Si en cambio deseas que el agente autorice en función del llamador — por ejemplo, para leer las reclamaciones sub o scope del usuario — antepón un Gateway Cognito a un agente Cognito. El Gateway entonces reenvía el JWT del llamador al tiempo de ejecución sin cambios (el proveedor de credenciales JWT_PASSTHROUGH), y el tiempo de ejecución lo revalida.
Genera ambos extremos con auth: cognito y conéctalos como se indicó anteriormente:
- un agente (
ts#agentopy#agent) creado conauth: cognito, y - un Gateway creado con
auth: cognitoque frontaliza el mismo grupo de usuarios de Cognito.
Todo lo demás es automático — gateway.addAgent(agent) (CDK) y el módulo de tiempo de ejecución de Terraform generado manejan el cableado por ti según el auth del agente:
- el destino se crea con el proveedor de credenciales
JWT_PASSTHROUGH(en lugar deGATEWAY_IAM_ROLE), y - el tiempo de ejecución incluye en la lista permitida el encabezado
Authorizationpara que el token reenviado llegue a tu código de agente. Sin esta lista permitida, 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 tiempo de ejecución ya ha verificado el 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'], ...Desarrollo local
Sección titulada «Desarrollo local»Ejecutar el Gateway localmente con:
pnpm nx dev <gateway-name>yarn nx dev <gateway-name>npx nx dev <gateway-name>bunx 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.