アットランタイム

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 を使用するべきでしょう。