AWS
session-manager

AWS Session Manager (cli)におけるネットワーク切断時の挙動

動機

AWS Session Manager を使うと、踏み台サーバが不要になる。
踏み台サーバを利用する場合は、不意に ssh 接続が切断されてしまった場合に備えて踏み台サーバ上で tmux や screen などのターミナルマルチプレクサを利用することが多かったと思うが、Session Manager の場合は不意にネットワークが切断されてしまった場合にどのような状態になるのか気になった。

結論

自動的に再接続され、ネットワークが切断されていた間の出力も失われない。

実験結果

以下は、手元の Mac から aws ssm start-session --target i-xxxxxxxx した直後の画面。
そこで、while sleep 1; do date ; done というワンライナーを実行した。(1 秒毎に date を実行)
その途中で、意図的に Wi-Fi を切断すると出力が止まる。
数秒後に、Wi-Fi に再接続すると、その間に実行されていた date の結果もごそっと出力される。

session_manager.gif

調査メモ

resume-session という API が存在する

aws-cli で、aws ssm resume-session --session-id xxxxxxx などとするとレジュームできるのかと思って試してみた。
出力のひとつの StreamUrlwss:// で始まる URL となっており WebSocket で実現されている様子。

https://dev.classmethod.jp/cloud/aws/ssm-session-manager-release/

一言で言えば、「EC2インスタンスにSSH・RDPで接続せずにブラウザ上からCLI操作ができる機能」です。ブラウザがSSHクライアントとして動作している訳でなく、制御はSSMによって実現されています。

SSM が WebSocket を扱っているイメージでしょうか。

https://docs.aws.amazon.com/cli/latest/reference/ssm/resume-session.html

ドキュメントには、Note として以下のような記載があった。

This command is primarily for use by client machines to automatically reconnect during intermittent network issues. It is not intended for any other use.