Alibaba Cloudの監視でSlackへの通知


やりたいコト

Alibaba Cloud上で
CloudMonitorで検知したアラームを
Function ComputeからSlackへの通知を設定したい。

ちなみに
CloudMonitorとは、AWSのCloudWatchみたいなプロダクト
Function Computeとは、AWSのLambdaみたいなプロダクト

手順

  1. Slack WebHookの準備
  2. Function Computeの設定
  3. Cloud Monitorの設定

1. Slack Webhookの準備

incoming webhookからURLを取得します。

参考サイト:SlackのWebhook URL取得手順

2. Function Computeの設定

Function ComputeはAWSのLambdaみたいなServerless Computingで
現在のTokyo Regionでは6つのランタイムが利用可能で

トリガーは以下の7つが利用可能です。
今回はHTTPトリガーを利用します。

設定はとりあえず、以下の通りに設定します。

HTTPトリガーのPythonのサンプルを参照して、下記のコードをuploadする。
今回はPython3のランタイムを利用します。

CloudMonitorの設定で利用する為、HTTPトリガーのURLをコピーします。

main.py
# -*- coding: utf-8 -*-

import logging
import json
import requests
import datetime

def sendSlack(message):
  SLACK_WEBHOOK_URL = "{Your Webhook for Slack}"
  slack_message = {
    "username": "webhookbot",
    "text": message,
    "icon_emoji": ':grin:'
  }
  return requests.post(SLACK_WEBHOOK_URL, data=json.dumps(slack_message))

def handler(environ, start_response):
    qs = environ["QUERY_STRING"]
    dict = {}
    for kv in qs.split("&"):
      [k, v] = kv.split("=")
      dict[k]=v
    message = dict["body"]
    dt_now = datetime.datetime.now()
    now=dt_now.strftime("%Y -%m-%d %H:%M:%S")
    description = 'DateTime: ' + now + '\n' + 'Msg: ' + message
    if environ["REQUEST_METHOD"] == 'POST':
      sendSlack(description)
      status = '200 OK'
      response_headers = [('Content-type', 'text/plain')]
      start_response(status, response_headers)
      return r
    else:
      return 'skip'

3. CloudMonitorの設定

CloudMonitorの「アラームルール」を選択します。

アラーム設定の最後の「アラームコールバック」にFunction ComputeのURLの入力します。
URLの最後にQuery String を利用して、メッセージを挿入します。
以下のURLで「?body=b1」の部分

https://000000000.ap-northeast-1.fc.aliyuncs.com/2016-08-15/proxy/.../?body=b1

アラームコールバックの説明には「HTTPのみ」との記載がありますが、HTTPSでも対応しているよう...

結果

Slackへの通知の結果は以下の通り。

その他

Function Computeを利用せず、Emailを利用して、Slackへ直接メールを送信は可能で早いです。
メッセージのカスタマイズはできませんが、利用用途次第ではEmailでも対応可能です。