
【第6回】AWS Systems Manager攻略マニュアル「Session Manager応用編:権限設定、ハイブリッド環境」
Ops Todayでは「面倒なAWSシステム運用を効率化しよう!」をテーマに、AWSリソースを含むシステムの運用をする際に便利なサービス「AWS Systems Manager」に関する記事を複数回にわたってご紹介しています。(記事一覧はこちら)
今回はSession Managerの応用的な使い方に踏み込み、権限設定やハイブリッド環境へのセッション開始、セッションドキュメントについて解説します。
運用ユーザの権限設定を制限する
Session Manager基本編の記事では、Session Managerを利用したEC2インスタンスへのリモートデスクトップ接続を解説しました。
その手順の中でIAMサービスによるアクセス権限制御に関して触れましたが、IAMサービスによる権限設定をうまく活用することでSession Manager の利点でもある高いセキュリティ性をより高めることができます。
Session Managerからの操作を制限する
次のIAMポリシーを適用したIAMユーザーは、Session ManagerコンソールとFleet Managerコンソールからのみ、セッションを開始および再開できます。
※斜体文字で記述している部分(region,account-id,instance-id)は、ご使用の環境に合わせて置き換えてください。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ssm:StartSession"
],
"Resource": [
"arn:aws:ec2:region:account-id:instance/instance-id",
"arn:aws:ssm:region:account-id:document/SSM-SessionManagerRunShell"
]
},
{
"Effect": "Allow",
"Action": [
"ssm:DescribeSessions",
"ssm:GetConnectionStatus",
"ssm:DescribeInstanceProperties",
"ssm:StartSession",
"ec2:DescribeInstances"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"ssm:TerminateSession",
"ssm:ResumeSession"
],
"Resource": [
"arn:aws:ssm:*:*:session/${aws:userid}-*"
]
}
]
}
上記IAMポリシーのみ適用したIAMユーザーでAWSマネジメントコンソールにログインし、AWS Systems Managerに接続してみます。
Session Managerの操作権限以外付与していない場合、次のようなメッセージが表示され権限が制限されていることを確認できます。

▼権限が制限されている旨のメッセージ

Session Managerにアクセスすると、特に権限が制御されているようなメッセージは表示されず、問題なく操作できそうです。セッションを開始してみます。

問題なくセッションを開始することができました。

次に、EC2サービスのコンソールよりSession ManagerによるEC2インスタンスへの接続を試みます。当該IAMポリシーは、Session ManagerコンソールとFleet Managerコンソールからのみ接続を許可しています。EC2コンソールからは操作が制限されているか確認してみましょう。
EC2サービスのダッシュボードに移動してみると、操作権限が無いことから各機能でAPIエラーが発生していました。

Session Managerによるインスタンスへの接続画面まで移動してみると、次の通り権限が制御されて接続操作ができない状態になっていました。

このように、IAMポリシーの内容を変えることで、機能ごとに利用権限を制御できます。ここで紹介したSession ManagerやFleet Managerからの操作のみに絞る以外にも、EC2コンソールからの接続操作のみ許可したり、AWS CLIからの操作のみ許可することもできます。
AWSの公式ユーザーガイドにて、Session Managerに関するIAMサンプルポリシーが公開されていますので、参考に作成してみてください(公式ユーザーガイドで公開されているサンプルポリシーですが、あくまでもサンプルなので必ず動作確認をしてください)。
IAMポリシーをグループ単位で設定するなどしてうまく活用すれば、Session Managerを利用するエンドユーザーの管理も容易になり便利です。
ハイブリッド環境に対するSession Managerでの接続
前回の記事では、EC2インスタンスに対してSession Managerで接続してみましたが、Session Managerはオンプレミスのマシンやマルチクラウドのインスタンスも対象としてノード管理できるのが特徴です。
EC2インスタンスに接続する場合と、設定内容が少し変わるので、オンプレミスのマシンへ接続する場合を例に設定手順を解説します。
前提条件を満たす
Session Managerの利用を始める前に、クリアすべき前提条件があります。
- マネージドノードにSSMエージェントをインストールしていること
- マネージドノードから特定のVPCエンドポイントへの接続を許可していること ※1
- 操作端末にAWS CLIをインストールしていること ※2
- アドバンスインスタンスティアを有効化すること ※3
- IAMサービスロールの権限確認 ※3
※1:NATゲートウェイを使用せずに接続する場合のみ必要な条件
※2:AWS CLIを利用する場合のみ必要な前提条件
※3:ハイブリッド、マルチクラウドの場合のみ必要な前提条件
SSMエージェントをインストールする手順は、第2回の記事にまとめていますので参考にしてください。
前回、EC2インスタンスに接続した手順にて満たした前提条件に加え、”アドバンスインスタンスティアの有効化”、”IAMサービスロールの権限確認”が必要となります。
アドバンスインスタンスティアの概要
EC2インスタンス以外のノードにSession Managerを使用して接続する場合、アドバンスインスタンスティアの有効化は必須です。
アドバンスインスタンスティアは有料であり、アドバンスドインスタンスティアを有効化する非EC2インスタンスごとに時間あたり0.00695 USDの料金が掛かります。
アドバンスインスタンスティアの有効化
Session Managerを開始しましょう。AWS Systems Managerのコンソールへ移動し、ナビゲーションペインより「ノード管理(ノードツール)」>「フリートマネージャー」をクリックします。

