View a markdown version of this page

Conchas interativas (terminais) - Amazon Bedrock AgentCore

Conchas interativas (terminais)

A InvokeAgentRuntimeCommandShell operação abre uma sessão de terminal persistente e interativa dentro de uma sessão de Runtime em AgentCore execução WebSocket. Ao contrário da execução única de comandos, as sessões de shell mantêm o estado — as variáveis de ambiente, o diretório de trabalho e o histórico de comandos são transmitidos entre as entradas. Isso permite a depuração, a inspeção do ambiente e a criação de experiências de terminal em seu aplicativo.

Para ligarInvokeAgentRuntimeCommandShell, você precisa de bedrock-agentcore:InvokeAgentRuntimeCommandShell permissões.

Como funciona

InvokeAgentRuntimeCommandShellestabelece uma WebSocket conexão com um processo de shell interativo em execução na sessão do seu agente. A conexão usa quadros binários para transmitir a entrada e a saída do terminal em ambas as direções.

Mesmo agente, mesma sessão

InvokeAgentRuntimeCommandShellopera no mesmo tempo de execução do agente que InvokeAgentRuntime InvokeAgentRuntimeCommand e. Você não cria recursos separados. O agente com o qual você implantou CreateAgentRuntime aceita conexões shell em qualquer sessão ativa.

nota

Você pode passar um session_id para direcionar uma sessão de tempo de execução específica. Se for omitido, uma nova sessão será criada para cada conexão. Para usar a reconexão, você deve armazenar e reutilizar ambos e. session_id shellId

A conexão suporta:

Recurso Description

Estado persistente

Variáveis de ambiente, diretório de trabalho e histórico de comandos são transferidos entre as entradas na mesma sessão.

Reconexão

Forneça o mesmo session_id e shellId reconecte ao mesmo shell após uma desconexão. O serviço reproduz até 256 KB de saída em buffer.

Vários shells simultâneos

Até 10 sessões de shell ativas (terminais) por tempo de execução. Novas conexões são rejeitadas quando estão lotadas.

Pré-requisitos

  • Permissão bedrock-agentcore:InvokeAgentRuntimeCommandShell do IAM

  • Um ARN AgentCore de endpoint de tempo de execução válido com um tempo de execução no estado PRONTO

nota

Os agentes criados após 5 de junho de 2026 oferecem suporte automático a shells interativos (terminais). Se você implantou seu agente antes dessa data, deverá reimplantá-lo para atualizar o tempo de execução do agente.

Usando a AgentCore CLI

Para obter instruções de instalação e configuração, consulte Comece a usar o AgentCore Runtime usando a CLI.

A CLI fornece uma experiência de terminal integrada com. agentcore exec

agentcore exec --it

Para se conectar a um tempo de execução específico:

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

Pressione Ctrl+] para se soltar de uma concha sem fechá-la. A CLI imprime um comando de reconexão:

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

Para comandos únicos, --it omita:

agentcore exec "ls -la /tmp"

Para uma saída legível por máquina, use o modo JSON:

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

Para obter exemplos adicionais de CLI, consulte AgentCore exemplos em. GitHub

Usando o AgentCore SDK

Instale o SDK do Python:

pip install bedrock-agentcore
exemplo
SigV4 (default)
  1. O exemplo a seguir mostra como abrir uma sessão de shell usando AWS credenciais padrão.

    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. O exemplo a seguir mostra como abrir uma sessão de shell usando uma URL pré-assinada.

    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. O exemplo a seguir mostra como abrir uma sessão de shell usando um token portador do 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())

Reconexão

Um padrão comum é usar para se shellId reconectar a um shell após uma desconexão, preservando todo o estado da sessão.

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

O SDK também pode se reconectar automaticamente quando a WebSocket conexão é interrompida. Use ReconnectConfig para habilitar isso:

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

Para ver exemplos adicionais de SDK, veja AgentCore exemplos em. GitHub

Casos de uso comuns

Depuração interativa

Abra um shell para inspecionar o ambiente de execução do seu agente — verifique os pacotes instalados, leia os arquivos de log, examine o sistema de arquivos ou teste os comandos antes de adicioná-los ao código do agente.

python --version && pip list | head -20
Inspeção ambiental

Verifique as variáveis do ambiente, a conectividade da rede, as ferramentas disponíveis e o estado do sistema de arquivos. Útil para diagnosticar falhas do agente ou validar a configuração de implantação.

