0
Help us understand the problem. What are the problem?

posted at

SNSに飛んできたアラートをTypetalkに投稿する

AWSでインフラ構築をしていて、リソースモニタリング時のアラートとアプリログを何らかの形で通知してほしい。という依頼がありました。

  • CloudWatchでリソース監視&アラート設定をして、しきい値を超えたらSNSに通知する
  • ログはCloudWatchLogs(?のAgent)でログを吸い上げてサブスクリプションフィルターでSNSに通知する
  • SNSのサブスクリプションでメーリングリストを指定して関係者に配信する

という流れをひとまず作りました。こんなイメージ。

業務でBacklog、Typetalkを使ってるのですが、Typetalkの方にもアラートを投げてほしい。という要望が出たのでそちらも対応することにしました。
Amazon Chatbot( https://aws.amazon.com/jp/chatbot/ )というのがあり、簡単そう!ともいましたが、AmazonChimeとSlackしか対応してないみたいなので却下。
SNSからメール配信しているので、その配信先にTypetalkが加われば一番手間がかからなさそう。こんなイメージ?

Typetalkを調べてみると、APIが用意されていて、APIをコールしたら特定のトピックに投稿できるとのこと
https://developer.nulab.com/ja/docs/typetalk/api/1/post-message/
シンプルですね。
でもSNSから直接APIコールはできなさそうなのでググる。
あ、みんなlambdaを挟んでAPIをコールしてるんですね。こんなイメージかな

こんな構成で行けそう。
ではlambda関数を作っていきます。

import requests
import json
import os

token = os.environ['TYPETALK_TOKEN']
url = os.environ['TYPETALK_TOPIC_URL']

def lambda_handler(event, lambda_context):
    records = event.get("Records")
    if records and len(records) > 0:
        for record in records:
            sns = record.get("Sns")
            if sns:
                subject = sns.get("Subject").replace("\\", "\\\\" )
                message = sns.get("Message").replace("\\", "\\\\" )
                timestamp = sns.get("Timestamp")
                topic_message = subject + "\n"
                topic_message += message + "\n"
                topic_message += timestamp + "\n"

                data = {'message': topic_message[:4000]}
                headers = {'X-TYPETALK-TOKEN': token}
                res = requests.post(url, json = data, headers = headers)

先人たちのコードを参考にこんな形にしました。
Typetalk自体はTokenと投稿先のTopicIDがわかれば後はPOSTするだけでOKです。
Typetalk APIリファレンス:メッセージの投稿

TokenとTopicIDはlambdaの設定側から突っ込む形式にしました。
また、Typetalkでメッセージを投稿する際は一度に4,000文字が最大とのことなのでメッセージ文字列を4000の位置までで切ってPOSTしています。

比較的簡単!

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
0
Help us understand the problem. What are the problem?