View a markdown version of this page

Esegui comandi shell nelle sessioni AgentCore di Runtime - Amazon Bedrock AgentCore

Esegui comandi shell nelle sessioni AgentCore di Runtime

L'InvokeAgentRuntimeCommandoperazione consente di eseguire i comandi della shell direttamente all'interno di una sessione AgentCore di Runtime in esecuzione e di trasmettere nuovamente l'output HTTP/2. I comandi vengono eseguiti nello stesso contenitore, filesystem e ambiente dell'agente, la stessa sessione utilizzata da. InvokeAgentRuntime Ciò abilita flussi di lavoro in cui l'applicazione utilizza l'agente per attività di ragionamento e comandi per operazioni deterministiche come l'esecuzione di test, le operazioni git o la configurazione dell'ambiente.

Per chiamareInvokeAgentRuntimeCommand, sono necessarie le autorizzazioni. bedrock-agentcore:InvokeAgentRuntimeCommand

Come funziona

InvokeAgentRuntimeCommandesegue un comando shell all'interno del contenitore di una sessione AgentCore Runtime attiva e restituisce l'output.

Stesso agente, stessa sessione

InvokeAgentRuntimeCommandopera sullo stesso runtime e sulla stessa sessione dell'agente diInvokeAgentRuntime. Non si creano risorse separate. L'agente con cui hai distribuito CreateAgentRuntime accetta sia le chiamate degli agenti che l'esecuzione dei comandi in qualsiasi sessione attiva.

Nota

Per impostazione predefinita, il AgentCore Runtime MicroVM non include strumenti di sviluppo come gitnpm, o runtime linguistici. Tutti gli strumenti da cui dipendono i comandi devono essere inclusi nell'immagine del contenitore (tramite il Dockerfile) o installati dinamicamente in fase di esecuzione.

La risposta è un flusso di tre tipi di eventi:

Event Quando Contiene

contentStart

Primo pezzo

Conferma l'avvio del comando

contentDelta

Durante l'esecuzione

Output stdout and/or stderr

contentStop

Ultimo pezzo

exitCodee status (COMPLETEDoTIMED_OUT)

Flussi di output in tempo reale. I risultati vengono visualizzati man mano che vengono eseguiti, non dopo che sono terminati.

Prerequisiti

  • Autorizzazione IAM bedrock-agentcore:InvokeAgentRuntimeCommand

  • Un ARN AgentCore di endpoint Runtime valido

Nota

Gli agenti creati dopo il 17 marzo 2026 supportano automaticamente l'esecuzione dei comandi. Se l'agente è stato distribuito prima di questa data, è necessario ridistribuirlo per aggiornare il runtime dell'agente.

Esegui un comando

Esempio
Python
  1. L'esempio seguente mostra come utilizzare boto3 per eseguire un comando in una sessione di AgentCore Runtime.

    import boto3 import sys client = boto3.client('bedrock-agentcore', region_name='us-west-2') response = client.invoke_agent_runtime_command( agentRuntimeArn='arn:aws:bedrock-agentcore:us-west-2:account-id:runtime/my-agent', runtimeSessionId='session-id-at-least-33-characters-long', qualifier='DEFAULT', contentType='application/json', accept='application/vnd.amazon.eventstream', body={ 'command': '/bin/bash -c "npm test"', 'timeout': 60 } ) # Process the streaming response for event in response.get('stream', []): if 'chunk' in event: chunk = event['chunk'] if 'contentStart' in chunk: print("Command execution started") if 'contentDelta' in chunk: delta = chunk['contentDelta'] if delta.get('stdout'): print(delta['stdout'], end='') if delta.get('stderr'): print(delta['stderr'], end='', file=sys.stderr) if 'contentStop' in chunk: stop = chunk['contentStop'] print(f"\nExit code: {stop.get('exitCode')}, Status: {stop.get('status')}")
