このページについて

AWS Systems Manager(SSM)のSession Managerのログは、CloudWatch LogsまたはS3に設定することができます。
今回は最近発表された、CloudWatch Logs低頻度アクセスにSession Managerのログを設定してみましたのでご紹介します。

Session ManagerをOSユーザ指定で使う話はこちら。
AWS Systems Manager Session ManagerをOSユーザ指定で使う

CloudWatch Logs低頻度アクセスとは

こちらのアップデートで使用可能になっているログクラスとなります。

この新しいログクラスは、アクセス頻度の低いログに対して低コストでカスタマイズされた機能セットを提供するため、お客様は費用対効果の高い方法ですべてのログを 1 か所にまとめることができます。

アクセス頻度の低いログ用の新しい Amazon CloudWatch ログクラスを割引価格で提供

料金としては、ログの保管料金はスタンダードも低頻度アクセスも変わらないものの、収集料金がスタンダードの半額となっています。
Amazon CloudWatch 料金表

低頻度アクセスログクラスを使用する際の大きな注意点として、ログイベントを直接CloudWatch Logsコンソールで確認することはできないということです。

通常は以下のようにCloudWatch Logsコンソールからログイベントを確認できますが、

低頻度アクセスログクラスのログストリームを選択すると、

CloudWatch Logs Insights に移動します。

Session Managerのログ設定

Session Managerの設定から、「CloudWatch logging」の設定があります。
この設定の下にはS3へのログ設定もありますが、今回は「CloudWatch logging」のみ触れます。

設定としては、有効化して対象のロググループを選択する流れとなります。

ログの送り方

オプションの「Stream session logs (Recommended)」は、セッション中にデータを送信してくれるので、そのまま選択しておいて問題ありません。
予期せぬ再起動などが発生した際にも、セッションが切れる前までのログが残るようになるためです。

逆に「Upload session logs」を選択すると、セッション完了後にログ保存されるため、予期せぬ再起動などでセッションが切れてしまうとログが残りません。
ちなみに、S3に保存する場合も「Upload session logs」と同様の挙動となるため注意が必要です。

その他の注意事項

前提として、必要なIAM権限付与やVPCエンドポイントはご確認ください。

Session ManagerのログをCloudWatch Logsに送ることができるように、以下のドキュメントを参考にIAMポリシーを、EC2にアタッチしているIAMロールに追加します。
Session Manager、Amazon S3、CloudWatch Logs (コンソール) の許可を持つIAM ロールの作成

必要なVPCエンドポイントは以下のドキュメントを参考にしてください。
ステップ 6: (オプション) AWS PrivateLink を使用して Session Manager の VPC エンドポイントを設定する

ログの確認方法

無事に低頻度アクセスのロググループまでログが保存できたら、クエリして中身を確認してみましょう。
対象ログストリームを選択してCloudWatch Logs Insightsに飛ばされると、以下のクエリがセットされています。

filter @logStream = 'XXXXXXXXXXXXXXXX'
| fields @timestamp, @message  
| sort @timestamp desc 
| limit 20

ログの各行を選択することで、フィールドを確認することができます。

今回は @message の中から runAsUsersessionData を抽出するようにクエリしてみました。
これにより、OSコマンドを実行するユーザと実行コマンドが見やすくなりました。

filter @logStream = 'XXXXXXXXXXXXXXXX'
| fields @timestamp, @message
| parse @message '"runAsUser":"*","sessionId":"' as runAsUser
| parse @message '"sessionData":["*"]' as sessionData
| display @timestamp,runAsUser,sessionData
| sort @timestamp asc

抽出する部分はparseを使っています。
参考ドキュメントはこちら。
CloudWatch Logs Insights を使用したログデータの分析 – CloudWatch Logs Insights のクエリ構文 – parse

おわりに

Session Managerのログ保管先にCloudWatch Logs低頻度アクセスを設定してみました。
もちろんS3に保管する方がコストは下がるのですが、ログの視認性やセッションデータのストリーミング性を考えると、CloudWatch Logs低頻度アクセスに保管するケースは十分に考えられると思います。
私自身CloudWatch Logs Insightsのクエリは慣れていませんが、まずは今回の設定を参考に触ってみていただけたら幸いです。