Systems Manager のセッションマネージャー機能における ResumeSession 権限

記事タイトルとURLをコピーする

こんにちは😺 技術課の山本です。

Systems Manager のセッションマネージャー機能における ResumeSession 権限について、お問合せいただいたので、調べました。

ResumeSession は IAM ユーザーにセッションマネージャーへのアクセスを許可する際に付与する権限の一つです。
以下のサンプルポリシーにも記載があります。
Session Manager の追加サンプル IAM ポリシー - AWS Systems Manager

Systems Manager のセッションマネージャー機能における ResumeSession 権限

セッションに断続的なネットワーク断があった際に「 切断されたセッション 」を再開するための権限になります。 「 終了したセッション 」は再開できません。
「切断されたセッション」と「終了したセッション」の差異については、後述いたします。

参考:セッションを再開する

セッションが切断された後、管理対象ノードにセッションを再接続します。切断されたセッションの接続は再開できますが、終了したセッションは再開できません

ResumeSession 権限を付与した際の動作を検証する

セッション接続用に EC2 ( Windows ) を使用し、以下 1〜4 を検証しました。

  1. セッション中に EC2 上の SSM Agent のサービス (AmazonSSMAgent) について、停止・起動を繰り返す
  2. セッション中に EC2 上の SSM Agent のプロセス ( セッションごとに 1 プロセス起動する ssm-session-worker.exe ) を終了する
  3. セッション中に負荷ツールを使用し、EC2 インスタンスのCPUやメモリを逼迫した状態とする
  4. セッション中に接続元のノートPC ( MAC Book Pro M2 ) を開閉する(スリープ状態にして解除する)

上の 1〜4 について、以下 2 パターンのセッション作成方法で検証しました。

  1. AWS マネジメントコンソールから、Systems Manager のセッションマネージャを使用し、セッションを作成する方法 ( WEBブラウザは Google Chrome を使用します。)
  2. AWS CLI ( aws ssm start-session ) を使用し、セッションを作成する方法

検証結果

  1. SSM Agent サービスの停止・起動では、セッションへの影響がありませんでした。サービスが停止しても、実行中のセッションに関するプロセスに影響がありませんでした。サービス停止の影響としては、新規セッションは作成できなくなりました。
  2. SSM Agent のプロセスを終了したタイミングでセッションも「終了」状態になりました。「終了」状態のため RessumeSession は起きませんでした。プロセスをハングさせて、セッションを「切断」しようと考えたものの、 Windows では簡単に SIGINT を送る方法がなかったため、断念しました。
  3. EC2 に負荷を掛けてもセッションへの影響がありませんでした。一時的にセッションが固まることがあるものの、負荷を下げた際に ResumeSession は起きませんでした。
  4. ノート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 ユーザーを用意し、動作確認をしました。

  1. ResumeSession 権限が ある IAM ユーザー
  2. 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 ポリシー

  1. ResumeSession 権限はない IAM ユーザー
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssm:StartSession",
                "ssm:DescribeSessions",
                "ssm:DescribeInstanceProperties",
                "ec2:describeInstances",
                "ssm:TerminateSession"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
  1. 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年のものです。自分で見ていて癒やされたので掲載します。

山本 哲也 (記事一覧)

カスタマーサクセス部のエンジニア(一応)

好きなサービス:ECS、ALB

趣味:トレラン、登山(たまに)