gumadesu

日々の学びをアウトプット

お手軽にDatadogのアラートをLINEで受け取れるようにする

弊社では Datadog でアプリやインフラを監視しています. 今までアラートの通知はSlack経由だったが、意外と気づきにくいという問題がありました.

普段から連絡手段にLINEを利用していたので、LINEへアラートを飛ばすことが出来ないかと調べてみました.
すると、意外と簡単に実現できたので、方法を残してきます.

構成

全体の構成はこんな感じです. f:id:kashiwaguma-hiro:20191214231049p:plain

実現するためにやることは以下のとおりです.

  1. LINE Channelを作成
  2. 開発メンバーがLINE Channelを友だち登録
  3. アクセストークンを発行し、ブロードキャストメッセージ送信できるようにする
  4. Datadogからアラート発生時にブロードキャストメッセージを送信するように設定

順に説明していきます.

LINE Channelを作成

個人用のLINEアカウントがある前提です. 今回は個人用として作成しました.

まずは LINE Developers にログイン

f:id:kashiwaguma-hiro:20191213222611p:plain

ログインしたら Providorを作る. f:id:kashiwaguma-hiro:20191213223032p:plain

プロバイダ名はよしなにつけましょう. 今回は「アラート通知」とします. f:id:kashiwaguma-hiro:20191213223210p:plain

作成に成功し、次のような画面に遷移します.
Messaging APIを選択. f:id:kashiwaguma-hiro:20191213223603p:plain

色々入力項目がありますが、よしなに入力しましょう. 注意点は Channel typeを「Messaging API」とすることぐらいです. f:id:kashiwaguma-hiro:20191213224343p:plain

Channelが作成できると、お友達登録用のQRコードが作成されます.

f:id:kashiwaguma-hiro:20191213225604p:plain

開発メンバーがLINE Channelを友だち登録

先程のQRコードを使って、LINEのお友達追加から登録しましょう. f:id:kashiwaguma-hiro:20191213230050p:plain f:id:kashiwaguma-hiro:20191213230211p:plain

問題なく友達になれましたね 🙆

アクセストークンを発行し、ブロードキャストメッセージ送信できるようにする

Messagening APIbradcast-message を使います.
これはお友達全員にメッセージを送信することが出来る機能です.

リクエストサンプルを見るとわかりますが、リクエストにはchannel access tokenが必要になります.
channel access tokenは先程のQRコードを表示している画面から issue してください.

f:id:kashiwaguma-hiro:20191213232053p:plain

発行できたトークンを使って以下のリクエストを投げてみましょう.

~ ❯❯❯  curl -v -X POST https://api.line.me/v2/bot/message/broadcast \
-H 'Content-Type:application/json' \
-H 'Authorization: Bearer XXXXXXXXXX' \
-d '{
    "messages":[
        {
            "type":"text",
            "text":"Hello, world1"
        },
        {
            "type":"text",
            "text":"Hello, world2"
        }
    ]
}'
Note: Unnecessary use of -X or --request, POST is already inferred.

~~~ 省略 ~~~

< HTTP/1.1 200 OK
< Server: nginx
< Date: Fri, 13 Dec 2019 14:29:01 GMT
< Content-Type: application/json;charset=UTF-8
< Transfer-Encoding: chunked
< Connection: keep-alive
< x-line-request-id: ca9024fc-5ace-4410-a743-fd8230c58e41
< x-content-type-options: nosniff
< x-xss-protection: 1; mode=block
< cache-control: no-cache, no-store, max-age=0, must-revalidate
< pragma: no-cache
< expires: 0
< x-frame-options: DENY
< 
* Connection #0 to host api.line.me left intact
{}* Closing connection 0

リクエスト結果は「200 OK」でした LINEを見ると、無事通知を受け取ることが出来てますね
f:id:kashiwaguma-hiro:20191213233053p:plain

Datadogからアラート発生時にブロードキャストメッセージを送信するように設定

今回はDatadogの例でお届けします.
まずIntegrationから Webhook を作ります. f:id:kashiwaguma-hiro:20191213235024p:plain

URLは curl実行したときのURL、 Payloadは Request Body、 Custom Headersには AuthrizationHeader の値を設定します. f:id:kashiwaguma-hiro:20191214004322p:plain

Custom HeadersはJSON形式でないと形式エラーになるので注意しましょう. Request Bodyについては Datadogの変数 を使ってお好みの値を設定しましょう.

設定が終わったら Datadog Monitorに移動してMonitorを作ります(作り方は割愛).
異常検知の通知先として、さきほど作成したWebhookを設定します.
f:id:kashiwaguma-hiro:20191214004557p:plain

最後に通知されるか、テストのアラートを発砲します.
Test Notification -> Alert, Alert Recoveryを選択 -> Run Test
f:id:kashiwaguma-hiro:20191214005152p:plain

設定がうまく行っていれば、LINE Botから無事通知がきます 🎉🎉🎉 f:id:kashiwaguma-hiro:20191214005625p:plain

手順は以上となります.

構成で意識したところ

一番意識したのは「動かし続けるのに手間がかからなようにすること」です.
ChatOpsなどもそうですが、よかれと思って作った運用補助サービスが、管理者不在担った途端にツール運用自体がメンバーの負担になることが往々にして起こりうるので、それを避けたかったのが理由です.

管理が必要なインフラを持たない

できるだけ自分たちでインフラの面倒を見ないで済む構成にしました.
最初は LINE Channelからのwebhookを受けるために Herokuで構築しようとしました.
ですが、 Heroku で無料運用するためには、定期的にリクエストを送信してインスタンスが死なないようにする必要があります.
いくら無料とはいえ 運用のための運用が増えることが嫌だった ので、自前でインフラを用意しなくてよい構成としました.

アラートの受信設定変更が、簡単であること

アラートを受け取るメンバーを追加・削除するといった運用もめんどくさいとおもってました.
なので LINE Channelのお友達機能を利用しました.
これを利用することで、アラートを受け取りたいメンバーは勝手にお友達になればいいし、チームを離脱するときはお友達を解除すればいいですよね?

ハマったところ

DatadogのWebhookでCustom HeadersはJSON指定じゃないとダメという点でした.
実は、DatadogのEventsからWebhookエラーは確認することが出来ます.
f:id:kashiwaguma-hiro:20191214010244p:plain もし設定してもうまく通知されない場合は、Eventsを見てみるとヒントが得られるかもしれません.

終わりに

Slackだった通知をLINEにしたことで、よりアラートに気づきやすい状況を作ることが出来ました.
MessagingAPIのブロードキャストを使っているので、開発メンバーの増減があったとしても、メンバーがLINE Channelの登録・解除をすればいいだけなので手間が少ないです.
設定時間は、慣れていれば1時間程度でできますので、興味がある方はぜひ試してみてください.