Salta ai contenuti

AgentCore Gateway ad Agent

Il generatore connection può registrare un agent (sia TypeScript che Python) come target di runtime AgentCore di un AgentCore Gateway generato con protocol: http.

Una volta connesso, il Gateway inoltra le richieste per l’agent sotto <gatewayUrl>/<targetName>/invocations, firmando il traffico in uscita verso il runtime con IAM SigV4. Questo fornisce ai tuoi agent un singolo punto di ingresso governato — e poiché i chiamanti devono solo raggiungere il Gateway, i runtime degli agent stessi possono essere distribuiti all’interno di un VPC dietro di esso.

Prima di utilizzare questo generatore, assicurati di avere:

  1. Un progetto agentcore-gateway generato con protocol: http
  2. Un componente agent (ts#agent o py#agent) creato con infra: agentcore. Funziona sia auth: iam (il Gateway lo invoca con il proprio ruolo) che auth: cognito (il Gateway inoltra il JWT del chiamante — vedi Inoltrare l’identità del chiamante al runtime).
  1. Installa il Nx Console VSCode Plugin se non l'hai già fatto
  2. Apri la console Nx in VSCode
  3. Clicca su Generate (UI) nella sezione "Common Nx Commands"
  4. Cerca @aws/nx-plugin - connection
  5. Compila i parametri richiesti
    • Clicca su Generate

    Seleziona il progetto Gateway come sorgente e il progetto agent come target. Se il progetto agent contiene più componenti, specifica targetComponent per disambiguare.

    ParametroTipoPredefinitoDescrizione
    sourceProject Obbligatoriostring-Il progetto sorgente
    targetProject Obbligatoriostring-Il progetto di destinazione a cui connettersi
    sourceComponent string-Il componente sorgente da cui connettersi (nome del componente, percorso relativo alla radice del progetto sorgente, o id del generatore). Usare '.' per selezionare esplicitamente il progetto come sorgente.
    targetComponent string-Il componente di destinazione a cui connettersi (nome del componente, percorso relativo alla radice del progetto di destinazione, o id del generatore). Usare '.' per selezionare esplicitamente il progetto come destinazione.
    preferInstallDependencies booleantrueSe preferire l'installazione delle dipendenze dopo l'esecuzione del generatore. Impostare su false per rimandare l'installazione quando si eseguono più generatori in batch (l'installazione viene comunque eseguita se necessaria affinché i generatori successivi possano calcolare il grafo dei progetti Nx); installare una volta alla fine.

    Il generatore collega i progetti esistenti insieme piuttosto che emettere nuovi file sorgente. I seguenti file vengono modificati:

    • Directorypackages/<gateway>
      • project.json il target dev del Gateway acquisisce una dipendenza dal <agent>-dev dell’agent
      • local-dev.ts ATTACHED_AGENTS aggiornato in modo che il gateway locale inoltri all’agent

    Il generatore non può collegare automaticamente il target agent nella tua infrastruttura perché non sa quale stack o modulo istanzia il Gateway. Aggiungi tu stesso una singola chiamata a gateway.addAgent(agent).

    Nello stack in cui istanzi il Gateway, registra l’agent come target:

    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);

    Per sovrascrivere il nome del target predefinito, passa gatewayTargetName:

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

    Il costrutto concede al ruolo di esecuzione del Gateway l’accesso di invocazione al runtime dell’agent e configura il target con il provider di credenziali GATEWAY_IAM_ROLE, in modo che il Gateway firmi le chiamate in uscita con il proprio ruolo.

    Le richieste a <gatewayUrl origin>/<targetName>/invocations vengono inoltrate al runtime dell’agent senza traduzione del protocollo, quindi i chiamanti utilizzano la stessa forma di richiesta che userebbero direttamente contro il runtime — stream SSE (AG-UI), streaming JSON (Python HTTP) e A2A JSON-RPC passano tutti attraverso il proxy. I chiamanti si autenticano con il Gateway (IAM SigV4 o Cognito JWT a seconda dell’auth del Gateway) piuttosto che con l’agent.

    Per connettere un sito web agli agent del Gateway, utilizza il generatore di connessione da sito web React ad AgentCore Gateway.

    Per impostazione predefinita, il Gateway firma le chiamate in uscita con il proprio ruolo IAM (il provider di credenziali GATEWAY_IAM_ROLE), quindi il runtime vede l’identità del Gateway, non quella del chiamante. Se invece vuoi che l’agent autorizzi in base al chiamante — ad esempio per leggere i claim sub o scope dell’utente — metti un agent Cognito dietro un Gateway Cognito. Il Gateway inoltra quindi il JWT del chiamante al runtime senza modifiche (il provider di credenziali JWT_PASSTHROUGH), e il runtime lo rivalidata.

    Genera entrambe le estremità con auth: cognito e collegale come sopra:

    • un agent (ts#agent o py#agent) creato con auth: cognito, e
    • un Gateway creato con auth: cognito che si trova davanti allo stesso user pool Cognito.

    Tutto il resto è automatico — gateway.addAgent(agent) (CDK) e il modulo runtime Terraform generato gestiscono il cablaggio per te in base all’auth dell’agent:

    • il target viene creato con il provider di credenziali JWT_PASSTHROUGH (anziché GATEWAY_IAM_ROLE), e
    • il runtime inserisce l’header Authorization nella allowlist in modo che il token inoltrato raggiunga il codice del tuo agent. Senza questa allowlist AgentCore valida il token ma rimuove l’header prima del tuo container.

    I chiamanti invocano il Gateway con Authorization: Bearer <jwt> (senza SigV4), e l’agent legge i claim dall’header Authorization — saltando la validazione della firma, poiché l’authorizer in ingresso del runtime ha già verificato il 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'], ...

    Eseguendo il Gateway localmente con:

    Terminal window
    pnpm nx dev <gateway-name>

    avvia un gateway locale più ogni agent collegato sulla sua porta locale assegnata. Il gateway locale inoltra i percorsi /<targetName>/... al server locale di ciascun agent, corrispondendo al routing basato su percorso del Gateway distribuito.