Java
  1. L'esempio seguente mostra come utilizzare l' AWS SDK for Java per eseguire un comando in AgentCore una sessione di Runtime.

    import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.bedrockagentcore.BedrockAgentCoreAsyncClient; import software.amazon.awssdk.services.bedrockagentcore.model.*; import java.util.UUID; import java.util.concurrent.CompletableFuture; public class ExecuteCommandExample { public static void main(String[] args) throws Exception { String agentArn = "arn:aws:bedrock-agentcore:us-west-2:account-id:runtime/my-agent"; String sessionId = UUID.randomUUID().toString(); BedrockAgentCoreAsyncClient client = BedrockAgentCoreAsyncClient.builder() .region(Region.US_WEST_2) .credentialsProvider(DefaultCredentialsProvider.create()) .build(); InvokeAgentRuntimeCommandRequest request = InvokeAgentRuntimeCommandRequest.builder() .agentRuntimeArn(agentArn) .runtimeSessionId(sessionId) .qualifier("DEFAULT") .contentType("application/json") .accept("application/vnd.amazon.eventstream") .body(InvokeAgentRuntimeCommandRequestBody.builder() .command("/bin/bash -c \"npm test\"") .timeout(60) .build()) .build(); InvokeAgentRuntimeCommandResponseHandler handler = InvokeAgentRuntimeCommandResponseHandler.builder() .subscriber(InvokeAgentRuntimeCommandResponseHandler.Visitor.builder() .onChunk(chunk -> { if (chunk.contentStart() != null) { System.out.println("Command execution started"); } if (chunk.contentDelta() != null) { ContentDeltaEvent delta = chunk.contentDelta(); if (delta.stdout() != null) System.out.print(delta.stdout()); if (delta.stderr() != null) System.err.print(delta.stderr()); } if (chunk.contentStop() != null) { ContentStopEvent stop = chunk.contentStop(); System.out.println("\nExit code: " + stop.exitCode() + ", Status: " + stop.statusAsString()); } }) .build()) .build(); CompletableFuture<Void> future = client.invokeAgentRuntimeCommand(request, handler); future.get(); client.close(); } }
JavaScript
  1. L'esempio seguente mostra come utilizzare l' AWS SDK per JavaScript v3 per eseguire un comando in una AgentCore sessione di Runtime.

    import { BedrockAgentCoreClient, InvokeAgentRuntimeCommandCommand } from "@aws-sdk/client-bedrock-agentcore"; import { randomUUID } from "crypto"; const client = new BedrockAgentCoreClient({ region: "us-west-2" }); const request = { agentRuntimeArn: "arn:aws:bedrock-agentcore:us-west-2:account-id:runtime/my-agent", runtimeSessionId: randomUUID(), qualifier: "DEFAULT", contentType: "application/json", accept: "application/vnd.amazon.eventstream", body: { command: '/bin/bash -c "npm test"', timeout: 60, }, }; const command = new InvokeAgentRuntimeCommandCommand(request); const response = await client.send(command); // Process the event stream for await (const event of response.stream) { if (event.chunk) { const chunk = event.chunk; if (chunk.contentStart) { console.log("Command execution started"); } if (chunk.contentDelta) { if (chunk.contentDelta.stdout) process.stdout.write(chunk.contentDelta.stdout); if (chunk.contentDelta.stderr) process.stderr.write(chunk.contentDelta.stderr); } if (chunk.contentStop) { console.log(`\nExit code: ${chunk.contentStop.exitCode}, ` + `Status: ${chunk.contentStop.status}`); } } } client.destroy();

Esempio di flusso di lavoro dell'agente di codifica

Uno schema comune viene utilizzato InvokeAgentRuntime per il ragionamento e InvokeAgentRuntimeCommand per le operazioni deterministiche nella stessa sessione.

Esempio di flusso di lavoro dell'agente End-to-end di codifica

