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 |
|
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.
Utilizzo dell'SDK AgentCore
Installa l'SDK Python:
pip install bedrock-agentcore
Esempio
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
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,
cdmodifiche) è 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 stesso
shellId, 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
errorJSON 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.
shellIdRiprova 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 |
|---|---|---|
|
|
Chiusura normale: la scocca è uscita pulita o si è disconnessa delicatamente |
Display «disconnesso». Terminazione normale. |
|
|
Interruzione: installazione o spegnimento del server |
Auto-reconnect con memorizzato. |
|
|
Dati non supportati: inviati dopo 5 frame di testo consecutivi (protocollo solo binario) |
NON riconnettersi automaticamente. Passa ai frame binari. |
|
|
Chiusura anomala: sintetizzata localmente quando non viene ricevuto alcun frame chiuso (interruzione della rete, TCP RST) |
Auto-reconnect con |
|
|
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. |
|
|
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. |
|
|
Errore del server: errore interno imprevisto |
Riprova con backoff. |
|
|
Sostituito: un altro client connesso allo stesso |
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 fileshellIdsul lato client. -
Utilizzalo
ReconnectConfignell'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
shellIdper 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. |
|
Frequenza fotogrammi |
250 frames/sec |
Il superamento di questo valore attiva il codice di chiusura. |
|
Durata massima di una connessione |
1 ora |
La connessione si chiude con il codice. |
|
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.