はじめに
Systems Manager の Fleet Manager を利用する機会があり、インスタンス管理やログ確認について改めて調査しました。
調べていく中で、SSM エージェントのログを CloudWatch Logs に転送できるという情報が AWS の公式ドキュメントに掲載されていることを知りました。
本記事では、その公式情報をもとに 実際に設定を行い、動作を確認した内容を紹介します。
前提条件
・対象の EC2 インスタンスはWindows Serverとします
・Fleet Manager からインスタンスが表示・操作できる状態であること
・EC2 インスタンスに SSM Agent がインストールされ、起動していること
・EC2 インスタンスに付与されている IAM ロールに必要な権限(logs:CreateLogGroup,logs:CreateLogStream,logs:PutLogEventsなど)があること
・EC2 インスタンスにCloudwatchエージェントがインストールされていること
・FleetManagerのデフォルトのホスト管理設定を設定を有効にすること
設定方法
まずCloudWatch Logs にロググループを作成します。
ここではロググループ名を「ssm-agentlogs」とします。

ロググループの作り方の詳細は別途こちらを参照ください。
次に、FleetManagerを使ってEC2にRDPします。
EC2インスタンスにログイン後、「%ProgramFiles%\Amazon\SSM\」ディレクトリに移動します。
「%ProgramFiles%\Amazon\SSM\」のディレクトリにある「seelog.xml.template」ファイルのファイル名を「seelog.xml」 に変更します。
以下は「seelog.xml」の内容の抜粋です。
<outputs formatid="fmtinfo">
<console formatid="fmtinfo"/>
<rollingfile type="size" maxrolls="5" maxsize="30000000" filename="{{LOCALAPPDATA}}\Amazon\SSM\Logs\amazon-ssm-agent.log"/>
<filter formatid="fmterror" levels="error,critical">
<rollingfile type="size" maxrolls="5" maxsize="10000000" filename="{{LOCALAPPDATA}}\Amazon\SSM\Logs\errors.log"/>
</filter>
</outputs>
この箇所を以下のように変更します。
<outputs formatid="fmtinfo">
<console formatid="fmtinfo"/>
<rollingfile type="size" maxrolls="5" maxsize="30000000" filename="{{LOCALAPPDATA}}\Amazon\SSM\Logs\amazon-ssm-agent.log"/>
<filter formatid="fmterror" levels="error,critical">
<rollingfile type="size" maxrolls="5" maxsize="10000000" filename="{{LOCALAPPDATA}}\Amazon\SSM\Logs\errors.log"/>
</filter>
<custom name="cloudwatch_receiver" formatid="fmtdebug" data-log-group="your-CloudWatch-log-group-name"/>
</outputs>
この内
<custom name="cloudwatch_receiver" formatid="fmtdebug" data-log-group="your-CloudWatch-log-group-name"/>
の箇所が追加されています。
実際には「"your-CloudWatch-log-group-name"」の部分を、先ほど作成したCloudWatch Logs のロググループ名に読み替えてください。
本記事の場合は以下のようになります。
<custom name="cloudwatch_receiver" formatid="fmtdebug" data-log-group="ssm-agentlogs"/>
次に、PowerShellなどを使いSSMエージェントを再起動します。
EC2インスタンス内でPowerShellを立ち上げ、再起動コマンドを実行します。
PowerShellでの再起動コマンドは以下になります。
Restart-Service AmazonSSMAgent
コマンドを打つと、数秒でSSMエージェントの再起動が完了します。
その後、CloudWatch Logs コンソールを開き、先ほど作成したロググループ(本記事では ssm-agentlogs)を確認します。
ロググループ内にログストリームが作成されており、SSM エージェントのログが正常に出力されていることが確認できます。

※もし再起動後もログが出力されていない場合は、数分ほど時間をおいてから、再度再起動コマンドを実行してみてください。
なお、CloudWatch Logs で確認できるログは、EC2 インスタンスのローカルに保存されているログになります。
ローカル上では、以下のパスでログを確認できます。
%PROGRAMDATA%\Amazon\SSM\Logs\amazon-ssm-agent.log
%PROGRAMDATA%\Amazon\SSM\Logs\errors.log
まとめ
今回は、SSM エージェントのログを CloudWatch Logs に転送する方法についてまとめました。
公式サイトに手順は記載されていますが、実際に設定してみると、seelog.xml の記述方法、再起動のタイミングなど、いくつか注意すべきポイントがあることが分かりました。
CloudWatch Logs に集約することで、インスタンスへ直接ログインせずとも SSM エージェントの挙動を確認できるようになるため、トラブルシュートや運用監視がしやすくなると感じました。


