0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ブラウザで Session Manager 接続した EC2 に、お手軽ファイル転送する Chrome 拡張

0
Posted at

はじめに

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. またはその関連会社の商標です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?