import boto3 import json client = boto3.client('bedrock-agentcore', region_name='us-west-2') AGENT_ARN = 'arn:aws:bedrock-agentcore:us-west-2:account-id:runtime/my-agent' SESSION_ID = 'session-id-at-least-33-characters-long' def run_command(command, timeout=60): """Helper to run a command and return the exit code.""" response = client.invoke_agent_runtime_command( agentRuntimeArn=AGENT_ARN, runtimeSessionId=SESSION_ID, contentType='application/json', accept='application/vnd.amazon.eventstream', body={'command': command, 'timeout': timeout} ) for event in response.get('stream', []): if 'chunk' in event and 'contentStop' in event['chunk']: return event['chunk']['contentStop'].get('exitCode') return None # Step 1: Invoke the agent to analyze and write a fix response = client.invoke_agent_runtime( agentRuntimeArn=AGENT_ARN, runtimeSessionId=SESSION_ID, payload=json.dumps({"prompt": "Read JIRA-1234 and implement the fix in /workspace"}).encode() ) # Process agent response... # Step 2: Run tests deterministically exit_code = run_command('/bin/bash -c "cd /workspace && npm test"', timeout=300) # Step 3: If tests pass, commit and push if exit_code == 0: run_command('/bin/bash -c "cd /workspace && git checkout -b fix/JIRA-1234"') run_command('/bin/bash -c "cd /workspace && git add -A && git commit -m \'Fix JIRA-1234\'"') run_command('/bin/bash -c "cd /workspace && git push origin fix/JIRA-1234"')

L'agente scrive il codice. La piattaforma esegue i comandi. Ognuno fa ciò che sa fare meglio.

Casi di utilizzo comune

Esecuzione di suite di test

Dopo che l'agente ha scritto il codice, esegui la suite di test del progetto come comando. La risposta in streaming consente di rilevare tempestivamente gli errori e di inviare un output di errore specifico all'agente per l'iterazione.

/bin/bash -c "cd /workspace && npm test 2>&1"
Operazioni Git

La ramificazione, il commit e il push sono operazioni deterministiche. Eseguile come comandi dopo che l'agente ha completato il suo lavoro, mantenendo la logica di controllo della versione fuori dal LLM.

/bin/bash -c "cd /workspace && git add -A && git commit -m 'Fix issue'"
Installazione delle dipendenze

Avvia l'ambiente prima di richiamare i repository agent -clone, installa i pacchetti, configura gli strumenti di compilazione. Questa preparazione viene eseguita più velocemente e in modo più affidabile come comandi diretti.

/bin/bash -c "pip install -r requirements.txt"
Compila e compila

Compila i passaggi e la generazione di risorse, qualsiasi cosa con un comando noto che dovrebbe essere eseguito esattamente come specificato.

/bin/bash -c "cd /workspace && cargo build --release"
Linting e validazione

Esegui i controlli di qualità del codice come porta di convalida dopo che l'agente ha scritto il codice, prima del commit.

/bin/bash -c "cd /workspace && npx eslint src/ --format json"
Ispezione ambientale

Controlla lo stato di runtime, i pacchetti installati, gli strumenti disponibili, utili per il debug degli agenti.

/bin/bash -c "python --version && node --version && git --version"
Operazioni sui dati

Recupera set di dati, carica risultati, esegui trasformazioni di dati: operazioni di rete e di calcolo che vengono eseguite più velocemente come comandi diretti.

/bin/bash -c "aws s3 cp s3://my-bucket/data.csv /workspace/"

Principali scelte di progettazione

One-shot, esecuzione non interattiva

Ogni comando genera un nuovo processo bash, viene eseguito fino al completamento (o timeout) e restituisce. Non esiste una sessione di shell persistente tra i comandi. Ciò corrisponde al modo in cui i framework degli agenti utilizzano l'esecuzione dei comandi: creano un comando, lo eseguono, leggono l'output, decidono cosa fare dopo.

Risposta in streaming su HTTP/2

L'output arriva così come viene prodotto, non viene memorizzato nel buffer fino al completamento. A npm test che richiede due minuti, trasmette i risultati in tempo reale. L'applicazione è in grado di rilevare un errore nei primi secondi e di annullarlo in anticipo anziché attendere l'esecuzione completa.

Isolamento del container

I comandi vengono eseguiti all'interno dello stesso contenitore del codice dell'agente. Vedono lo stesso filesystem, le stesse variabili di ambiente e gli stessi pacchetti installati. Un file in cui l'agente ha scritto /workspace/fix.py è immediatamente visibile all'esecuzione di un comando. cat /workspace/fix.py

Non-blocking al runtime

