はじめに
Session Manager で EC2 に繋いでるとき、ファイル転送したくなることありませんか?
S3 経由や SSM ポート転送は少々面倒です。でも実は、ブラウザのターミナルにペーストするだけで転送できます。それを自動化する Chrome 拡張機能です。
ターミナルにペーストするだけで転送できる
テキストファイルなら:
echo 'Hello World' > hello.txt
これだけ。普段からやってますよね。
Base64 を使えば何でも送れます。エンコードは OS 標準コマンドでできます:
# macOS
base64 -i hello.txt
# Linux
base64 hello.txt
# Windows (PowerShell)
[Convert]::ToBase64String([IO.File]::ReadAllBytes("hello.txt"))
ターミナルに貼り付けてデコード:
echo 'SGVsbG8gV29ybGQK' | base64 -d > hello.txt
バイナリファイルも同様です。S3 不要、SSH 不要、追加権限不要。
ただし問題がある
大きなファイルを一度にペーストすると、ターミナルがフリーズします。Session Manager や CloudShell の既知の制約です。検証では 40 KB くらいまではいけますが、64 KB で固まりました。
つまり手動でチャンク分割して、1つずつ貼り付けて、順番通りに結合する必要がある。これは面倒…。
ただしこれは使い勝手の問題であって、セキュリティの問題ではありません。データの経路は手入力と同じ暗号化された Session Manager チャネルです。
Chrome 拡張機能 :SessionTransfer
というわけで、Chrome 拡張機能にしました。
アップロードは完全自動化。ファイルをドラッグ&ドロップして「ターミナルに自動送信」を押すだけです。Base64 エンコード、チャンク分割(デフォルト32KB)、ターミナルへの貼り付けまで全部自動です。
ダウンロードは半自動。コマンド送信とチャンクの結合は自動ですが、ターミナル出力のコピーだけは Ctrl+A → Ctrl+C を自分でやるしかありませんでした 😅
技術的な仕組み
Session Manager のターミナルは xterm.js ベースです。拡張機能はブラウザ内でファイルを Base64 エンコード → チャンク分割し、各チャンクを xterm.js のペーストイベントで1つずつターミナルに送信します。ダウンロードはその逆で、ターミナル出力をユーザーがクリップボードにコピーし、拡張機能がデコード・結合します。
データは AWS コンソールのページ内で処理され、外部には一切出ません。転送経路は普段のキー入力と同じ SSM の暗号化チャネルです。
コマンド送信の核心部分:
function sendToTerminal(textarea, text) {
textarea.focus();
const dt = new DataTransfer();
dt.setData('text/plain', text);
textarea.dispatchEvent(new ClipboardEvent('paste', {
clipboardData: dt, bubbles: true, cancelable: true
}));
setTimeout(() => {
textarea.dispatchEvent(new KeyboardEvent('keydown', {
key: 'Enter', code: 'Enter', keyCode: 13, bubbles: true
}));
}, 50);
}
SSM の xterm.js はペースト内容の \n や \r を無視するため、ペーストとは別に Enter キーイベントを送る必要がありました。
対応ターミナル
- AWS Systems Manager Session Manager
- EC2 Instance Connect エンドポイント(EICE)
どちらも xterm.js ベースなので同じ仕組みで動作します。
セキュリティ
- 外部へのネットワークリクエスト: ゼロ
- データ収集: なし
- すべての処理: ブラウザ内で完結
- ファイルデータの経路: 既存の SSM/EIC 暗号化セッションと同じ
コードは全て公開しています。Chromeデベロッパーツールのネットワークタブを見れば、外部通信がないことを確認できます。
インストール
Chrome Web Store:
https://chromewebstore.google.com/detail/oidfckknjcglojknepenmhdmfmmhlaca
GitHub(ソースコード):
https://github.com/qs990lab/session-transfer
おわりに
Session Manager で「ちょっとファイル送りたい」ときに、初心者に S3 経由や SSM ポートフォワードを教えるのは敷居が高いと感じていました。手動で コピー&ペーストすればできるけど面倒。その面倒な部分を自動化しただけのシンプルな拡張です。
ぜひ使ってみてください。
本拡張機能は AWS の公式製品ではありません。AWS、Amazon Web Services、Session Manager は Amazon.com, Inc. またはその関連会社の商標です。
