Lambda MicroVMsのSHELL_INGRESSでブラウザーからシェルアクセスを試してみた
- URL: https://dev.classmethod.jp/articles/lambda-microvms-shell-ingress-browser-webshell
- 日付: 2026-06-23
- Tier: Tier 2
- 要旨: Lambda MicroVMsの SHELL_INGRESS 機能でブラウザからリモートシェルアクセスを実装。WebSocket接続でトークン認証し、xterm.js + aiohttp リレーサーバーでターミナルをブラウザ提供。MicroVM内部は Amazon Linux 2023・Kernel 6.1・Graviton4相当 4vCPU・8GB RAM(Swap無)・ext4 8GB。セキュリティ強化としてカーネルモジュール・kexec禁止、DAMON メモリ回収有効。PID 1は sleep infinity のまま、シェルアクセスごとに新規PTY生成。
詳細
HTTP_INGRESS がアプリケーション用のHTTP/HTTPS プロトコル。SHELL_INGRESS はデバッグ・管理・ターミナル用の WebSocket インターフェース。SHELL_INGRESS は認証トークン(create-microvm-shell-auth-token)で、初回接続時に session_init フレーム(JSON)返却。入力はバイナリフレーム(生テキスト)、出力もバイナリフレーム(生PTY)。ウィンドウリサイズはテキストフレーム {type: resize, cols, rows}。
ブラウザのWebSocket APIはカスタムヘッダ非対応のため、リレーサーバー(aiohttp)で仲介。ブラウザ↔localhost:3000 ws://→リレー↔MicroVM wss:// + X-aws-proxy-auth。フロント は xterm.js で ターミナル実装。
MicroVM 内部仕様。CPU は ARM Neoverse V2(Graviton4相当)4vCPU、メモリ8GB(Swap 0)、ディスク ext4 8GB。ブートパラメータでカーネルモジュールロード禁止(modules_disabled=1)・kexec禁止(kexec_load_disabled=1)・メモリ回収 DAMON 有効(damon_reclaim.enabled=Y)。
マウント構成では /sys は ro、/etc/resolv.conf・/etc/hosts は overlayfs (upper:vdb)でプラットフォーム側差し込み可能。3つの virtio ブロックデバイス(vda/vdb/vdc)。vda がinitial boot、vdb がoverlay upper layer、vdc(8GB ext4)が最終 root。カーネル 6.1.166、OS Amazon Linux 2023。
デバイス /dev に sysgenid(minor 125)があり、VM スナップショット resume・clone 検出に利用。プロセス PID 1 は sleep infinity で、SHELL_INGRESS接続時に pts/N でbashセッション新規生成。ネットワーク eth0 に IPv6 グローバルアドレス割り当て(INTERNET_EGRESS有効時)。