インタラクティブシェル (ターミナル)
InvokeAgentRuntimeCommandShell オペレーションは、WebSocket 経由で実行中の AgentCore ランタイムセッション内で永続的でインタラクティブなターミナルセッションを開きます。ワンショットコマンド実行とは異なり、シェルセッションは環境変数、作業ディレクトリ、コマンド履歴などの状態を維持します。これにより、アプリケーションのデバッグ、環境検査、ターミナルエクスペリエンスの構築が可能になります。
を呼び出すにはInvokeAgentRuntimeCommandShell、 アクセスbedrock-agentcore:InvokeAgentRuntimeCommandShell許可が必要です。
仕組み
InvokeAgentRuntimeCommandShell は、エージェントのセッション内で実行されるインタラクティブなシェルプロセスへの WebSocket 接続を確立します。接続では、バイナリフレームを使用してターミナルの入出力を両方向にストリーミングします。
同じエージェント、同じセッション
InvokeAgentRuntimeCommandShell は、 InvokeAgentRuntimeおよび と同じエージェントランタイムで動作しますInvokeAgentRuntimeCommand。個別のリソースは作成しません。でデプロイしたエージェントは、アクティブなセッションでシェル接続CreateAgentRuntimeを受け入れます。
注記
を渡session_idして、特定のランタイムセッションをターゲットにできます。省略すると、接続ごとに新しいセッションが作成されます。再接続を使用するには、 session_id と の両方を保存して再利用する必要がありますshellId。
接続は以下をサポートします。
| 機能 | 説明 |
|---|---|
|
永続状態 |
環境変数、作業ディレクトリ、コマンド履歴は、同じセッション内の入力にまたがります。 |
|
再接続 |
切断後に同じシェルに再接続 |
|
複数の同時シェル |
ランタイムあたり最大 10 のアクティブなシェルセッション (ターミナル)。容量が の場合、新しい接続は拒否されます。 |
前提条件
-
bedrock-agentcore:InvokeAgentRuntimeCommandShellIAM 許可 -
ランタイムが 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
例
再接続
一般的なパターンは、切断後に を使用してシェルに再接続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、サービスは最大 256 KB の最近の出力を再生します。これにより、コンテキストを失うことなく、ネットワークの中断から回復できます。シェルプロセスは切断中も実行され続けます。 - セッション制限
-
ランタイムに 10 個のシェルセッション (ターミナル) がすでに開いている場合、新しい接続はエラーで拒否されます。新しいセッションを開く前に、既存のセッションを閉じる必要があります。
セキュリティに関する考慮事項
ヒント
すべてのランタイムセキュリティレコメンデーションの統合ビューについては、AgentCore ランタイムのセキュリティのベストプラクティス」を参照してください。
重要
責任 AWS 共有モデルでは、ユーザーは AgentCore ランタイムセッションで実行するコマンドに責任を負います。 は、microVM レベルで安全なインフラストラクチャと分離 AWS を提供します。実行するコマンド、処理するデータ、および設定したアクセスコントロールは、お客様の責任となります。
シェルセッション (ターミナル) のセキュリティ境界は microVM です。各 AgentCore ランタイムセッションは、独自のカーネル、メモリ、ファイルシステムを持つ分離されたmicroVM で実行されます。シェルセッションは、他の顧客のワークロードにアクセスしたり、VM の境界からエスケープしたりすることはできません。ただし、VM 内では、シェルコマンドはコンテナファイルシステム、および設定した認証情報またはシークレットにフルアクセスできます。
CloudWatch Logs を使用した監査
AgentCore Runtime は、リクエスト ID と接続メタデータをエージェントの Amazon CloudWatch Logs ロググループに送信します。これらのログを使用して、シェル接続アクティビティをモニタリングし、監査証跡を維持できます。ターミナル I/O コンテンツ (stdin/stdout) はクライアントにストリーミングされ、サービスによってログに記録されません。
CloudTrail を使用した監査
AWS CloudTrail は、アカウントに InvokeAgentRuntimeCommandShell API コールを記録します。各レコードには、発信者 ID、タイムスタンプ、送信元 IP アドレス、応答ステータスなどのメタデータが含まれます。CloudTrail はリクエストまたはレスポンスペイロードを記録しません。CloudTrail を使用して、シェルセッションを開いたユーザーとタイミングを監査し、接続の詳細のリクエスト ID を使用して CloudWatch Logs と関連付けます。
機密性の高いワークロードの場合は、次のような追加のコントロールを実装することを検討してください。
-
IAM ポリシーを使用して呼び出せるプリンシパルを制限する
InvokeAgentRuntimeCommandShell -
ネットワーク内にトラフィックを保持するように VPC エンドポイントを設定する
-
予期しない接続パターンを検出するための CloudWatch Logs メトリクスフィルターとアラームの設定
-
CloudTrail ログの不正アクセスの試みを定期的に確認する
エラー処理
シェルセッション接続を確立すると、WebSocket のアップグレード中に次のエラーが発生することがあります。
- ValidationException
-
リクエストパラメータが無効である場合に発生します。これは、セッション ID が 33 文字未満の場合、この機能がターゲットリージョンで有効になっていない場合、またはエージェントが READY 状態になっていない場合に発生する可能性があります。
- AccessDeniedException
-
必要なアクセス許可がない場合に発生します。IAM ポリシーに アクセス
bedrock-agentcore:InvokeAgentRuntimeCommandShell許可が含まれていることを確認します。 - ResourceNotFoundException
-
指定されたエージェントのランタイムが見つからない場合に発生します。ランタイム ARN が正しいことを確認します。
- RuntimeClientError (424)
-
いくつかのシナリオで発生します。(1) 最大同時シェルセッション (ターミナル) 到達 (10 オープン) — 既存のセッションを閉じて再試行します。(2) シェル ID 形式が無効です — 1~128 文字の英数字、アンダースコア、またはハイフンである必要があります。(3) ランタイムに到達できない — バックオフ後に再試行します。レスポンス本文の JSON
errorフィールドを解析して原因を区別します。 - ThrottlingException
-
API レート制限を超えたときに発生します。エクスポネンシャルバックオフと再試行ロジックを実装します。
- ConflictException
-
もう 1 つの接続は、同じ
shellIdを同時に取得することです。1 秒後に再試行します。これは狭いレース条件 (永続状態ではない) であり、再試行するとすぐに解決されます。
接続後、次のクローズコードは接続が終了した理由を示します。
| コード | 意味 | クライアントアクション |
|---|---|---|
|
|
通常の閉鎖 — シェルがクリーンまたは正常に切断されました |
「切断済み」を表示します。通常の終了。 |
|
|
離れる — サーバーのデプロイまたはシャットダウン |
保存された と自動再接続します |
|
|
サポートされていないデータ — 5 つの連続したテキストフレームの後に送信される (バイナリのみのプロトコル) |
自動再接続しないでください。バイナリフレームに切り替えます。 |
|
|
異常な閉鎖 — 閉鎖フレームが受信されない場合にローカルで合成されます (ネットワーク死、TCP RST) |
保存された と自動再接続します |
|
|
ポリシー違反 — 接続 TTL の有効期限が切れた (1 時間)、フレームレート制限を超えた (250 フレーム/秒)、または書き込みバッファオーバーフロー |
TTL の有効期限の自動再接続 (再接続時の新しい TTL)。レート制限の場合: バックオフしてから再接続します。 |
|
|
メッセージが多すぎる — フレームペイロードが 64 KB を超えました |
フレームサイズ (チャンク <64 KB) を小さくしてから、再接続します。セッションはまだ有効です。 |
|
|
サーバーエラー — 予期しない内部障害 |
バックオフで再試行します。 |
|
|
置き換え済み — 同じ に接続された別のクライアント |
自動再接続しないでください。「別のクライアントからアタッチされたセッション」を表示します。 |
ベストプラクティス
を使用する場合は、次のベストプラクティスに従ってくださいInvokeAgentRuntimeCommandShell。
-
再接続を有効にするには、論理セッションごとに一意の
shellId(UUID など) を使用します。をクライアント側shellIdで保存します。 -
SDK
ReconnectConfigで を使用して、手動再接続ロジックなしで一時的なネットワーク中断を自動的に処理します。 -
出力フレームをすぐに読み取ります。クライアントが遅れると、サーバーの書き込みバッファがいっぱいになり、接続はコード で閉じられます
1008。 -
大きな入力 (ファイルの貼り付けなど) の場合、クローズコード を避けるために、コンテンツをフレームあたり 64 KB 未満のチャンクに分割します
1009。 -
適切な接続タイムアウトを設定します。最大接続時間は 1 時間です。同じ を使用して再接続
shellIdし、それ以降も続行します。 -
完了したら、セッションを明示的に終了します。デタッチされたセッションは、10 セッションの制限にカウントされます。
クォータと制限
| 制限 | 値 | 説明 |
|---|---|---|
|
最大フレームペイロードサイズ |
64 KB |
この制限を超えるフレームは、クローズコード になります |
|
フレームレート |
250 フレーム/秒 |
この値を超えると、クローズコード がトリガーされます |
|
最大接続時間 |
1 時間 |
接続はコード で終了します |
|
ランタイムあたりの同時シェルセッション (ターミナル) |
10 |
10 個のセッションがすでに開いている場合、新しい接続は拒否されます。既存のセッションを閉じて、再試行します。 |
|
再接続バッファ |
256 KB |
シェルに再接続するときに再生される最大出力。 |
完全なサービス制限については、「Amazon Bedrock AgentCore のクォータ」を参照してください。