
Amazon Bedrock AgentCore Runtime のインタラクティブシェル機能を試してみた
はじめに
2026年6月5日のアップデートで、Amazon Bedrock AgentCore Runtime にインタラクティブシェル機能が追加されました。リモートの microVM 上で動くエージェントに対して、ローカルターミナルに近い操作感で直接接続できます。
What's New では対応エージェントとして Claude Code、OpenAI Codex、Amazon Kiro が言及されています。コーディングエージェントのデバッグや環境確認を、SSH なしで手軽に行えるのが大きなメリットです。
実際に接続すると、このようなターミナルが表示されます。
[connected · session xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx · Ctrl+D or 'exit' to quit · Ctrl+] to detach]
[agentcore-runtime-user@localhost /]$
ワンショット実行とインタラクティブシェルの比較
AgentCore Runtime のシェル実行には2つのモードがあります。
| ワンショット | インタラクティブ | |
|---|---|---|
| API | InvokeAgentRuntimeCommand | InvokeAgentRuntimeCommandShell |
| プロトコル | HTTP/2 (request-response stream) | WebSocket |
| 状態 | ステートレス | 永続(env, cwd, history) |
| 再接続 | なし | shellId で可能 |
| 接続時間 | タイムアウト設定可(1〜3,600秒) | 最大1時間。再接続で同じシェルに復帰可能 |
| 出力 | 構造化イベント(exitCode付き) | バイナリフレーム(生ターミナルI/O) |
課金について
インタラクティブシェル固有の追加料金はなく、Runtime の通常課金(Active Consumption Based)が適用されます。
- CPU: $0.0895 / vCPU-hour(実消費ベース。I/O待ちやアイドル中、バックグラウンドプロセスが動いていなければ課金なし)
- Memory: $0.00945 / GB-hour(その時点までのピーク消費メモリベース。アイドル中もメモリ課金は発生する)
「シェルを開いているだけ = 完全無料」ではない点に注意してください。
やってみた
前提条件
- Docker(ホスト側に npm/Node.js は不要)
- AWS CLI で認証済み
- CDK bootstrap 済み(対象リージョン)
- AgentCore が利用可能なリージョン(今回は us-west-2)
- エージェントフレームワーク: Strands(
agentcore create --defaultsで選択される標準フレームワーク)
今回の検証環境:
- 検証日: 2026-06-06
- AgentCore CLI:
@aws/agentcore - Docker イメージ: node:20-slim
- リージョン: us-west-2
プロジェクト作成
docker run --rm \
-v "$HOME/.aws:/root/.aws:ro" \
-v "$(pwd):/work" \
-w /work \
node:20-slim sh -c "
apt-get update -qq && apt-get install -y -qq curl python3 python3-venv > /dev/null 2>&1 &&
curl -LsSf https://astral.sh/uv/install.sh | sh > /dev/null 2>&1 &&
export PATH=\"\$HOME/.local/bin:\$PATH\" &&
npm install -g @aws/agentcore 2>/dev/null &&
agentcore create --name StrandsShellTest --defaults --skip-python-setup --skip-install --skip-git --output-dir /work 2>&1
"
agentcore create は内部で uv を使用するため、Python + uv のインストールが必要です。--defaults を指定すると Strands フレームワークでプロジェクトが生成されます。
※ Docker コンテナは使い捨てのため、各ステップで @aws/agentcore を再インストールしています。実運用では1つのコンテナ内で通しで作業するほうが効率的です。
デプロイ先の設定
agentcore/aws-targets.json を作成します。
[
{
"name": "default",
"account": "123456789012",
"region": "us-west-2"
}
]
デプロイ
docker run --rm \
-v "$HOME/.aws:/root/.aws:ro" \
-v "$(pwd)/StrandsShellTest:/work" \
-w /work \
-e AWS_REGION=us-west-2 \
node:20-slim sh -c "
apt-get update -qq && apt-get install -y -qq curl python3 python3-venv zip > /dev/null 2>&1 &&
curl -LsSf https://astral.sh/uv/install.sh | sh > /dev/null 2>&1 &&
export PATH=\"\$HOME/.local/bin:\$PATH\" &&
npm install -g @aws/agentcore 2>/dev/null &&
cd agentcore/cdk && npm install 2>/dev/null && cd /work &&
agentcore deploy -y 2>&1
"
agentcore/cdk/ 配下で npm install を実行しないと TypeScript のコンパイルに必要な依存が揃わず失敗します。デプロイが成功すると Runtime ARN が出力されます。
ApplicationAgentStrandsShellTestRuntimeArnOutput...: arn:aws:bedrock-agentcore:us-west-2:123456789012:runtime/<RUNTIME_ID>
ワンショットコマンドで動作確認
docker run --rm \
-v "$HOME/.aws:/root/.aws:ro" \
-e AWS_REGION=us-west-2 \
node:20-slim sh -c '
npm install -g @aws/agentcore 2>/dev/null &&
agentcore exec --json --runtime arn:aws:bedrock-agentcore:us-west-2:123456789012:runtime/<RUNTIME_ID> "whoami"
'
{"success":true,"exitCode":0,"stdout":"root\n","stderr":""}
ワンショットモードでは root ユーザーとして実行されました。
インタラクティブシェルに接続
インタラクティブシェルには TTY が必要なため、docker run -it で実行します。
# クレデンシャルを環境変数に展開
eval $(aws configure export-credentials --format env)
# インタラクティブシェルに接続
docker run --rm -it \
-e AWS_ACCESS_KEY_ID \
-e AWS_SECRET_ACCESS_KEY \
-e AWS_SESSION_TOKEN \
-e AWS_REGION=us-west-2 \
node:20-slim sh -c "npm install -g @aws/agentcore 2>/dev/null && \
agentcore exec --it --runtime arn:aws:bedrock-agentcore:us-west-2:123456789012:runtime/<RUNTIME_ID>"
[connected · session xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx · Ctrl+D or 'exit' to quit · Ctrl+] to detach]
[agentcore-runtime-user@localhost /]$
接続できました。公式ドキュメントによると、デタッチ(Ctrl+])後は同じ shellId で再接続が可能です。
シェルから見える実行環境
OS・CPU・メモリ
$ uname -a
Linux localhost 6.1.161-18.298.amzn2023.aarch64 #1 SMP Fri Feb 13 00:35:04 UTC 2026 aarch64 aarch64 aarch64 GNU/Linux
$ cat /etc/os-release | head -4
NAME="Amazon Linux"
VERSION="2023"
ID="amzn"
ID_LIKE="fedora"
$ python --version
Python 3.14.2
$ grep -E "^(processor|CPU implementer|CPU part)" /proc/cpuinfo
processor : 0
CPU implementer : 0x41
CPU part : 0xd40
processor : 1
CPU implementer : 0x41
CPU part : 0xd40
$ free -m
total used free shared buff/cache available
Mem: 8017 236 7334 37 445 7519
Swap: 0 0 0
- Amazon Linux 2023(カーネル 6.1)
- ARM Neoverse V1(CPU implementer 0x41 / CPU part 0xd40、Graviton3 相当と考えられる)/ 2 vCPU
- 8GB RAM / スワップなし
ディスク構成
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/root 449M 449M 0 100% /rom
devtmpfs 4.0M 0 4.0M 0% /dev
/dev/vdb 9.7G 137M 9.1G 2% /rom/overlay
overlayfs:/overlay/root 9.7G 137M 9.1G 2% /
tmpfs 4.0G 0 4.0G 0% /dev/shm
tmpfs 1.6G 216K 1.6G 1% /run
tmpfs 4.0G 37M 3.9G 1% /tmp
/rom(449MB、read-only)にベースイメージ、/dev/vdb(9.7GB)が overlay の上位レイヤーとして書き込み可能な領域を提供しています。
ファイルシステム構成
/rom/ — read-only ベースイメージ (Amazon Linux 2023)
/rom/overlay/ — overlay upper layer
/opt/aws/agentcore-runtime/ — AgentCore Runtime 関連ファイル(Python 3.14.2 含む)
/var/task/ — アプリケーションコード(デプロイしたエージェント)
/home/agentcore-runtime-user/ — インタラクティブシェルユーザーのホーム
デプロイしたコードと依存パッケージは /var/task/ にフラットに配置されていました。Lambda でも見られるパス配置ですが、AgentCore Runtime が Lambda ベースであるという意味ではありません。
ユーザーの違い
ワンショット実行とインタラクティブシェルで、実行ユーザーが異なることが確認できました。
| モード | ユーザー |
|---|---|
ワンショット (agentcore exec --json) |
root |
インタラクティブ (agentcore exec --it) |
agentcore-runtime-user |
インタラクティブシェルでは非 root ユーザーとなるため、セキュリティの観点から意図的に分離されている可能性があります。ただし、公式ドキュメントにはこの違いについて記載がありませんでした。
AWS クレデンシャルの供給方法
microVM 内の環境変数に AWS クレデンシャルは存在しませんでした。
$ env | grep AWS
(出力なし)
MMDS(MicroVM Metadata Service)経由で IAM ロールのクレデンシャルが自動供給されていました。
# トークン取得(EC2 IMDSv2 とはヘッダー名が異なる。以下が実際に応答を得られたコマンド)
TOKEN=$(curl -s -X PUT "http://169.254.169.254/latest/api/token" \
-H "X-metadata-token-ttl-seconds: 60")
# ロール確認
curl -s -H "X-metadata-token: $TOKEN" \
http://169.254.169.254/latest/meta-data/iam/security-credentials/
execution_role
execution_role という名前の IAM ロールが MMDS 経由で注入されています。boto3 などの SDK はこの種のメタデータサービスを認証プロバイダーチェーンで利用できるため、環境変数へのクレデンシャル設定は不要と考えられます。
クレデンシャルのレスポンス構造(値はマスク):
{
"Code": "Success",
"LastUpdated": "2026-06-06T02:33:25Z",
"Type": "AWS-HMAC",
"AccessKeyId": "ASIA...(masked)",
"SecretAccessKey": "(masked)",
"Token": "(masked)",
"Expiration": "2026-06-06T03:28:25Z"
}
有効期限は約55分でした。EC2 の IMDS と同様に自動更新される仕組みと考えられますが、今回の検証では更新の挙動までは確認していません。
通常のアプリケーションでは MMDS から直接クレデンシャルを取得する必要はなく、SDK の認証プロバイダーチェーンに任せるのが適切です。
microVM のメタデータから推測される実行基盤
以下のメタデータが確認できたことから、この実行環境は Firecracker ベースの microVM 上で動作している可能性が高いと考えられます。
| メタデータパス | 確認できた内容 |
|---|---|
/latest/meta-data/instance-id |
ai- プレフィックスの ID |
/latest/meta-data/placement/region |
us-west-2 |
/latest/meta-data/placement/availability-zone-id |
usw2-az2 |
/latest/meta-data/ipv6 |
IPv6 アドレス(マスク) |
/latest/meta-data/iam/security-credentials/ |
execution_role |
今回の環境で確認できた主要パッケージ
$ ls /var/task/ | grep -E "strands|boto|mcp|opentelemetry|uvicorn|pydantic" | grep dist-info
bedrock_agentcore-1.14.0.dist-info
strands_agents-1.42.0.dist-info
boto3-1.43.24.dist-info
botocore-1.43.24.dist-info
mcp-1.27.2.dist-info
opentelemetry_api-1.33.0.dist-info
uvicorn-0.49.0.dist-info
pydantic-2.13.4.dist-info
Strands テンプレートでデプロイしたため、これらが Runtime 標準パッケージなのか Strands テンプレート由来なのかは切り分けできませんでした。
まとめ
AgentCore Runtime のインタラクティブシェルにより、リモートの microVM にローカルターミナルに近い感覚で接続できるようになりました。Docker 完結でセットアップから接続まで試せることも確認できました。
今回は Strands エージェントでの接続確認と実行環境の調査まででしたが、次回は Kiro などのコーディングエージェントを AgentCore 上で動かし、インタラクティブシェル経由での実際の開発作業を試す予定です。
検証後のクリーンアップは agentcore remove all と CloudFormation スタック削除で実施してください。