フリートマネージャー画面の右上にある「設定」をクリックし、表示されるメニューより「インスタンスティアの設定を変更」をクリックします。

アドバンスインスタンスへの変更を承諾するチェックボックスにチェックを入れ、設定を変更をクリックします。この操作により、アカウントおよびリージョンで管理するすべてのオンプレミスマシンが、アドバンスインスタンスとなります。

アドバンスインスタンスティアへの変更が完了すると、フリートマネージャーの画面にて次のメッセージが表示されます。

また、フリートマネージャー画面のインスタンステーブル上に「アドバンストインスタンス」のマークが表示されるようになります。

オンプレミスマシンへのセッション開始検証
Session Managerへ移動し、オンプレミスマシンを選択してセッションを開始します。
Linuxマシンの場合

Windowsマシンの場合

SSMドキュメントの作成
Session Managerでは、セッションドキュメントを使用してマネージドノードへのセッションを開始することができます。
セッションドキュメントとは、Session Managerで開始するセッションの設定を定義しドキュメント化したものです。セッションドキュメントを使用することで、データの暗号化、セッション期間、ログ記録、セッション開始時に実行するコマンドなどのセッションオプションを設定することができます。
例えば、セッションのログ情報をS3バケットやCloudWatch Logsのロググループを指定して保存することも可能です。
AWSアカウントやAWSリージョン単位で、すべてのセッションのテンプレートとなる一般的な設定を定義するセッションドキュメントを作成したり、または個々のセッション単位で設定を定義するセッションドキュメントを作成することもできます。
セッションドキュメントの作り方
まずは、セッションドキュメントのサンプルを共有します。セッションドキュメントは.json 拡張子のファイルとして作成します。
{
"schemaVersion": "1.0",
"description": "Document to hold regional settings for Session Manager",
"sessionType": "Standard_Stream",
"inputs": {
"s3BucketName": "ssm-session-manager-bucket",
"s3KeyPrefix": "SessionManager",
"s3EncryptionEnabled": false,
"cloudWatchLogGroupName": "LogGroup-SessionManager",
"cloudWatchEncryptionEnabled": false,
"cloudWatchStreamingEnabled": false,
"runAsEnabled": false,
"runAsDefaultUser": "",
"idleSessionTimeout": "",
"maxSessionDuration": "",
"shellProfile": {
"windows": "date",
"linux": "date"
}
}
}
それぞれのスキーマについて、概要をまとめました。
◆印が付いたスキーマは定義必須です。
スキーマ | 概要 |
---|---|
schemaVersion◆ | セッションドキュメントのスキーマバージョン ※version 1.0のみサポートしているので“1.0”と定義しましょう |
description | セッションドキュメントに指定する説明です |
sessionType◆ | 確立するセッションのタイプです SessinManagerの設定を行う場合は“Standard_Stream”と定義する必要があります |
inputs◆ ※1 | セッションに関する設定を定義します inputsブロックにセッションの具体的な設定を定義します |
s3BucketName | セッション終了時にセッションログ送信先となるS3バケット名です |
s3KeyPrefix | S3バケットへのログ送信時に使用するプレフィックスです |
s3EncryptionEnabled | “true”にすると送信先S3バケットの暗号化が有効化されます |
cloudWatchLogGroupName | セッション終了時にセッションログ送信先となるCloudWatch Logsグループ名です |
cloudWatchEncryptionEnabled | “true”にすると送信先CloudWatch Logsグループの暗号化が有効化されます |
runAsEnabled◆ | “true”に設定すると接続先マネージドノードに存在するユーザを指 定する必要があります※2 |
runAsDefaultUser | セッション開始に使用するユーザー名を指定します※3 |
idleSessionTimeout | セッションで許可するアイドル時間を分単位で指定します※4 |
maxSessionDuration | セッションで許可する最大接続時間を分単位で指定します※5 |
shellProfile | セッションで適用されるOSの環境設定を指定します 接続先マネージドノードのOSに合わせてWindows、Linuxで指定します |
※1:sessionTypeスキーマが”Standard_Stream”である場合に必須です。
※2:Linuxマネージドノードでのみサポートされ、既定でssm-userが使用されます。
※3:runAsDefaultUserをtrueに設定した場合に指定することができます。
※4:1~60の範囲で指定できます。
※5:1~1440の範囲で指定できます。
各スキーマの詳細や他のスキーマについては、AWSが公開している「Session document schema」を参考にしてください。
作成したセッションファイルを基にセッションドキュメントを作成するには、aws ssm create-document コマンドを実行します。Windows操作端末から実行する場合、コマンドプロンプトにて次のコマンドを実行してください(以降、記述するコマンドはすべてWindowsコマンドプロンプトから実行する例です)。
aws ssm create-document --name [セッションドキュメント名] --content "file://[セッションファイルのパス]" --document-type "Session" --document-format JSON
コマンドが正常に実行されると次の出力結果を返します。

