システム運用監視を一人でがんばるための工夫

オークファン Advent Calendar 2018　3日目担当@kei75です。

今までメモ書き・殴り書き・覚え書きばかりでしたので、こういう記事を書くのは初めてです。
コタツの上のミカンをぼーっと眺めるような感覚で読んでいただければ幸いです。
ちなみに、うちにはコタツがないので、代わりに布団にくるまってミカンを食べます。

# 自己紹介
2007年にネットプライスに入社して以来、情報システム部門、インフラ、開発と色々と渡り歩いてきました。
2018年10月よりオークファンに転籍になりましたが、やってることは相変わらずです(笑)

比較的レイヤーの低いところを得意としているエンジニアと自負しておりますが、「浅く広く」なエンジニアなので、
専門の方にはかないません。

# システム運用監視ってなに？
さて、私の主業務の一つに、「システム運用監視」があります。
システムは作っただけでは終わらず、「動かし続ける」ことが大切です。
サーバやネットワークは、基本的には何もしなくても動き続けるものですが、何らかのトラブルが発生することもあります。
そのトラブルを迅速に検知し、解決することこそが「システム運用監視」です。

# 運用監視環境のご紹介
というわけで、まずは当社で使用している運用監視環境のご紹介です。

- Nagios
https://www.nagios.org/
言わずと知れた監視ツールの定番中の定番。
一昔前までは監視ツールのスタンダードでしたが、今はもうレガシーな部類に入ってしまっているかと…。
10年以上Nagiosを採用していますが、枯れているが故の安定性は抜群です。
設定ファイルを書くのがちょっと難しいのが難点。

- ZABBIX
https://www.zabbix.com/
比較的最近のネットワーク監視ツールとしてスタンダードになってきた運用監視ツール。
日本語ドキュメントやユーザ会などもあり、情報ソースは多岐にわたります。
GUIもしっかりできていて、(人によるけど)使いやすいのではないかと。
大規模環境にも適用できるよう、様々な機能が用意されています。

- Cacti
https://www.cacti.net/
「RRDtoolのためのフロントエンドアプリケーションとして設計された、Webベースのネットワーク監視およびグラフ生成用の、オープンソースソフトウェアである」とWikipediaに記載がありました。
監視ツールというよりは、リソースの状況をグラフ化するツールという側面が強いです。
ネットワーク機器の通信量などをグラフ化する目的で使用しています。

- SmokePing
https://oss.oetiker.ch/smokeping/
名前にもあるように、Pingを使用してネットワークのレイテンシを測定・グラフ化するためのツールです。
グラフが煙が立っているように見えることから、その名が付いたという話。
ネットワーク監視をする上でレイテンシの監視は結構重要だったりするので、枯れたツールですが必需品。

運用監視に多数のツールを用いることは、通常運用時の負荷だけでなく設定変更時にも手間が掛かるためお勧めできません。
が、昔から色んなツールを試してきて、適材適所に適用してきた結果がこれと…。
慣れてくるとそれなりに運用できるようになります(笑)

# 監視の通知
これらの監視ツールは設定した項目を一定間隔でチェックし、設定した範囲を超えたり想定した結果が返ってこなかった場合に「異常」と見なし、設定した方法で管理者に通知を行ないます。

監視ツールの通知としてよく使われているのはメールでしょう。
当社でももれなくメール通知を行なっています。
PC向けアドレスだけでなく、モバイル用アドレスにも通知メールを飛ばして、PCの目の前に居なくても通知メールを受信できるようにしています。

最近では、コミュニケーションツールとして全社でSlack( https://slack.com/ )を採用しているため、このSlackのチャンネルにも同様の通知を飛ばすようにしています。

Slackには、Incoming Webhooksという機能があり、curl等でURLを叩くだけでチャンネルへの投稿ができたりするため、非常に重宝します。
https://api.slack.com/incoming-webhooks

# 監視通知の慣れ
携わり始めたころこそ、携帯(ガラケー)にメール通知が飛んできたときは寝ていてもすぐに気がついて対応できていましたが、
「慣れ」というものは怖いもので、ちょっとやそっとの通知では起きなくなってしまいました…。

ここ数年はメンバーが激減し一人で運用監視業務をやっているため、深夜帯にトラブルが発生すると「通知に気がつかない＝対応がされない」という事態が発生するようになっていました。

このままではまずい…ということで、メール以外に確実に自分を起こしてくれる通知の仕組みを考えました。

# 電話通知の導入
そこで考えたのが、メールではなく電話で通知する仕組みを導入することでした。

世の中にはすでに便利なサービスが存在しており、こういったサービスを利用するのも手です。

Reactio(リアクティオ)
https://reactio.jp/

しかしながら、当社では運用監視環境は既にがっちりできてしまっており、電話通知をしたいだけですのでReactioは若干オーバースペックでした(汗)

そこで、以前から注目していたTwilioというサービスを利用することにしました。

Twilio
https://twilio.kddi-web.com/

日本ではKDDI Web Communications社がサービスを提供している電話やSMSわ主軸としたコミュニケーションAPIを提供しているサービスです。
Twilio自体の紹介は、他のQiitaの記事等にたくさんありますので省略しますが、このTwilioを用いることで、システム上から簡単に電話やSMSを発信することが可能となります。(当然利用料金は掛かりますが…)

# Twilio電話通知スクリプト

Twilioには各種言語に対応したSDKが用意されているため、SDKを導入するだけで簡単に電話発信をすることができます。
当社ではこんなスクリプトを用意し、Nagiosに組み込んでいます。
(Qiita用にだいぶ端折っています笑)

```php
<?php
require __DIR__ . '/Twilio/autoload.php';
use Twilio\Rest\Client;

// twilio設定
$AccountSid = (Account SIDを記載);
$AuthToken  = (Auth Tokenを記載);
$MyNumber   = "+815099999999";

// TwiMLの生成
//---------------------------------------------------------------
        $twiml = <<<_XML
<Response>
<Say language="ja-JP" loop="2">クリティカルアラート検知</Say>
</Response>
_XML;
//---------------------------------------------------------------
// twimlet用にURLエンコードしてプレフィックスを追加
$twimlet =  "http://twimlets.com/echo?Twiml=" . urlencode(str_replace("\n", "", $twiml));


// インスタンスの生成
$client = new Client($AccountSid, $AuthToken);

// 呼び出し先電話番号
$CallNumber = '+819099999999';

// CallAPIを呼び出し
$call = $client->calls->create(
        $CallNumber, $MyNumber,
        array(
                'url'           => $twimlet,
                'Timeout'       => 8
        )
);
```

Twilioで細かい制御をしようとすると、自前でWebサーバを立ててTwilioからのコールバックを受け取る必要などがありますが、
発信するだけであればtwimletsというTwilioが用意しているサービスを利用すれば簡単に実装することができます。

これらを用いて、特定の監視アラートが発生した場合にこのPHPを起動し、電話を鳴らすよう運用しています。

1年以上この運用を続けていますが、何度もこの電話に助けられてきました。
今では無くてはならないツールの一つです(笑)

# 最後に

こういった自前実装の多い当社ですが、「もっといいやり方もあるよっ！」という心意気のある方がいましたらぜひ一緒にお仕事をしましょう！

https://aucfan.co.jp/recruit/
ちょっと古い情報もありますが…。

よろしくおねがいします！