実装を減らすと、障害ポイントも減るので、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': ('' if critical else ''),
            '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に通知する で作成したエラーになるパターンを実行して通知が来るか確認します。

非同期(S3トリガーやEventBridgeなど)の場合

同期(APIなど)の場合

コメントを残す

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