LoginSignup
5
8

More than 5 years have passed since last update.

Zabbixのログ監視を、CloudWatch Logs, Lambda, Chatworkで実現した話

Last updated at Posted at 2016-03-12

概要

Zabbixのログ監視は、CloudWatch Logs, Lambda, Chatworkを組み合わせて実現できます。

DatadogとかMackerelに移行を考えているけど、機能として欠けていて、でも業務には組込まれていて、みたいなのをどうにかしました。

注意点

  • Chatwork APIが、5分間に100回というヤバい仕様なので、これより明らかに頻度の少ないものだけにしましょう。
  • 他は、目立った制約事項はない、、、はず

構成

スクリーンショット 2016-03-12 22.35.07.png

EC2

CloudWatch Logsエージェントをインストールします。詳細は下記。

CloudWatch Logs

ログが取り込まれていることが確認できれば、ここでやることはもう無いです。

Lmbda

言語はpython。hello-world-python をテンプレに、ちゃちゃっとIAMロールとかも作りましょう。

#coding: UTF-8
from __future__ import print_function

import json
import pycurl
import urllib
import base64
import zlib
import datetime

api_token       = "チャットワークのAPIトークン"
room_id         = "ルームID"
room_message    = "https://api.chatwork.com/v1/rooms/{0}/messages".format(room_id)

def lambda_handler(event, context):
    data = zlib.decompress(base64.b64decode(event['awslogs']['data']), 16+zlib.MAX_WBITS)
    data_json = json.loads(data)
    for log in data_json["logEvents"]:
        log_json = json.loads(json.dumps(log, ensure_ascii=False))
        message = u"[info][title]なんか出たよ!![/title]" \
            + log_json['message'] \
            + "[/info]"
        option = {'body': message}
        c = pycurl.Curl()
        c.setopt(pycurl.URL, room_message)
        c.setopt(pycurl.HTTPHEADER, ['X-ChatWorkToken:' + api_token])
        c.setopt(pycurl.POST, 1)
        c.setopt(pycurl.POSTFIELDS, urllib.urlencode(option))
        c.perform()

仕上げに、LambdaファンクションのEvent sourcesを追加します。ソースはCloudwatchLogsで、お目当てのロググループ名を指定します。

フィルタパターンを設定すれば、特定のキーワードを含んたものが来た時だけ、ファンクションを起動できます。

ChatWork

通知先ルームを用意するのと、APIトークンを用意する以外、やることは特にないです。

NG集

...というのを一発で組めたわけではなく、紆余曲折あったのですよと。

Fluentd入りのEC2 -> ChatWork

Fluentdで、in_tailと、out_chatworkの組み合わせを、最初に構築しましたが、下記の事情で諦めました。

  • td-agent、1系をインストール済み。1系では、fluent-plugin-out_chatworkをインストールしてみたものの、なんだか動いてる気配がない
  • td-agent、そもそもインストール出来ないやつがいた。32bit版AmazonLinux。
    • CloudWatchLogsエージェントは、32bit版AmazonLinuxにも、スパッと入った

EC2 -> CloudWatchLogs -> Zapier -> ChatWork

  • CloudWatchLogsで、メトリックフィルタとアラートを設定
  • アラート発生をトリガーに、Zapierで、ChatWorkに通知します。

これをボツにしたのは、メトリックフィルタとアラートが「出たよ!」しかわからず、通知も「出たよ!CloudWatchLogsの画面を見に行ってね!」しか出せず、イケてないフローだったためです。

EC2 -> CloudWatchLogs -> Fluentd -> ChatWork

EC2からCloudWatchLogsにログを収集するところまでは、最終形と同じ。

Fluentdに、in_cloudwatchlog、out_chatworkの組み合わせです。

これをボツにしたのは、in_cloudwatchlogは良かったのですが、そもそもCloudWatchLogsのAPIがくっそイケてなくて、更新頻度の低いロググループからだと、同じログを何度でも返してくるため、「ログ監視」みたいなことには全く使えない代物だとわかったためです。

5
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
8