LinuxユーザーがイジるはじめてのAzure

LinuxユーザーがAzureを使いこなせるように応援するブログです

Log Analyticsを使いCentOS7のrsyslog経由で特定の文字列を検知しアラートメールを飛ばす

どこぞの知人から強く希望されたので記事にしておきます:)

 

システムの健康状態を管理するやり方として、よく監視ツールといったシステムの異常を検知してアラートを飛ばす、または検知した情報を基に一次復旧のスクリプトを流す、なんて話はよくある話ですね。

 

これはクラウド化したところでやりたい要件や見たい要望が大きく変わるものではないのが現状かと思います。むしろクラウドのメリットとしてスケールでカバーする世界になってくれば来るほど、ちまちまと1台ずつ管理するほうがめんどくさいぐらいです。

 

そこにはスケールでカバーできる規模の監視・管理サービスを追及するか、そもそも監視・管理の必要のない世界を目指すか、で分岐されそうですね。個人的には監視で夜間たたき起こされた悪夢が多い自分としては監視不要のアーキテクチャな世界を選びたいものですw

 

さて、前置きはそのあたりにしておき、Linuxユーザーのクラウド利用と限定した場合の多くは、ベンダーが提供する監視ツールやサービスを使うか、on IaaSでzabbixやnagiosなどを導入する、というのが一般的かと思います。

 

今回の記事はMicrosoft Azureが提供するOMS Log Analyticsでこんなことできます、というのを一例としてだしておきます。ご参考に。

 

やりたいことは、CentOS7内で吐き出されるログの中で、特定の文字列が吐き出されたものを監視しアラートメールを飛ばす、というものです。CPUやMEM、Diskといったリソースの監視についてはAzure Monitorをポータル上からポチポチ選べばできそうですが、アプリ特有のメッセージを拾う、となるとちょっと難しい監視要件となります。

 

早速やりましょう。

 

●前提

 とりあえずCentOS7の仮想マシンを準備しておきましょう。また、その仮想マシン

 vhdを保管しているstorage account名をメモっておいてください。

 Azure Portalの+ボタンからLog Analyticsを選択し、お好みのResource Groupに

 デプロイしておきましょう。

 

●開始

Log Analyticsをデプロイする際に解析対象とするStorageAccountを選ぶ画面があります。ここではLinuxのsyslogを対象とするよう設定しておきます。

 

f:id:akazure:20170605133827j:plain

 

 

Azure ポータルからLog Analyticsを開くとこんな感じに見えます。

f:id:akazure:20170605133540j:plain

 

ではCentOS7にOMS用のエージェントをインストールします。インストール方法のサイトは以下です。

 

Connect Linux computers to Azure Log Analytics | Microsoft Docs

 

丁寧に書かれていますが、簡単に書くと以下の2行でインストール完了します。

 

 

wget https://raw.githubusercontent.com/Microsoft/OMS-Agent-for-Linux/master/installer/scripts/onboard_agent.sh

 

sh onboard_agent.sh -w <YOUR OMS WORKSPACE ID> -s <YOUR OMS WORKSPACE PRIMARY KEY>

 

ここで軽く迷子になりそうですが、<YOUR OMS WORKSPACE ID>はAzureポータルのLog Analyticsのボードを開いた時に「

 

f:id:akazure:20170605135201j:plain

ここまでできれば、ps -ef | grep -i agentで見ると何やらphthonがキックしているomsagentなるものが起動していることがわかります。

 

また、omsagentが管理しているメトリックスの定義ファイルは以下になります。

/etc/opt/microsoft/omsagent/<workspace id>/conf/omsagent.conf

 

/etc/rsyslogの設定を見ると、omsagentの追加定義が以下に配置されています。

 

/etc/rsyslog.d/95-omsagent.conf

 

 

中身を見るとdefaultでほとんどのfacilityとlog levelが定義されていますね。

ちなみにCentOS7では/etc/rsyslog.confを見るとlocalのfacilityはlocal7だけ利用されています。

 

結論として、rsyslog.confに記載されているログは全てomsagentによって対象のstorage accountへrawdataを飛ばす設定になっている、という点ですね。

 

ではOMSポータルのログ検索から該当のrsyslogで飛ばしたログが見えるか確認してみましょう。

 

f:id:akazure:20170605151243j:plain

 

検索フィールドに「* (Type=Perf)」とすると、storage acccountに入ったログが全て一覧出力することができます。ちゃんと飛んできているようですね。

 

ちょっとstorage account内ではどのように管理されているか覗いてみましょう。

f:id:akazure:20170605151517j:plain

 

 storage accountの中身を確認するのなら、azure storage explorerというツールを使うと便利です。(for Windows)

