View a markdown version of this page

대화형 쉘(터미널) - Amazon Bedrock AgentCore

대화형 쉘(터미널)

InvokeAgentRuntimeCommandShell 작업은 WebSocket을 통해 실행 중인 AgentCore 런타임 세션 내에서 지속적인 대화형 터미널 세션을 엽니다. 원샷 명령 실행과 달리 쉘 세션은 환경 변수, 작업 디렉터리 및 명령 기록이 입력 간에 전달되는 상태를 유지합니다. 이를 통해 애플리케이션에서 디버깅, 환경 검사 및 터미널 경험 구축이 가능합니다.

를 호출하려면 bedrock-agentcore:InvokeAgentRuntimeCommandShell 권한이 InvokeAgentRuntimeCommandShell필요합니다.

작동 방식

InvokeAgentRuntimeCommandShell는 에이전트의 세션 내에서 실행되는 대화형 셸 프로세스에 대한 WebSocket 연결을 설정합니다. 연결은 바이너리 프레임을 사용하여 터미널 입력 및 출력을 양방향으로 스트리밍합니다.

동일한 에이전트, 동일한 세션

InvokeAgentRuntimeCommandShellInvokeAgentRuntime 및와 동일한 에이전트 런타임에서 작동합니다InvokeAgentRuntimeCommand. 별도의 리소스는 생성하지 않습니다. 로 배포한 에이전트는 모든 활성 세션에서 쉘 연결을 CreateAgentRuntime 허용합니다.

참고

를 전달session_id하여 특정 런타임 세션을 대상으로 지정할 수 있습니다. 생략하면 각 연결에 대해 새 세션이 생성됩니다. 재연결을 사용하려면 session_id 및를 모두 저장하고 재사용해야 합니다shellId.

연결은 다음을 지원합니다.

기능 설명

영구 상태

환경 변수, 작업 디렉터리 및 명령 기록은 동일한 세션 내의 입력 간에 전달됩니다.

재연결

연결 해제 후 동일한 쉘에 다시 연결shellId하려면 동일한 session_id 및를 제공합니다. 서비스는 최대 256KB의 버퍼링된 출력을 재생합니다.

여러 동시 쉘

런타임당 최대 10개의 활성 쉘 세션(터미널). 용량에 도달하면 새 연결이 거부됩니다.

사전 조건

  • bedrock-agentcore:InvokeAgentRuntimeCommandShell IAM 권한

  • 런타임이 READY 상태인 유효한 AgentCore 런타임 엔드포인트 ARN

참고

2026년 6월 5일 이후에 생성된 에이전트는 대화형 셸(터미널)을 자동으로 지원합니다. 이 날짜 이전에 에이전트를 배포한 경우 에이전트 런타임을 업데이트하려면 에이전트를 다시 배포해야 합니다.

AgentCore CLI 사용

설치 및 설정 지침은 CLI를 사용하여 AgentCore 런타임 시작하기를 참조하세요.

CLI는를 통해 내장 터미널 환경을 제공합니다agentcore exec.

agentcore exec --it

특정 런타임에 연결하려면:

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

쉘을 닫지 않고 쉘에서 분리Ctrl+]하려면를 누릅니다. CLI는 재연결 명령을 인쇄합니다.

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

원샷 명령의 경우를 생략합니다--it.

agentcore exec "ls -la /tmp"

시스템 읽기 가능 출력의 경우 JSON 모드를 사용합니다.

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

추가 CLI 예제는 GitHub의 AgentCore 샘플을 참조하세요.

AgentCore SDK 사용

Python SDK를 설치합니다.

pip install bedrock-agentcore
SigV4 (default)
  1. 다음 예제에서는 기본 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. 다음 예제에서는 미리 서명된 URL을 사용하여 셸 세션을 여는 방법을 보여줍니다.

    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. 다음 예제에서는 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())

재연결

일반적인 패턴은를 사용하여 연결 해제 후 쉘에 shellId 다시 연결하여 모든 세션 상태를 유지하는 것입니다.

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

자동 재연결

또한 WebSocket 연결이 끊어지면 SDK가 자동으로 다시 연결할 수 있습니다. ReconnectConfig를 사용하여 다음을 활성화합니다.

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

추가 SDK 예제는 GitHub의 AgentCore 샘플을 참조하세요.

일반 사용 사례

대화형 디버깅

쉘을 열어 에이전트의 런타임 환경을 검사합니다. 설치된 패키지를 확인하거나, 로그 파일을 읽거나, 파일 시스템을 검사하거나, 에이전트 코드에 추가하기 전에 명령을 테스트합니다.

python --version && pip list | head -20
환경 검사

환경 변수, 네트워크 연결, 사용 가능한 도구 및 파일 시스템 상태를 확인합니다. 에이전트 실패를 진단하거나 배포 구성을 검증할 때 유용합니다.

env | grep AWS && curl -s http://169.254.169.254/latest/meta-data/
에이전트 터미널 액세스 코딩

