実装を減らすと、障害ポイントも減るので、Lambda → SNS → ChatbotでSlack通知したかったのですが、サポートされていないという事なので、諦めて実装しました。
> Event received is not supported
Using AWS Chatbot with other AWS services – AWS Chatbot
実装するメリットは、メンション入れたり、メッセージを加工できる事です。
デメリットは、このLambda関数のエラーをSlackに通知できない事。
メールとか別の方法のを別に用意すれば通知自体は出来ますが。。。
「送信先(失敗時)」で元の流れに乗せてしまうループして、高額請求になるので注意。
構成やSNSトピックを作成は、Lambdaの例外エラーをメールとSlackに通知する を参照してください。
SlackにIncomming Webhookを追加
SlackにApp追加
動作確認
記載されているコマンドをコピペして実行するとSlackに通知されます。
Slack通知用のLambda関数を作成
こんな感じでチャンネルやメールアドレスを分けるのがおすすめ!
#critical: サービスが停止している等の、即対応が必要なアラート
#warning: 特定の条件でエラーになっていて、なる早で対応した方が良いアラート
今回はwarningのみ設定しますが、業務が止まってしまう等の場合はSNSも分けて、criticalを設定してください。
https://ap-northeast-1.console.aws.amazon.com/lambda/home?region=ap-northeast-1#/create/function
関数の作成 基本的な情報 関数名: sendSlackWarning ランタイム: Python 3.9 [関数の作成]
コード
メッセージがJSONの場合が、見やすいように整形しています。
warningとcriticalで、色やアイコンとメンション(@here or @channel)を変えられるようにしました。criticalで使う場合は、Trueに変更してください。
最新のコードこちら → https://dev.azure.com/nightonly/_git/lambda-origin?path=/sendSlackWarning/lambda_function.py
import os import urllib.request import json SLACK_WEBHOOK_URL = os.environ['SLACK_WEBHOOK_URL'] def lambda_handler(event, context): print(event) subject = event['Records'][0]['Sns']['Subject'] message = event['Records'][0]['Sns']['Message'] critical = False # Tips: 必要に応じて関数や題名等で切り替えてください # JSON整形 try: message = json.dumps(json.loads(message), indent = '\t') except: pass # Slack通知 data = { 'text': (':red_circle:' if critical else ':warning:') + ' AWS Notifications', 'attachments': [{ 'pretext': ('<!channel>' if critical else '<!here>'), 'color': ('danger' if critical else 'warning'), 'fields': [{ 'title': subject, 'value': message }] }] } request = urllib.request.Request( url = SLACK_WEBHOOK_URL, data = json.dumps(data).encode('utf-8'), method = 'POST', headers = { 'Content-Type': 'application/json; charset=utf-8' } ) with urllib.request.urlopen(request) as response: print(response.read().decode('utf-8'))
環境変数
[設定] → [環境変数] → 編集 環境変数の編集 環境変数 [環境変数の追加] キー: SLACK_WEBHOOK_URL 値: (作成したSlackのWebhook URL) [保存]
動作確認
テストイベントに下記を設定して実行します。
TEXT
{ "Records": [ { "Sns": { "Subject": "[テスト]notifyErrorLog report for sendSlackWarning", "Message": "Please ignore." } } ] }
JSON
{ "Records": [ { "Sns": { "Subject": "[テスト]notifyErrorLog report for sendSlackWarning", "Message": "{\"message\": [[\"Please ignore.\"]]}" } } ] }
「critical = True」にすると、こんな感じになる。
SNSサブスクリプションを作成(Slack通知)
https://ap-northeast-1.console.aws.amazon.com/sns/v3/home?region=ap-northeast-1#/create-subscription
サブスクリプションの作成 詳細 トピックARN: (対象のSNSトピックを選択) プロトコル: AWS Lambda エンドポイント: (作成したLambda関数のARN) [サブスクリプションの作成]
動作確認
Lambdaの例外エラーをメールとSlackに通知する で作成したエラーになるパターンを実行して通知が来るか確認します。
“エラーをSNS経由でSlackに通知する” に対して2件のコメントがあります。