フリーのダウンロードは以下からできます。

Microsoft Azure Storage Explorer

 

rsyslogのログはstorage accountの「tables」で管理されていることがわかります。

 

ちなみにちょっと横道にそれますが、起動しているprocessのCPU消費率が高い順、なんかも以下のように見えました。

 

f:id:akazure:20170605152009j:plain

 

CentOS7のOS内で見たものが以下です。

f:id:akazure:20170605152111j:plain

 

特に何も処理されていないからだと思いますが、python(omsagent)やsystemdなんかがtopの上位に来ていますので、Log Analytics側もちゃんと拾えているな、という所感です。

 

では早速、特定の文字列をrsyslogに飛ばしてLog Analytics側の対象に入るかを確認してみましょう。

 

f:id:akazure:20170605152433j:plain

 

loggerコマンドを使ってlocal7のfacilityにerrorレベルでログ出力させてみました。

OS内ではちゃんと出力されていることが確認できます。

 

Log Analytics側ではどうでしょうか。

 

f:id:akazure:20170605152618j:plain

 

10秒~15秒ほど待つとちゃんと引っかかってくれましたね。

つまりCentOS内のアプリがrsyslogへのログ出力を設定すれば、storage account内に連動しLog Analytics側でもログ検索として拾える、ということがわかります。

 

では最後にこのsample messageという特定の文字列を検知したらアラートメールを飛ばす設定を入れましょう。

 

上記画面ショット(sample messageがHITされている画面)の左上に「アラート」と記載されている個所を押下します。

f:id:akazure:20170605152957j:plain

 

 設定はこんな感じに入れてみました。

15分間隔で「sample message」というキーワードのログがないかをチェックし、チェックしたら記載したメールアドレスへアラートメールを飛ばします。

また、1度検知した後、1時間は多重検知してもメールは飛ばさない、という設定も入れています。

今回設定は入れていませんが、webhook、runbookの指定個所もあるので、特定のメッセージを検知したらwebhookのhttp要求を実行してrunbookを走らせる、みたいなこともできそうですね。一次対応としてVM再起動する、とか簡単にできそうです。

 

もう一度loggerコマンドでCentOS内でログを出してみましょう。

f:id:akazure:20170605153331j:plain

 

はい、先ほどの1行だけでなく2行目が出てきており、ちゃんと拾えているようです。

 

しばらくすると以下のようなアラートメールが指定したメールアドレスに届きました。

f:id:akazure:20170605153417j:plain

 

メールのSubjectもちゃんと日本語で来ていますね。

※中身の検知時間がUTCになっているので+09:00で日本時間として把握しましょうw

 

また、1時間後にまた同様のメールが飛んできました。そう設定しましたからね。

 

念のためアラートメールのヘッダを見てみました。

 

Received: from ***************** (207.46.225.185) by SMTPi.msn.com

(207.46.200.12) with Microsoft SMTP Server (TLS) id **.3.**.2; Sun, 4 Jun

2017 19:02:03 -0700

 

SMTPi.msn.comというメールサーバーにSMTP発信されているようです。Microsoftが管理しているメールサーバーが死なない限り、ちゃんとアラートメールが飛んでくると捉えてよいでしょう。

 

アラート設定を止めたい場合は以下から操作します。

f:id:akazure:20170605153937j:plain

 

ごちゃごちゃパネルを追加したので見栄えが変ですが、「設定」を押下します。

 

f:id:akazure:20170605154023j:plain

 

先ほど登録したアラート設定が1つありますので、ここでオフすればアラートは止まります。また、鉛筆マークを押すことで中身を修正し保存することもできます。

 

 

以上ですが、いかがでしたか。

Log AnalyticsはOMSポータルではなくAzureポータルからも操作できるようになっているようですので、OMSポータルとの併用で管理しなくても今はよさげです。

また、2017年6月現在、1日分のログが500MBを超えなければ無料で本機能は利用できます。(保存日数が最大7日間の制限あり)

 

今回のように特定の文字列からアラートメールを飛ばす、といった要件を優先度高く監視システムを検討される場合は、on IaaSでzabbixやsplunkを構築してVM代と管理費を維持するよりも、はるかにお安く簡単に設定できるんだ、ということがおわかりいただけたでしょうか。

また、例えばですが、とあるマウントポイントのディスク使用量を定期的にcrontab上のshell scriptで見ておき、90%以上になればloggerでrsyslogでログを飛ばす、といった応用もできそうです。

 

zabbixやnagiosにはそれぞれの良さもありますが、それが全てではない、ということが理解いただけだけでも充分かと思います。