View a markdown version of this page

Conchiglie interattive (terminali) - Amazon Bedrock AgentCore

Conchiglie interattive (terminali)

L'InvokeAgentRuntimeCommandShelloperazione apre una sessione terminale persistente e interattiva all'interno di una sessione di AgentCore Runtime in esecuzione. WebSocket A differenza dell'esecuzione dei comandi in un colpo solo, le sessioni di shell mantengono lo stato: le variabili di ambiente, la directory di lavoro e la cronologia dei comandi vengono trasferite tra gli input. Ciò consente il debug, l'ispezione dell'ambiente e la creazione di esperienze terminali nell'applicazione.

Per chiamareInvokeAgentRuntimeCommandShell, sono necessarie le autorizzazioni. bedrock-agentcore:InvokeAgentRuntimeCommandShell

Come funziona

InvokeAgentRuntimeCommandShellstabilisce una WebSocket connessione a un processo shell interattivo in esecuzione all'interno della sessione dell'agente. La connessione utilizza frame binari per trasmettere l'input e l'output del terminale in entrambe le direzioni.

Stesso agente, stessa sessione

InvokeAgentRuntimeCommandShellopera sullo stesso runtime dell'agente di InvokeAgentRuntime eInvokeAgentRuntimeCommand. Non si creano risorse separate. L'agente con cui hai distribuito CreateAgentRuntime accetta connessioni shell in qualsiasi sessione attiva.

Nota

Puoi passare session_id a come target una sessione di runtime specifica. Se omesso, viene creata una nuova sessione per ogni connessione. Per utilizzare la riconnessione, è necessario archiviare e riutilizzare sia e. session_id shellId

La connessione supporta:

Funzionalità Description

Stato persistente

Le variabili di ambiente, la directory di lavoro e la cronologia dei comandi vengono trasferite tra gli input all'interno della stessa sessione.

Riconnessione

Fornire lo stesso session_id e riconnettersi shellId alla stessa shell dopo una disconnessione. Il servizio riproduce fino a 256 KB di output bufferizzato.

Più shell simultanee

Fino a 10 sessioni di shell attive (terminali) per runtime. Le nuove connessioni vengono rifiutate quando sono al massimo.

Prerequisiti

  • Autorizzazione IAM bedrock-agentcore:InvokeAgentRuntimeCommandShell

  • Un ARN AgentCore di endpoint Runtime valido con un runtime in stato READY

Nota

Gli agenti creati dopo il 5 giugno 2026 supportano automaticamente le shell interattive (terminali). Se l'agente è stato distribuito prima di questa data, è necessario ridistribuirlo per aggiornare il runtime dell'agente.

Utilizzo della AgentCore CLI

Per istruzioni di installazione e configurazione, consulta Introduzione a AgentCore Runtime using the CLI.

La CLI offre un'esperienza terminale integrata con. agentcore exec

agentcore exec --it

Per connettersi a un runtime specifico:

agentcore exec --it --runtime <runtime-arn> --region us-west-2

Ctrl+]Premete per staccarvi da un guscio senza chiuderlo. La CLI stampa un comando di riconnessione:

agentcore exec --it \ --runtime <arn> \ --region <region> \ --session-id <uuid> \ --shell-id <id>

Per i comandi one-shot, ometti: --it

agentcore exec "ls -la /tmp"

Per un output leggibile dalla macchina, usa la modalità JSON:

agentcore exec --json "echo hello" # Output: {"success":true,"exitCode":0,"stdout":"hello\n","stderr":""}

Per ulteriori esempi di CLI, consulta AgentCore gli esempi su. GitHub

Utilizzo dell'SDK AgentCore

Installa l'SDK Python:

pip install bedrock-agentcore
Esempio
SigV4 (default)
  1. L'esempio seguente mostra come aprire una sessione di shell utilizzando credenziali predefinite AWS .

    import asyncio from bedrock_agentcore.runtime import AgentCoreRuntimeClient, ShellChannel async def main(): runtime_arn = "arn:aws:bedrock-agentcore:us-west-2:123456789012:runtime/my-agent" client = AgentCoreRuntimeClient(region="us-west-2") async with client.open_shell(runtime_arn) as shell: print(f"Connected. Shell ID: {shell.shell_id}") # Send a command await shell.send("echo Hello from AgentCore Shell\n") # Read output frames async for frame in shell: if frame.channel == ShellChannel.STDOUT: print(frame.text, end="") if "Hello from AgentCore Shell" in frame.text: break asyncio.run(main())