L'esecuzione dei comandi non blocca le chiamate agli agenti. È possibile richiamare l'agente ed eseguire comandi contemporaneamente nella stessa sessione. La piattaforma gestisce la concorrenza.

Senza stato tra i comandi

Ogni comando inizia da zero: nessuna cronologia della shell, nessuna modifica della variabile di ambiente rispetto ai comandi precedenti viene trasferita. Se hai bisogno di state, codificalo nel comando stesso:. cd /workspace && export NODE_ENV=test && npm test

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

In base al modello di responsabilità AWS condivisa, sei responsabile della sicurezza 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 l'esecuzione dei comandi è la microVM. Ogni sessione AgentCore di Runtime viene eseguita in una microVM isolata con kernel, memoria e filesystem propri. I comandi eseguiti non possono accedere ai carichi di lavoro di altri clienti o sfuggire ai limiti della VM. Tuttavia, all'interno della macchina virtuale, i comandi 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 il comando di input al gruppo di log Amazon CloudWatch Logs del tuo agente. Puoi utilizzare questi log per monitorare l'attività dei comandi e mantenere una traccia di controllo dei comandi eseguiti nelle tue sessioni. L'output di esecuzione del comando (stdout e stderr) viene trasmesso in streaming all'applicazione e non viene registrato dal servizio.

Controllo con CloudTrail

AWS CloudTrail registra le chiamate InvokeAgentRuntimeCommand 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 eseguito i comandi e quando, quindi correla con i log di CloudWatch Logs utilizzando l'ID della richiesta per vedere quale comando è stato eseguito.

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 InvokeAgentRuntimeCommand

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

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

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

Gestione degli errori

Quando si utilizza l'InvokeAgentRuntimeCommandoperazione, è possibile che si verifichino i seguenti errori:

ValidationException

Si verifica quando i parametri della richiesta non sono validi. Verifica che l'ARN, l'ID di sessione e il comando dell'agente siano formattati correttamente. Il comando deve essere compreso tra 1 byte e 64 KB, il timeout deve essere compreso tra 1 e 3600 secondi e l'ID di sessione deve contenere almeno 33 caratteri.

ResourceNotFoundException

Si verifica quando non è possibile trovare il runtime o la sessione dell'agente specificato. Verificare che l'ARN dell'agente sia corretto e che la sessione sia attiva.

AccessDeniedException

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

ThrottlingException

Si verifica quando si supera il limite di frequenza di richiesta di 25 TPS. Implementa la logica esponenziale di backoff e riprova nella tua applicazione.

Un comando che viene completato con un codice di uscita diverso da zero non è un errore API. Controlla l'exitCodecontentStopevento per determinare se il comando stesso ha avuto successo. Un status of TIMED_OUT indica che il comando ha superato il timeout specificato.

Best practice

Segui queste best practice per l'utilizzo dell'InvokeAgentRuntimeCommandoperazione:

  • Da utilizzare InvokeAgentRuntimeCommand per operazioni deterministiche (tests, git, build) e InvokeAgentRuntime per attività di ragionamento. Non indirizzate le operazioni deterministiche attraverso l'LLM.

  • Includi tutti gli strumenti di sviluppo da cui dipendono i tuoi comandi (ad esempio gitnpm, o i runtime del linguaggio) nell'immagine del contenitore tramite il tuo Dockerfile.

  • Controlla sempre l'exitCodecontentStopevento per determinare se il comando ha avuto successo.

  • Imposta i timeout appropriati. Una suite di test potrebbe richiedere 5 minuti, mentre una git push potrebbe richiedere solo 30 secondi.

  • Elabora l'output dello streaming in modo incrementale per rilevare tempestivamente i guasti. È possibile annullare un comando a esecuzione prolungata anziché attendere il completamento.

  • Codifica lo stato nel comando stesso usando il && concatenamento (ad esempio,cd /workspace && export NODE_ENV=test && npm test), poiché ogni comando avvia un nuovo processo bash.

  • Utilizzate gli UUID per gli ID di sessione per soddisfare il requisito minimo di 33 caratteri (ad esempio,). 12345678-1234-1234-1234-123456789012