AI 코딩 에이전트는 대화형 셸(터미널)을 실행 환경으로 사용합니다. 코딩 에이전트가 코드를 실행하거나, 패키지를 설치하거나, 테스트를 실행해야 하는 경우 개발자가 터미널을 사용하는 것과 동일한 방식으로 AgentCore 런타임에 대한 셸 세션을 열고 명령을 직접 실행합니다. 예를 들어 Claude Code, Amazon Kiro 및 OpenAI Codex는 각각 코드를 반복적으로 작성하고, 실행하고, 출력을 관찰하고, 루프에서 오류를 수정할 수 있는 쉘 세션에 연결됩니다. 영구 상태는 에이전트가 단계 간에 컨텍스트를 손실하지 않고 일련의 명령을 실행할 수 있음을 의미합니다.

# 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
장기 실행 프로세스

단일 HTTP 요청을 실행하는 프로세스를 시작합니다. 재연결을 사용하여 진행 상황을 확인하거나 시간 경과에 따른 추가 입력을 제공합니다.

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

주요 설계 선택 사항

지속적인 대화형 세션

각 연결은 수명이 긴 쉘 프로세스에 매핑됩니다. 연결을 다시 설정하지 않고도 여러 명령을 보낼 수 있으며, 이전 명령(내보낸 변수, cd 변경 사항)에 의해 누적된 상태를 나중에 사용할 수 있습니다.

WebSocket을 통한 바이너리 프레이밍

터미널 I/O는 바이너리 WebSocket 프레임으로 스트리밍됩니다. 이는 인코딩 오버헤드 없이 원시 터미널 제어 시퀀스, 색상, 커서 이동 및 전체 화면 애플리케이션을 지원합니다.

출력 재생과의 재연결

동일한를 사용하여 다시 연결하면 shellId서비스가 최대 256KB의 최근 출력을 재생합니다. 이를 통해 컨텍스트 손실 없이 네트워크 중단으로부터 복구할 수 있습니다. 연결 해제 중에도 쉘 프로세스가 계속 실행됩니다.

세션 제한

런타임에 10개의 쉘 세션(터미널)이 이미 열려 있으면 오류와 함께 새 연결이 거부됩니다. 새 세션을 열기 전에 기존 세션을 닫아야 합니다.

보안 고려 사항

작은 정보

모든 런타임 보안 권장 사항에 대한 통합 보기는 AgentCore 런타임의 보안 모범 사례를 참조하세요.

중요

AWS 공동 책임 모델에서는 AgentCore 런타임 세션에서 실행하는 명령에 대한 책임이 있습니다.는 microVM 수준에서 보안 인프라와 격리를 AWS 제공합니다. 실행하는 명령, 처리하는 데이터 및 구성하는 액세스 제어에 대한 책임은 사용자에게 있습니다.

쉘 세션(터미널)의 보안 경계는 microVM입니다. 각 AgentCore 런타임 세션은 자체 커널, 메모리 및 파일 시스템이 있는 격리된 microVM에서 실행됩니다. 쉘 세션은 다른 고객의 워크로드에 액세스하거나 VM 경계를 이스케이프할 수 없습니다. 그러나 VM 내에서 셸 명령은 컨테이너 파일 시스템과 구성한 자격 증명 또는 보안 암호에 대한 전체 액세스 권한을 가집니다.

CloudWatch Logs를 사용한 감사

AgentCore 런타임은 요청 ID와 연결 메타데이터를 에이전트의 Amazon CloudWatch Logs 로그 그룹에 전송합니다. 이러한 로그를 사용하여 쉘 연결 활동을 모니터링하고 감사 추적을 유지할 수 있습니다. 터미널 I/O 콘텐츠(stdin/stdout)는 클라이언트로 스트리밍되며 서비스에 의해 로깅되지 않습니다.

CloudTrail을 사용한 감사

AWS CloudTrail은 계정에 InvokeAgentRuntimeCommandShell API 호출을 기록합니다. 각 레코드에는 발신자 자격 증명, 타임스탬프, 소스 IP 주소 및 응답 상태와 같은 메타데이터가 포함됩니다. CloudTrail은 요청 또는 응답 페이로드를 로깅하지 않습니다. CloudTrail을 사용하여 쉘 세션을 연 사람과 시기를 감사한 다음 연결 세부 정보에 대한 요청 ID를 사용하여 CloudWatch Logs와 상호 연관시킵니다.

민감한 워크로드의 경우 다음과 같은 추가 제어를 구현하는 것이 좋습니다.

  • IAM 정책을 사용하여 호출할 수 있는 보안 주체 제한 InvokeAgentRuntimeCommandShell

  • 네트워크 내에서 트래픽을 유지하도록 VPC 엔드포인트 구성

  • 예상치 못한 연결 패턴을 감지하기 위한 CloudWatch Logs 지표 필터 및 경보 설정

  • CloudTrail 로그에 무단 액세스 시도가 있는지 정기적으로 검토

오류 처리

쉘 세션 연결을 설정할 때 WebSocket 업그레이드 중에 다음과 같은 오류가 발생할 수 있습니다.

ValidationException