Pre-signed URL
  1. L'esempio seguente mostra come aprire una sessione di shell utilizzando un URL prefirmato.

    import asyncio from bedrock_agentcore.runtime import AgentCoreRuntimeClient, PresignedAuth, ShellChannel async def main(): runtime_arn = "arn:aws:bedrock-agentcore:us-west-2:123456789012:runtime/my-agent" client = AgentCoreRuntimeClient(region="us-west-2") async with client.open_shell(runtime_arn, auth=PresignedAuth(expires=120)) as shell: await shell.send("whoami\n") async for frame in shell: if frame.channel == ShellChannel.STDOUT: print(frame.text, end="") break asyncio.run(main())
OAuth
  1. L'esempio seguente mostra come aprire una sessione di shell utilizzando un token portatore OAuth.

    import asyncio from bedrock_agentcore.runtime import AgentCoreRuntimeClient, OAuthAuth, ShellChannel async def main(): runtime_arn = "arn:aws:bedrock-agentcore:us-west-2:123456789012:runtime/my-agent" bearer_token = "your_oauth_token_here" client = AgentCoreRuntimeClient(region="us-west-2") async with client.open_shell(runtime_arn, auth=OAuthAuth(bearer_token=bearer_token)) as shell: await shell.send("echo oauth-connected\n") async for frame in shell: if frame.channel == ShellChannel.STDOUT: print(frame.text, end="") if "oauth-connected" in frame.text: break asyncio.run(main())

Riconnessione

Uno schema comune è quello di riconnettersi shellId a una shell dopo una disconnessione, preservando tutto lo stato della sessione.

import asyncio from bedrock_agentcore.runtime import AgentCoreRuntimeClient async def main(): client = AgentCoreRuntimeClient(region="us-west-2") runtime_arn = "arn:aws:bedrock-agentcore:us-west-2:123456789012:runtime/my-agent" session_id = "my-session-0000000000000000000000" shell_id = "my-shell" shell = await client.open_shell( runtime_arn, session_id=session_id, shell_id=shell_id, ).__aenter__() print(f"connected (reconnected={shell.reconnected})") await shell.send("export GREETING='hello'\n") await asyncio.sleep(1) async with client.open_shell( runtime_arn, session_id=session_id, shell_id=shell_id, ) as shell2: print(f"reconnected (reconnected={shell2.reconnected})") assert shell2.reconnected if __name__ == "__main__": asyncio.run(main())

Auto-reconnect

L'SDK può anche riconnettersi automaticamente quando la connessione si interrompe. WebSocket Usa per ReconnectConfig abilitare questa operazione:

import asyncio from bedrock_agentcore.runtime import AgentCoreRuntimeClient, ReconnectConfig, ShellChannel async def on_reconnect(reconnected: bool): print(f"Reconnected: {reconnected}") async def main(): runtime_arn = "arn:aws:bedrock-agentcore:us-west-2:123456789012:runtime/my-agent" shell_id = "my-persistent-shell" config = ReconnectConfig(max_retries=5, base_delay=0.5, on_reconnect=on_reconnect) client = AgentCoreRuntimeClient(region="us-west-2") async with client.open_shell(runtime_arn, shell_id=shell_id, reconnect_config=config) as shell: # If the connection drops, the SDK retries automatically await shell.send("long-running-command\n") async for frame in shell: if frame.channel == ShellChannel.STDOUT: print(frame.text, end="") asyncio.run(main())

Per ulteriori esempi di SDK, consulta gli AgentCore esempi su GitHub.

Casi di utilizzo comune

Debug interattivo

Apri una shell per ispezionare l'ambiente di runtime del tuo agente: controlla i pacchetti installati, leggi i file di registro, esamina il filesystem o testa i comandi prima di aggiungerli al codice dell'agente.

python --version && pip list | head -20
Ispezione dell'ambiente

Verifica le variabili di ambiente, la connettività di rete, gli strumenti disponibili e lo stato del file system. Utile per diagnosticare i guasti degli agenti o convalidare la configurazione di distribuzione.

env | grep AWS && curl -s http://169.254.169.254/latest/meta-data/
Accesso al terminale dell'agente di codifica

Gli agenti di codifica AI utilizzano shell interattive (terminali) come ambiente di esecuzione. Quando un agente di codifica deve eseguire codice, installare pacchetti o eseguire test, apre una sessione di shell sul AgentCore Runtime ed esegue direttamente i comandi, allo stesso modo in cui uno sviluppatore utilizzerebbe un terminale. Ad esempio, Claude Code, Amazon Kiro e OpenAI Codex si connettono ciascuno a una sessione di shell in cui possono scrivere codice in modo iterativo, eseguirlo, osservare l'output e correggere gli errori in un ciclo. Lo stato persistente significa che l'agente può eseguire una sequenza di comandi senza perdere il contesto tra i passaggi.

