StepFunctions から AWS Q Developer(旧 AWS ChatBot)を通じて Slack に送信する
はじめに
AWS Q Developer(旧 AWS ChatBot) を Slack 連携すると、Slack への通知を IAM を通じて実現できます。 Slack の WebHook URL や Token を管理する必要がなくなり、無駄な Lambda を経由する必要がなくなります。
また、現在では、Custom notifications using Amazon Q Developer in chat applicationsにあるように、CloudWatch アラームだけでなく、EventBridge の Input Transformer を使用して、通知できます。この仕組みを使用して StepFunctions のステートマシン内から Slack に通知します。
仕組み
カスタムメッセージは、ChatBot に紐付いた SNS トピックに対して、カスタムメッセージフォーマットのメッセージをパブリッシュすることで実現します。公式ドキュメントの EventBridge を使用した方法は、カスタムメッセージフォーマットに整形するために Input Transformer を使用しています。したがって、StepFunctions からも、カスタムメッセージフォーマットに整形し SNS へパブリッシュすれば Slack へ連携できます。
ステートマシン定義
${sns_topic_arn} を ChatBot に紐付いた SNS トピック ARN に置き換えます。ステートマシン起動時にパラメータとしてメッセージの内容を指定すれば OK です。enableCustomActions は Slack 通知時にカスタムアクションのメニューバー的なものを表示するものです。
ステートマシン定義例
{
"Comment": "JSONata を使って SNS 経由で Chatbot にカスタム通知を送信する",
"QueryLanguage": "JSONata",
"StartAt": "SendNotification",
"States": {
"SendNotification": {
"Type": "Task",
"Resource": "arn:aws:states:::sns:publish",
"Arguments": {
"TopicArn": "${sns_topic_arn}",
"Message": {
"version": "1.0",
"source": "custom",
"id": "{% $string($millis()) %}",
"content": {
"textType": "client-markdown",
"title": "{% $states.input.title %}",
"description": "{% $states.input.description %}",
"nextSteps": "{% $exists($states.input.nextSteps) ? $states.input.nextSteps : [] %}",
"keywords": "{% $exists($states.input.keywords) ? $states.input.keywords : [] %}"
},
"metadata": {
"enableCustomActions": false
}
}
},
"End": true
}
}
}
入力値例
{
"title": ":smile: Deployment Failed",
"description": "prod deploy failed at step X\nテストです。",
"nextSteps": ["Check CloudWatch Logs", "Notify on-call"],
"keywords": ["deploy", "prod"]
}
まとめ
AWS Q Developer(旧 AWS ChatBot)を使用すると Slack への通知を IAM を使用して集約できます。SNS トピックはリソースポリシーにも対応しているため、クロスアカウントの構成にし、複数のアカウントで通知を集約することも可能です。また、ChatOps 機能もあります。 ただし、AWS Q Developer アプリを使用するため、通知時のアプリのアイコンを変更することはできません。充実した構成にするなら、これまで通り Slack App を使用するべきでしょう。