実装を減らすと、障害ポイントも減るので、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に通知する で作成したエラーになるパターンを実行して通知が来るか確認します。
非同期(S3トリガーやEventBridgeなど)の場合

同期(APIなど)の場合


“エラーをSNS経由でSlackに通知する” に対して2件のコメントがあります。