こんにちは😺 技術課の山本です。
Systems Manager のセッションマネージャー機能における ResumeSession 権限について、お問合せいただいたので、調べました。
ResumeSession は IAM ユーザーにセッションマネージャーへのアクセスを許可する際に付与する権限の一つです。
以下のサンプルポリシーにも記載があります。
Session Manager の追加サンプル IAM ポリシー - AWS Systems Manager
- Systems Manager のセッションマネージャー機能における ResumeSession 権限
- ResumeSession 権限を付与した際の動作を検証する
- ResumeSession が発生した際の動作を検証する
- まとめ
- ご参考:検証に用いた IAM ポリシー
- 余談
Systems Manager のセッションマネージャー機能における ResumeSession 権限
セッションに断続的なネットワーク断があった際に「 切断されたセッション 」を再開するための権限になります。
「 終了したセッション 」は再開できません。
「切断されたセッション」と「終了したセッション」の差異については、後述いたします。
参考:セッションを再開する
セッションが切断された後、管理対象ノードにセッションを再接続します。切断されたセッションの接続は再開できますが、終了したセッションは再開できません
ResumeSession 権限を付与した際の動作を検証する
セッション接続用に EC2 ( Windows ) を使用し、以下 1〜4 を検証しました。
- セッション中に EC2 上の SSM Agent のサービス (AmazonSSMAgent) について、停止・起動を繰り返す
- セッション中に EC2 上の SSM Agent のプロセス ( セッションごとに 1 プロセス起動する ssm-session-worker.exe ) を終了する
- セッション中に負荷ツールを使用し、EC2 インスタンスのCPUやメモリを逼迫した状態とする
- セッション中に接続元のノートPC ( MAC Book Pro M2 ) を開閉する(スリープ状態にして解除する)
上の 1〜4 について、以下 2 パターンのセッション作成方法で検証しました。
- AWS マネジメントコンソールから、Systems Manager のセッションマネージャを使用し、セッションを作成する方法 ( WEBブラウザは Google Chrome を使用します。)
- AWS CLI ( aws ssm start-session ) を使用し、セッションを作成する方法
検証結果
- SSM Agent サービスの停止・起動では、セッションへの影響がありませんでした。サービスが停止しても、実行中のセッションに関するプロセスに影響がありませんでした。サービス停止の影響としては、新規セッションは作成できなくなりました。
- SSM Agent のプロセスを終了したタイミングでセッションも「終了」状態になりました。「終了」状態のため RessumeSession は起きませんでした。プロセスをハングさせて、セッションを「切断」しようと考えたものの、 Windows では簡単に SIGINT を送る方法がなかったため、断念しました。
- EC2 に負荷を掛けてもセッションへの影響がありませんでした。一時的にセッションが固まることがあるものの、負荷を下げた際に ResumeSession は起きませんでした。
- ノートPC ( MAC Book Pro M2 ) を開閉する(スリープ状態にして解除する)と、「切断」が発生し、ResumeSession を再現できました。 AWS マネジメントコンソールから、Systems Manager のセッションマネージャを使用した場合のみ、再現できました。 ( AWS CLI では不可でした。 )
検証結果から考察できること
ノート PC ( MAC Book Pro M2 ) を閉じるときには、Google Chrome 上の AWSマネジメントコンソールで開いているセッションマネージャーの接続が切れる仕様のようでした。また、 ノートPC を開いたタイミングで接続を再開する仕様 のようです。
一方でノート PC を閉じるときにターミナルソフトウェアで実行している AWS CLI の接続は切れないようです。そのため、AWS CLI で ResumeSession を再現できませんでした。
以上より、 PCがスリープ状態になった際に接続が切れ、解除した場合に接続が復旧するアプリケーション上で、セッションマネージャーを実行している場合には ResumeSession を再現できそう です。
ResumeSession が発生した際の動作を検証する
前提として、以下2種類の IAM ユーザーを用意し、動作確認をしました。
- ResumeSession 権限が ある IAM ユーザー
- ResumeSession 権限の ない IAM ユーザー
1つ目の動作検証内容
適当なループ処理を用意し、実行中に ResumeSession (PCスリープ→解除)を発生させ、コマンドが再開するかどうかを確認しました。
また、コマンドの実行ログを test.txt に残しました。
$a=@(1,2,3,4,5,6,7,8,9,10,11,12,13) foreach($i in $a) {sleep $i; echo $i; echo $i >> test.txt}
2つ目の動作検証内容
コマンドの打ち込み中に、 ResumeSession (PCスリープ→解除)を発生させ、打ち込み中の内容が復旧するかどうかを確認しました。
1. ResumeSession 権限がある場合
PCスリープからの復旧後にセッションが自動復旧 ( ResumeSession )し、実行中のコマンドが再開されました。
ログにも実行したコマンドの結果が過不足なく出ていました。
打ち込み中のコマンドがある場合にも内容が復旧していました。
また、スリープ解除時に CloudTrail イベント として RessumeSession イベントが出ていました。 成功のため、エラーコードはありませんでした。
2. ResumeSession 権限がない場合
PCスリープからの復旧後に、セッションが終了していました。
しかし、「セッションが終了されました」というポップアップがでている裏(バックグラウンド)では、 スリープする前に実行していたコマンドが最後まで動いていました。
新しく作成したセッションで確認すると、ログには実行したコマンドの結果が、中断することなく最後まで出ていました。
「セッションが終了されました」というポップアップがでている際に、AWSマネジメントコンソールで Session Manager のステータスを確認しても、「接続済み」になっています。
該当セッション に紐づく SSM Agent のプロセスも生きています。
「切断されたセッション」を ResumeSession で再接続できない時には、「終了したセッション」にはならないのだと思われます。 「終了したセッション」にならない限り、既に実行中のコマンドは中断されません。 実行し続けます。
「終了したセッション」にするためには「終了」ボタンを押します。
または、以下のコマンドを実行します。
aws ssm terminate-session \ --session-id session-id
参考:セッションを終了する - AWS Systems Manager
なお、セッションマネージャーにはアイドルタイムアウトがあります。アイドルタイムアウトを超過した場合にも、実行中のコマンドが中断され「 終了したセッション 」状態になります。 以下の記事もご参照ください。 blog.serverworks.co.jp
「セッションが終了しました」というポップアップがでているため、 打ち込み中のコマンドは復旧できませんでした。 「切断されたセッション」状態になっているため、RessumeSession できない限り、新規コマンドは実行できません。
また、スリープ解除時に RessumeSession の API を実行した CloudTrail イベントが出ていました。 エラーコードが AccessDenied (アクセス拒否)になっていました。
まとめ
ResumeSession 権限は、ネットワーク接続断からの復旧時に、切れたセッションを復旧させる権限です。
ResumeSession を発生させる簡単な方法としては、AWSマネジメントコンソールからセッション接続し、接続元の PC をスリープ状態にして、解除することです。
RessumeSession の権限があり、切れたセッションを復元できると、打ち込み途中だったコマンドを実行できたり、復元したセッションで新しいコマンドを実行できます。
RessumeSession の権限がない時には、「切断されたセッション」状態になります。「切断されたセッション」状態では、打ち込み途中だったコマンドや、新しいコマンドは実行できません。
ネットワーク接続断が起きる前(スリープ状態にする前)に実行していたコマンドは、RessumeSession の権限があってもなくても、実行され続けます。
実行中のコマンドを強制終了するには、「終了したセッション」にする必要があります。
Session Manager のアイドルタイムアウト期間を経過した場合にも「終了したセッション」になります。
ご参考:検証に用いた IAM ポリシー
- ResumeSession 権限はない IAM ユーザー
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ssm:StartSession", "ssm:DescribeSessions", "ssm:DescribeInstanceProperties", "ec2:describeInstances", "ssm:TerminateSession" ], "Resource": [ "*" ] } ] }
- ResumeSession 権限のある IAM ユーザー
権限がないユーザーの IAM ポリシーに "ssm:ResumeSession" を追加しています。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ssm:StartSession", "ssm:DescribeSessions", "ssm:DescribeInstanceProperties", "ssm:ResumeSession", "ec2:describeInstances", "ssm:TerminateSession" ], "Resource": [ "*" ] } ] }
余談
残雪の平標山(新潟・群馬)から見た、苗場山です。2022年のものです。自分で見ていて癒やされたので掲載します。
山本 哲也 (記事一覧)
カスタマーサクセス部のエンジニア。2024 Japan AWS Top Engineers に選んでもらいました。
今年の目標は Advanced Networking – Specialty と Machine Learning - Specialty を取得することです。
山を走るのが趣味です。今年の目標は 100 km と 100 mile を完走することです。 100 km は Gran Trail みなかみで完走しました。残すは OSJ koumi 100 で 100 mile 走ります。実際には 175 km らしいです。「草 100 km / mile」 もたまに企画します。
基本的にのんびりした性格です。座右の銘は「いつか着く」