# A coding agent opens a shell and iterates on code async with client.open_shell(runtime_arn, shell_id="agent-workspace") as shell: await shell.send("cd /workspace && git clone https://github.com/user/repo.git\n") await shell.send("cd repo && pip install -r requirements.txt\n") await shell.send("python -m pytest tests/ -v\n") # Agent reads test output, fixes failures, re-runs — all in the same shell
Long-running processi

Avvia processi che sopravvivono a una singola richiesta HTTP. Utilizza la riconnessione per verificare lo stato di avanzamento o fornire input aggiuntivi nel tempo.

nohup python train.py > /tmp/train.log 2>&1 &

Scelte di progettazione chiave

Sessioni interattive persistenti

Ogni connessione è mappata a un processo shell di lunga durata. È possibile inviare più comandi senza ristabilire la connessione e lo stato accumulato dai comandi precedenti (variabili esportate, cd modifiche) è disponibile per quelli successivi.

Inquadratura binaria finita WebSocket

I/O Il terminale viene trasmesso in streaming come frame binari WebSocket . Ciò supporta sequenze di controllo del terminale non elaborate, colori, movimento del cursore e applicazioni a schermo intero senza sovraccarico di codifica.

Riconnessione con replay in uscita

Quando ci si riconnette utilizzando lo stessoshellId, il servizio riproduce fino a 256 KB di output recente. In questo modo è possibile ripristinare le interruzioni di rete senza perdere il contesto. Il processo della shell continua a funzionare durante la disconnessione.

Limite di sessione

Quando 10 sessioni di shell (terminali) sono già aperte in un runtime, le nuove connessioni vengono rifiutate con un errore. È necessario chiudere una sessione esistente prima di aprirne una nuova.

Considerazioni relative alla sicurezza

Suggerimento

Per una visione consolidata di tutti i consigli sulla sicurezza di Runtime, consulta le migliori pratiche di sicurezza per AgentCore Runtime.

Importante

Secondo il modello di responsabilità AWS condivisa, sei responsabile dei comandi che esegui nelle sessioni di AgentCore Runtime. AWS fornisce l'infrastruttura sicura e l'isolamento a livello di microVM. Sei responsabile dei comandi che esegui, dei dati che elabori e dei controlli di accesso che configuri.

Il limite di sicurezza per le sessioni di shell (terminali) è la microVM. Ogni sessione AgentCore di Runtime viene eseguita in una microVM isolata con kernel, memoria e filesystem propri. Le sessioni di shell non possono accedere ai carichi di lavoro degli altri clienti o sfuggire ai limiti delle macchine virtuali. Tuttavia, all'interno della macchina virtuale, i comandi della shell hanno pieno accesso al filesystem del contenitore e a tutte le credenziali o i segreti configurati.

Controllo con log CloudWatch

AgentCore Runtime invia l'ID della richiesta e i metadati di connessione al gruppo di log Amazon CloudWatch Logs del tuo agente. Puoi utilizzare questi log per monitorare l'attività di connessione alla shell e mantenere un audit trail. I/O Il contenuto del terminale (stdin/stdout) viene trasmesso in streaming al client e non viene registrato dal servizio.

Controllo con CloudTrail

AWS CloudTrail registra le chiamate InvokeAgentRuntimeCommandShell API nel tuo account. Ogni record include metadati come l'identità del chiamante, il timestamp, l'indirizzo IP di origine e lo stato della risposta. CloudTrail non registra il payload della richiesta o della risposta. Viene utilizzato CloudTrail per verificare chi ha aperto le sessioni di shell e quando, quindi correlato ai CloudWatch registri utilizzando l'ID della richiesta per i dettagli di connessione.

Per i carichi di lavoro sensibili, prendi in considerazione l'implementazione di controlli aggiuntivi come:

  • Utilizzo delle policy IAM per limitare le chiamate da parte dei principali InvokeAgentRuntimeCommandShell

  • Configurazione degli endpoint VPC per mantenere il traffico all'interno della rete

  • Configurazione di CloudWatch Logs, filtri metrici e allarmi per rilevare schemi di connessione imprevisti

  • Rivedere regolarmente CloudTrail i log per verificare la presenza di tentativi di accesso non autorizzati

Gestione degli errori

Quando si stabilisce una connessione alla sessione di shell, è possibile che si verifichino i seguenti errori durante l' WebSocket aggiornamento:

ValidationException

