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しています。
比較的簡単!