CloudWatch – Teams通知連携

SlackからTeamsに移行して久しい弊社では、CloudWatch AlarmやGhost InspectorのSlack通知のためだけにSlackを起動しているような人がいました。

見落としや業務効率の低下を招くので、Teamsに一本化してやろうというお話。
Ghost InspectorのTeams連携についてはGhost Inspector – Teams通知連携を参照。

軽く調べたらWebhookを使えばいいらしい。簡単~~~!!

1. Teamsのコネクタを作成

Slackで言うところのIntegration。

通知を受け取りたいチャネルにて、下記の設定を行う。
通知用のチャネルを作るのが良さそう。

チャネル右上の「・・・」からコネクタを選択
Incoming Webhookを「構成」
適当な名前とアイコンを設定して「作成」
WebhookURLが表示されるのでコピーしておく。

※忘れてしまっても、コネクタ > 構成済み > Incoming Webhook > (構成済みを展開) > 管理 から再度確認できる。

余談

アイコン画像は下記のように6角形に切り抜かれて使用されるため、周囲の余白をいい感じに調整すると気分が良い。

正方形 → アイコン切り抜き 参考画像

2. Teams通知のLambdaを作成

下記のような関数をさっくりと作成。

参考にした記事のほぼそのまま。
コンパクトにしたかったのでいくらか省略し、組み込みのライブラリだけ使うように書き換えた程度。かっこよくはない。

import json
import logging

from urllib.request import Request, urlopen
from urllib.error import URLError, HTTPError


HOOK_URL = "(WebhookURLを記載)"

logger = logging.getLogger()
logger.setLevel(logging.INFO)


def lambda_handler(event, context):
    logger.info("Event: " + str(event))
    
    subjet = event['Records'][0]['Sns']['Subject']
    
    message_json = json.loads(event['Records'][0]['Sns']['Message'])
    logger.info("Message: " + str(message_json))

    newStateReason = message_json['NewStateReason']
    newStateValue = message_json['NewStateValue']
    nameSpace = message_json['Trigger']['Namespace']
    metricName = message_json['Trigger']['MetricName']
    alarm_description = message_json['AlarmDescription']

    # Create contents to POST to Microsoft Teams.
    text = [
        newStateReason,
        "\r\n\r\n",
        "**Alarm State:** {0}          **Name Space:**: {1}".format(newStateValue, nameSpace),
        "**Metric:** {0}".format(metricName),
        "\r\n\r\n",
        alarm_description,
        ]

    request_data = {
        'title': subjet,
        'text': '\r\n\r\n'.join(text)
        }

    # POST to Microsoft Teams.
    request = Request(
        HOOK_URL, 
        data=json.dumps(request_data).encode('utf-8'),
        method="POST"
    )

    try:
        with urlopen(request) as response:
            response_body = response.read().decode('utf-8')
            logger.info(response_body)
    except HTTPError as err:
        logger.error(err.code)
    except URLError as err:
        logger.error(err.reason)

3. SNSトピックを作成

既存の通知先を置き換えることになったので、サブスクリプションの置換のみ。

先程のLambda関数用のサブスクリプションを作成

※SNSトピックとの紐付けは、Lambda関数の「トリガー」設定からでも行なえる。(関数の概要 > トリガーを追加 > SNSを選択 > トピックを選択 > [追加])

4. CloudWatch アラームを作成

既存のアラームの通知先を変えただけなので詳細は省略。

アラームのアクションとして通知先に先程のSNSトピックを指定する。

5. 動作確認

適当にしきい値を下げてアラーム状態にしてみると、コネクタ設定をしたチャネルにて、下記のような投稿が確認できた。

実は設定したのが4月なので、そのときのスクショ
(投稿者の名称が手順と異なるのはそのため)

課題

Teamsは現状、Webhookによる投稿でチャネル通知(Slackの@channel的なメンション)が使えないらしく、アラーム通知に気付きにくいという問題がある。

今後に期待……

参考

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です