先日公開した記事で、Powershell でログ監視→メール送信 という記事を書いたのですが、実は私が実際構築している監視環境ではメール送信はしていません。その理由と代替手段について紹介します。
メール送信しない理由
メッセージ監視でアラートを検出した際、メール送信するのが一般的だと思いますが、私はその方法をとりませんでした。理由は、「SMTPサーバーを使用するのが大変だから」です。
会社にもよると思いますが、社内での野良SMTPサーバーはセキュリティ観点で禁止されていたり、使用できるSMTPサーバーは許可制だったりと、いろいろ面倒が多い。それならば別の方法ということで、次にどういう方法を使用しているかを紹介します。
Webhook+Teamsのチャット投稿
最近は、社内でのSlackやTeamsなどチャットツールを使用することも増えたと思います。私の観測範囲でもTeamsを使用しています。
Teamsにはコネクタという機能があり、別製品との連携が可能です。会社内だとある程度使用できるコネクタは制限されていると思うので、だれでも利用できる方法ではないかもしれませんが、私は運よくWebhookが使用できました。
Teamsのコネクタ登録
ということで、
Teams のコネクタからWebhookを登録します。最近アイコンが変わったかもしれないので、以下のアイコンはちょっと古いですが、「Incoming Webhook」を登録すれば、OKです。
Incoming Webhookの設定自体はほとんどなく、投稿用のURLを生成するぐらいです。
あとはアイコンが変更できるので、お好みの監視システムに合わせてアイコンも変えておくと見やすいです。
Powershell側でメッセージ送信
先日投稿したこちらの記事「監視と可視化と通知と分析:ログ監視は結局PowerShellに行き着いたという話」でメール送信している部分を置き換えます。具体的には以下のようになります。
(実際はエラー処理などちゃんと書いてください)
# Webhook URLを指定
$url = "Teamsのコネクタで払い出した投稿用のトークン URL"
$logName = "System"
$eventId = "1074"
while ($true) {
$events = Get-EventLog -LogName $logName -InstanceId $eventId -Newest 1
if ($events) {
$event = $events[0]
$body = "システムがシャットダウンされました。"
$message = @{
text = $body
themeColor = "#FF5733"
}
$jsonMessage = $message | ConvertTo-Json
Invoke-RestMethod -Uri $url -Method POST -Body $jsonMessage
}
Start-Sleep -Seconds 60
}
上記のコードでは、Webhook URLを指定し、チャットに投稿するメッセージを作成してJSON形式に変換し、Invoke-RestMethodを利用してWebhookにPOSTリクエストを送信しています。
これで、メールではなくTeamsのチャットにアラートが上がるようになりました。監視もだいぶ楽になりしかも、複雑なソフトウェアなども使用せずWindowsでは標準であるPowershellで完結しているというところが気に入っています。
より複雑なことはできませんが、いろいろな制約が多い環境でログ監視などを検討してる方がいたら、参考になれば幸いです。
まとめ
社内でログ監視をしたいけど、各種OSSやソフトウェアのインストールに制約がある方、SMTP送信が難しい方は、ぜひTeams コネクタ(Incoming Webhook) + Poweshellでログ監視も検討してみてください。環境が許せばかなり楽な監視システムの構築だと思います。