{
"DocumentDescription": {
"Hash": "[ハッシュ値]”, ※自動生成される
"HashType": "Sha256",
"Name": "[セッションドキュメント名]",
"Owner": "[AWSアカウントID]",
"CreatedDate": [作成日付], ※自動生成される
"Status": "Creating",
"DocumentVersion": "1",
"PlatformTypes": [
"Windows",
"Linux",
"MacOS"
],
"DocumentType": "Session",
"SchemaVersion": "1.0",
"LatestVersion": "1",
"DefaultVersion": "1",
"DocumentFormat": "JSON",
"Tags": []
}
}
作成したセッションドキュメントの内容を確認するには、次のコマンドを実行します。
aws ssm describe-document --name [セッションドキュメント名]
このコマンドは、指定したセッションドキュメントの内容を出力します。
実行すると、次のような出力結果が得られます。

セッションドキュメントを作成した時の出力内容と同じものが出力されました。
指定したセッションドキュメントが存在しない場合、次のように“Document with name [セッションドキュメント名] does not exist” が出力されます。
![指定したセッションドキュメントが存在しない場合、次のように“Document with name [セッションドキュメント名] does not exist” が出力される](https://ops-today.com/wp-content/uploads/2024/12/image-252-1024x157.png)
セッションドキュメントを利用したセッションの開始
セッションドキュメントを利用してセッションを開始する場合は、aws ssm start-sessionコマンドを実行します。
aws ssm start-session --target [接続するインスタンスID] --document-name [セッションドキュメント名]
セッションの開始に成功すると、接続先インスタンスのプロンプトが出力されます。セッションドキュメントでshellProfileによるコマンド実行等設定している場合は、セッションが開始すると共に環境設定やコマンド実行が行われます。
aws ssm start-session 実行例

セッションドキュメントに関するコマンドと実行権限
aws ssm コマンドには、他にも様々なコマンドが用意されています。
コマンドの詳細は、AWS公式が公開しているコマンドリファレンスを参照してください。
とりあえず、使用頻度が高いものをピックアップすると、次のようなコマンドは使用頻度が高いと思います(コマンドの詳細や指定が必要な引数は、各コマンドに “?” や “help” を付けて実行することで確認できます)。
aws ssm create-document | セッションドキュメントを作成します |
aws ssm update-document | セッションドキュメントを更新します |
aws ssm delete-document | セッションドキュメントを削除します |
aws ssm describe-document | セッションドキュメントを表示します |
これらのコマンドを実行することで、セッションドキュメントの参照や更新をコマンドで容易にできます。ただ、コマンドを実行した際に実行権限でエラー(AccessDeniedException)となる場合があります。

このエラーが発生した場合は、aws ssm を実行しているIAMユーザー(aws configureコマンドでアクセスキーを設定したIAMユーザー)に関連付けられた、IAMポリシーの設定を見直す必要があります。エラー文の最後に次のような箇所があります。
document/[セッションドキュメント名] because no identity-based policy allows the ssm:XXXXXXXX action
“ssm:XXXXXXXX”の部分が、IAMポリシーで許可するべき実行権限です。IAMポリシーに追加しましょう。

ポリシーの変更によってコマンド実行に必要な権限が付与されると、エラーが解消します。

さいごに
今回は「AWS Systems Managerフル攻略マニュアル」の第6回ということで、Session Managerにおける権限設定やセッションドキュメントを解説しました。
解説した内容をしっかりと自身のモノにすることで、Session Managerの便利な点を享受することができ、より安心安全にマネージドノードを管理できるようになります。
セッションドキュメントについても、慣れないうちは苦戦するかもしれませんが、使いこなせるようになると大変使い勝手がよく便利で、管理するマネージドノードの数が多い環境などでは日々の運用を助けるツールになり得ると考えます。これを機に是非習得してみてください。