Session Managerを長時間繋ぎっぱなしにする
Systems Managerで接続して、長い時間スクリプトを動かしっぱなしにできるのか?という話があり、少し検証してみた。
結論としては、アイドルセッションのタイムアウトさえ突破できるなら、日レベルで繋ぎっぱなしにすることは出来そう。
仕組み
気にするべきタイムアウトはいくつかある。大きくは以下の2種類で、これが色々なレイヤーで設定されている。
- アイドル状態の時間
- セッション自体の最大長
アイドル状態の時間
- TCPの接続時間。通常は2時間くらいに設定されていることが多い
sysctl net.ipv4.tcp_keepalive_{time,intvl,probes}で確認可能
- その他ネットワーク経路上のセッション時間。構成により千差万別だけど、1分〜数時間とかが多い模様。あくまでもアイドルなセッションが切られるまでの時間
- SSH自体のアイドル状態。OpenSSHの場合は
ClientAliveInterval,ClientAliveCountMax,ServerAliveInterval,TCPKeepAliveなどの設定が該当するTCPKeepAliveはデフォルトではyesになっているので、裏のTCPの接続は維持しようとするみたい
- Session Managerのアイドルセッションのタイムアウト値
セッション自体の最大時間
- SSH自体にはセッションの最大長という概念はないらしい
- Session Managerの最大セッション時間は設定可能。デフォルトでは無限
- AWS側のセッションについては以下がある。が、Session Managerで確立したトンネルが生きている限り、↓が使われることはない
- Identity Centerのログインのトークン有効期限。現状は12時間に設定。新たに
AssumeRoleWithWebIdentityとかをするときに必要になる - STSの一時的なトークンの有効期限。何かしらAWSのAPIを再度叩く際に必要になる。こちらも12時間かな…?
- Identity Centerのログインのトークン有効期限。現状は12時間に設定。新たに
実験
以下のように、Session Managerで接続して、2分おきにClient - Server間で何かしら通信ができるようにしておく。
この結果、週末を挟んでもSSHのセッションとしては生きていた。
❯ aws ssm start-session --target i-0123456789abcdef12
Starting session with SessionId: myuser-53f8buxoot4uvcda2jnqdc88bu
sh-4.2$ bash
[ssm-user@ip-192-168-0-10 bin]$ while true; do echo "$(date --rfc-3339 s) I'm alive"; sleep 120; done
2026-01-30 06:59:28+00:00 I'm alive
2026-01-30 07:01:28+00:00 I'm alive
2026-01-30 07:03:28+00:00 I'm alive
2026-01-30 07:05:28+00:00 I'm alive
2026-01-30 07:07:28+00:00 I'm alive
# ...
2026-02-01 23:43:32+00:00 I'm alive
2026-02-01 23:45:32+00:00 I'm alive
2026-02-01 23:47:32+00:00 I'm alive
2026-02-01 23:49:32+00:00 I'm alive
2026-02-01 23:51:32+00:00 I'm alive
^C
[ssm-user@ip-192-168-0-10 bin]$ pwd
/usr/bin