Slackに通知するLambda
Slackにメッセージを飛ばすLambdaつくる。
cloudwatchのアラームをSlackに飛ばしたいと思ったので、
Lambdaを作ってSNSから飛ばす形で作ってみたいと思った。
slack-python-webhook(slackweb)を使って非常に簡単にできる。
lambdaのコード(Python3.6)
# coding: utf-8 import json import slackweb def lambda_handler(event, context): text = event['Records'][0]['Sns']['Message'] print(text) hook_url = "https://hooks.slack.com/services/XXXXXX/XXXXXX/XXXXXXXXXXXXXXXXXXXXXXXX" username = "FromLambda" channel = "#channel" icon_emoji = ":face_with_rolling_eyes:" slack = slackweb.Slack(url=hook_url) slack.notify(text=text, channel=channel, username=username, icon_emoji=icon_emoji)
Lambdaファンクションの作成
# vim lambda_function.py (コードを記載) # vim requirements.txt # # cat requirements.txt slackweb # pip install -r requirements.txt -t ./ # zip -r9 func.zip *
作成したzipファイルを使ってLambdaを作成。
SNSからLambdaに飛ぶように設定する。 SNSが送信するJSONの中身は以下のような感じ。
{ "Records": [ { "EventVersion": "1.0", "EventSubscriptionArn": "arn:aws:sns:EXAMPLE", "EventSource": "aws:sns", "Sns": { "SignatureVersion": "1", "Timestamp": "1970-01-01T00:00:00.000Z", "Signature": "EXAMPLE", "SigningCertUrl": "EXAMPLE", "MessageId": "95df01b4-ee98-5cb9-9903-4c221d41eb5e", "Message": "Hello from SNS!", "MessageAttributes": { "Test": { "Type": "String", "Value": "TestString" }, "TestBinary": { "Type": "Binary", "Value": "TestBinary" } }, "Type": "Notification", "UnsubscribeUrl": "EXAMPLE", "TopicArn": "arn:aws:sns:EXAMPLE", "Subject": "TestInvoke" } } ] }
cloudwatchアラームが発生すると
cloudwatchAlarm→SNS→Lambda→Slackという感じでメッセージが飛んでくる。