Si verifica quando i parametri della richiesta non sono validi. Ciò può accadere se l'ID di sessione è inferiore a 33 caratteri, la funzionalità non è abilitata nell'area di destinazione o l'agente non è nello stato READY.

AccessDeniedException

Si verifica quando non si dispone delle autorizzazioni necessarie. Assicurati che la tua policy IAM includa l'bedrock-agentcore:InvokeAgentRuntimeCommandShellautorizzazione.

ResourceNotFoundException

Si verifica quando non è possibile trovare il runtime dell'agente specificato. Verificate che l'ARN del runtime sia corretto.

RuntimeClientError (424)

Si verifica in diversi scenari: (1) È stato raggiunto il numero massimo di sessioni di shell simultanee (terminali) (10 aperte): chiudere una sessione esistente e riprovare. (2) Formato Shell ID non valido: deve contenere da 1 a 128 caratteri alfanumerici, caratteri di sottolineatura o trattini. (3) Runtime irraggiungibile: riprova dopo il backoff. Analizza il campo error JSON del corpo della risposta per distinguere le cause.

ThrottlingException

Si verifica quando si supera il limite di velocità dell'API. Implementa la logica esponenziale di backoff e riprova.

ConflictException

Un'altra connessione rivendica la stessa cosa contemporaneamente. shellId Riprova dopo 1 secondo. Questa è una condizione di gara ristretta (non uno stato persistente) e si risolve immediatamente in caso di nuovo tentativo.

Una volta effettuata la connessione, i seguenti codici di chiusura indicano il motivo per cui una connessione è stata interrotta:

Codice Significato Azione del client

1000

Chiusura normale: la scocca è uscita pulita o si è disconnessa delicatamente

Display «disconnesso». Terminazione normale.

1001

Interruzione: installazione o spegnimento del server

Auto-reconnect con memorizzato. shellId

1003

Dati non supportati: inviati dopo 5 frame di testo consecutivi (protocollo solo binario)

NON riconnettersi automaticamente. Passa ai frame binari.

1006

Chiusura anomala: sintetizzata localmente quando non viene ricevuto alcun frame chiuso (interruzione della rete, TCP RST)

Auto-reconnect con shellId memorizzato.

1008

Violazione delle norme: TTL della connessione scaduto (1 ora), limite di frame rate superato (250 frames/sec) o sovraccarico del buffer di scrittura

Auto-reconnect per la scadenza TTL (nuovo TTL alla riconnessione). Per il limite di velocità: arretrare, quindi riconnettersi.

1009

Messaggio troppo grande: il payload del frame ha superato i 64 KB

Riduci la dimensione del frame (blocco a <64 KB), quindi riconnettiti. La sessione è ancora attiva.

1011

Errore del server: errore interno imprevisto

Riprova con backoff.

4000

Sostituito: un altro client connesso allo stesso shellId

NON riconnettersi automaticamente. Visualizza «sessione allegata da un altro client».

Best practice

Segui queste best practice quando usiInvokeAgentRuntimeCommandShell:

  • Utilizzate un codice univoco shellId (ad esempio un UUID) per ogni sessione logica per abilitare la riconnessione. Archivia il file shellId sul lato client.

  • Utilizzalo ReconnectConfig nell'SDK per gestire automaticamente le interruzioni transitorie della rete senza logica di riconnessione manuale.

  • Leggi prontamente i frame di output. Se il client rimane indietro, il buffer di scrittura del server si riempie e la connessione si chiude con il codice. 1008

  • Per input di grandi dimensioni (come incollare un file), suddividi il contenuto in blocchi inferiori a 64 KB per frame per evitare la chiusura del codice. 1009

  • Imposta i timeout di connessione appropriati. La durata massima della connessione è di 1 ora: riconnettiti con la stessa shellId per continuare oltre.

  • Al termine, chiudi le sessioni in modo esplicito. Le sessioni separate vengono conteggiate ai fini del limite di 10 sessioni.

Quote e limiti

Limite Valore Description

Dimensione massima del payload del frame

64 KB

I frame che superano questo limite generano un codice chiuso. 1009

Frequenza fotogrammi

250 frames/sec

Il superamento di questo valore attiva il codice di chiusura. 1008

Durata massima di una connessione

1 ora

La connessione si chiude con il codice. 1008 Riconnettiti usando lo stesso shellId per continuare.

Sessioni di shell simultanee (terminali) per runtime

10

Le nuove connessioni vengono rifiutate se sono già aperte 10 sessioni. Chiudi una sessione esistente e riprova.

Buffer di riconnessione

256 KB

Uscita massima riprodotta quando ci si riconnette a una shell.

Per i limiti completi del servizio, consulta Quotas for Amazon AgentCore Bedrock.