요청 파라미터가 유효하지 않을 때 발생합니다. 세션 ID가 33자 미만이거나, 대상 리전에서 기능이 활성화되지 않았거나, 에이전트가 준비 상태가 아닌 경우이 문제가 발생할 수 있습니다.

AccessDeniedException

필요한 권한이 없을 때 발생합니다. IAM 정책에 bedrock-agentcore:InvokeAgentRuntimeCommandShell 권한이 포함되어 있는지 확인합니다.

ResourceNotFoundException

지정된 에이전트 런타임을 찾을 수 없을 때 발생합니다. 런타임 ARN이 올바른지 확인합니다.

RuntimeClientError(424)

여러 시나리오에서 발생합니다. (1) 최대 동시 쉘 세션(터미널) 도달(10개 열기) - 기존 세션을 닫고 다시 시도합니다. (2) 쉘 ID 형식이 유효하지 않음 - 1~128자의 영숫자 문자, 밑줄 또는 하이픈이어야 합니다. (3) 런타임에 연결할 수 없음 - 백오프 후 다시 시도합니다. 응답 본문 JSON error 필드를 구문 분석하여 원인을 구분합니다.

ThrottlingException

API 속도 제한을 초과할 때 발생합니다. 지수 백오프 및 재시도 로직을 구현합니다.

ConflictException

또 다른 연결은 동일한를 shellId 동시에 클레임합니다. 1초 후에 재시도합니다. 이는 좁은 레이스 조건(지속 상태가 아님)이며 재시도 시 즉시 해결됩니다.

연결되면 다음 종료 코드는 연결이 종료된 이유를 나타냅니다.

코드 의미 클라이언트 작업

1000

정상 닫힘 - 쉘이 정상 또는 정상적으로 종료됨

"연결 해제됨"을 표시합니다. 정상 종료.

1001

사라짐 - 서버 배포 또는 종료

저장된와 자동 다시 연결합니다shellId.

1003

지원되지 않는 데이터 - 5회 연속 텍스트 프레임 후 전송(이진 프로토콜만 해당)

자동으로 다시 연결하지 마십시오. 바이너리 프레임으로 전환합니다.

1006

비정상적인 종료 - 닫힌 프레임이 수신되지 않을 때 로컬에서 합성됩니다(네트워크 사망, TCP RST).

저장된와 자동 다시 연결합니다shellId.

1008

정책 위반 - 연결 TTL 만료(1시간), 프레임 속도 제한 초과(250프레임/초) 또는 쓰기 버퍼 오버플로

TTL 만료를 위한 자동 재연결(재연결 시 새 TTL). 속도 제한의 경우: 다시 끈 다음 다시 연결합니다.

1009

메시지가 너무 큼 - 프레임 페이로드가 64KB를 초과함

프레임 크기(청크를 <64KB로)를 줄인 다음 다시 연결합니다. 세션이 아직 활성 상태입니다.

1011

서버 오류 - 예기치 않은 내부 장애

백오프를 사용하여 재시도합니다.

4000

대체됨 - 동일한에 연결된 다른 클라이언트 shellId

자동으로 다시 연결하지 마십시오. “다른 클라이언트에서 연결된 세션”을 표시합니다.

모범 사례

사용 시 InvokeAgentRuntimeCommandShell다음 모범 사례를 따르세요.

  • 각 논리적 세션에 고유한 shellId (예: UUID)를 사용하여 재연결을 활성화합니다. 클라이언트 측shellId에를 저장합니다.

  • SDKReconnectConfig에서를 사용하여 수동 재연결 로직 없이 일시적인 네트워크 중단을 자동으로 처리합니다.

  • 출력 프레임을 즉시 읽습니다. 클라이언트가 뒤처지면 서버의 쓰기 버퍼가 채워지고 연결이 코드 로 닫힙니다1008.

  • 대용량 입력(예: 파일 붙여넣기)의 경우 닫기 코드를 방지하기 위해 콘텐츠를 프레임당 64KB 미만의 청크로 분할합니다1009.

  • 적절한 연결 제한 시간을 설정합니다. 최대 연결 기간은 1시간입니다.이 시간 이후에도 계속하려면 동일한 shellId에 다시 연결합니다.

  • 완료되면 세션을 명시적으로 닫습니다. 분리된 세션은 10개 세션 제한에 포함됩니다.

할당량 및 제한

Limit 설명

최대 프레임 페이로드 크기

64KB

이 제한을 초과하는 프레임은 종료 코드를 생성합니다1009.

프레임 속도

250프레임/초

이 값을 초과하면 종료 코드가 트리거됩니다1008.

최대 연결 기간

1시간

연결은 코드 로 닫힙니다1008. shellId 계속하려면 동일한를 사용하여 다시 연결합니다.

런타임당 동시 쉘 세션(터미널)

10

10개의 세션이 이미 열려 있으면 새 연결이 거부됩니다. 기존 세션을 닫고 다시 시도합니다.

재연결 버퍼

256KB

쉘에 다시 연결할 때 재생되는 최대 출력입니다.

전체 서비스 제한은 Amazon Bedrock AgentCore 할당량을 참조하세요.