env | grep AWS && curl -s http://169.254.169.254/latest/meta-data/
Acesso ao terminal do agente de codificação

Os agentes de codificação de IA usam shells interativos (terminais) como ambiente de execução. Quando um agente de codificação precisa executar código, instalar pacotes ou executar testes, ele abre uma sessão de shell no AgentCore Runtime e executa comandos diretamente, da mesma forma que um desenvolvedor usaria um terminal. Por exemplo, Claude Code, Amazon Kiro e OpenAI Codex se conectam a uma sessão de shell onde podem escrever código de forma iterativa, executá-lo, observar a saída e corrigir erros em um loop. O estado persistente significa que o agente pode executar uma sequência de comandos sem perder o contexto entre as etapas.

# 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 processos

Inicie processos que sobrevivem a uma única solicitação HTTP. Use a reconexão para verificar o progresso ou fornecer informações adicionais ao longo do tempo.

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

Principais opções de design

Sessões interativas persistentes

Cada conexão é mapeada para um processo de shell de longa duração. Você pode enviar vários comandos sem restabelecer a conexão, e o estado acumulado pelos comandos anteriores (variáveis exportadas, cd alterações) fica disponível para os posteriores.

Enquadramento binário WebSocket

I/O O terminal é transmitido como WebSocket quadros binários. Isso suporta sequências brutas de controle de terminal, cores, movimento do cursor e aplicativos em tela cheia sem sobrecarga de codificação.

Reconexão com replay de saída

Quando você se reconecta usando o mesmoshellId, o serviço reproduz até 256 KB de saída recente. Isso permite que você se recupere de interrupções na rede sem perder o contexto. O processo do shell continua em execução durante a desconexão.

Limite de sessão

Quando 10 sessões de shell (terminais) já estão abertas em um tempo de execução, novas conexões são rejeitadas com um erro. Você deve fechar uma sessão existente antes de abrir uma nova.

Considerações sobre segurança

dica

Para obter uma visão consolidada de todas as recomendações de segurança do Runtime, consulte Melhores práticas de segurança para o AgentCore Runtime.

Importante

No modelo de responsabilidade AWS compartilhada, você é responsável pelos comandos que executa nas sessões do AgentCore Runtime. AWS fornece a infraestrutura segura e o isolamento no nível da microVM. Você é responsável pelos comandos que executa, pelos dados que processa e pelos controles de acesso que configura.

O limite de segurança para sessões de shell (terminais) é a microVM. Cada sessão do AgentCore Runtime é executada em uma microVM isolada com seu próprio kernel, memória e sistema de arquivos. As sessões do Shell não podem acessar as cargas de trabalho de outros clientes nem escapar dos limites da VM. No entanto, na sua VM, os comandos shell têm acesso total ao sistema de arquivos do contêiner e a todas as credenciais ou segredos que você configurou.

Auditoria com registros CloudWatch

AgentCore O Runtime envia o ID da solicitação e os metadados da conexão para o grupo de CloudWatch logs do Amazon Logs do seu agente. Você pode usar esses registros para monitorar a atividade de conexão do shell e manter uma trilha de auditoria. I/O O conteúdo do terminal (stdin/stdout) é transmitido para seu cliente e não é registrado pelo serviço.

Auditoria com CloudTrail

AWS CloudTrail registra chamadas de InvokeAgentRuntimeCommandShell API em sua conta. Cada registro inclui metadados, como identidade do chamador, carimbo de data/hora, endereço IP de origem e status da resposta. CloudTrail não registra a carga útil da solicitação ou resposta. Use CloudTrail para auditar quem abriu as sessões de shell e quando, depois correlacione com CloudWatch os registros usando o ID da solicitação para obter detalhes da conexão.

Para cargas de trabalho confidenciais, considere a implementação de controles adicionais, como:

  • Usando políticas do IAM para restringir quais diretores podem ligar InvokeAgentRuntimeCommandShell

  • Configurando endpoints VPC para manter o tráfego em sua rede

  • Configurando filtros métricos e alarmes do CloudWatch Logs para detectar padrões de conexão inesperados

  • Analisar CloudTrail os registros regularmente em busca de tentativas de acesso não autorizado

Tratamento de erros

Ao estabelecer uma conexão de sessão de shell, você pode encontrar os seguintes erros durante a WebSocket atualização:

ValidationException

Ocorre quando os parâmetros da solicitação são inválidos. Isso pode acontecer se o ID da sessão tiver menos de 33 caracteres, se o recurso não estiver ativado na região de destino ou se o agente não estiver no estado PRONTO.

AccessDeniedException

Ocorre quando você não tem as permissões necessárias. Certifique-se de que sua política do IAM inclua a bedrock-agentcore:InvokeAgentRuntimeCommandShell permissão.

ResourceNotFoundException

Ocorre quando o tempo de execução do agente especificado não pode ser encontrado. Verifique se o ARN do tempo de execução está correto.

RuntimeClientError (424)

Ocorre em vários cenários: (1) Máximo de sessões de shell simultâneas (terminais) atingido (10 abertas) — feche uma sessão existente e tente novamente. (2) Formato de ID de shell inválido — deve ter de 1 a 128 caracteres alfanuméricos, sublinhados ou hífens. (3) Tempo de execução inacessível — tente novamente após recuar. Analise o error campo JSON do corpo da resposta para distinguir as causas.

ThrottlingException

Ocorre quando você excede o limite de taxa da API. Implemente a lógica de recuo exponencial e tente novamente.

ConflictException

Outra conexão está reivindicando o mesmo shellId simultaneamente. Tente novamente após 1 segundo. Essa é uma condição de corrida restrita (não um estado persistente) e é resolvida imediatamente após uma nova tentativa.

Depois de conectado, os seguintes códigos de fechamento indicam por que a conexão foi encerrada:

Código Significado Ação do cliente

1000

Fechamento normal — a concha saiu de forma limpa ou desconectou corretamente

Display “desconectado”. Rescisão normal.

1001

Desaparecendo — implantação ou desligamento do servidor

Auto-reconnect com armazenadoshellId.

1003

Dados não compatíveis — enviados após 5 quadros de texto consecutivos (protocolo somente binário)

NÃO se reconecte automaticamente. Mude para quadros binários.

1006

Fechamento anormal — sintetizado localmente quando nenhum quadro fechado é recebido (morte da rede, TCP RST)

Auto-reconnect com armazenadoshellId.

1008

Violação de política — TTL de conexão expirado (1 hora), limite de taxa de quadros excedido (250 frames/sec) ou estouro de buffer de gravação

Auto-reconnect para expiração de TTL (TTL novo na reconexão). Para limite de taxa: desligue e reconecte.

1009

Mensagem muito grande — a carga útil do quadro excedeu 64 KB

Reduza o tamanho do quadro (fragmento para <64 KB) e reconecte. A sessão ainda está ativa.

1011

Erro no servidor — falha interna inesperada

Tente novamente com o backoff.

4000

Substituído — outro cliente conectado ao mesmo shellId

NÃO se reconecte automaticamente. Exibir “sessão anexada de outro cliente”.

Práticas recomendadas

Siga estas melhores práticas ao usarInvokeAgentRuntimeCommandShell:

  • Use um exclusivo shellId (como um UUID) para cada sessão lógica para permitir a reconexão. Armazene o shellId no lado do cliente.

  • Use ReconnectConfig no SDK para lidar automaticamente com interrupções transitórias de rede sem lógica de reconexão manual.

  • Leia os quadros de saída imediatamente. Se o cliente ficar para trás, o buffer de gravação do servidor é preenchido e a conexão é fechada com o código. 1008

  • Para entradas grandes (como colar um arquivo), divida o conteúdo em partes com menos de 64 KB por quadro para evitar o fechamento de código. 1009

  • Defina os tempos limite de conexão apropriados. A duração máxima da conexão é de 1 hora — reconecte-se com a mesma shellId para continuar além disso.

  • Feche as sessões explicitamente quando terminar. As sessões separadas contam para o limite de 10 sessões.

Cotas e limites

Limite Valor Description

Tamanho máximo da carga útil do quadro

64 KB

Os quadros que excedem esse limite resultam em código 1009 fechado.

Taxa de quadros

250 frames/sec

Exceder isso aciona o código de fechamento. 1008

Duração máxima da conexão

1 hora

A conexão é fechada com o código1008. Reconecte-se usando o mesmo shellId para continuar.

Sessões de shell simultâneas (terminais) por tempo de execução

10

Novas conexões serão rejeitadas se 10 sessões já estiverem abertas. Feche uma sessão existente e tente novamente.

Tampão de reconexão

256 KB

Saída máxima reproduzida ao se reconectar a um shell.

Para ver os limites completos do serviço, consulte Cotas para o Amazon Bedrock AgentCore.