🎃

Chatbotのカスタム通知をCDKで実装する

2024/04/20に公開

概要

Slack等に通知する際にChatbotを使うと簡単にインテグレーションできるのすごく便利ですよね!
一方で、Chatbotを使うとインテグレーションのコストは低いんですが、通知内容がパッと見でわかりにくかったり、もうちょっと情報を足したい!メンションもつけたい!等、細かい要望を叶えることができないと感じることも多いのではないでしょうか。

2023.09のアップデートでChatbotのカスタム通知ができるようになったので、それをCDKでどう実現するかについて書いてみようと思います。

公式ドキュメント:
https://docs.aws.amazon.com/chatbot/latest/adminguide/custom-notifs.html

アップデート記事:
https://dev.classmethod.jp/articles/aws-chatbot-custom-notification/

ポイント:
自分も最初勘違いしていましたが、
Chatbotのカスタム通知機能はChatbotの設定を変更することで実現することではありません。
EventBridgeの入力トランスフォーマーというものを適したフォーマットにすることで実現します。

EventBridgeの入力トランスフォーマーという機能自体は以前から存在しているもので、SNS, Chatbotへのインプット情報がChatbotに対応した形式になっていれば良いのでEventbridgeではなくLambdaを使ってカスタム通知をすることも可能です。
この記事では、Lambdaを使う方法でなく、EventBridge→SNS→Chatbotの構成で通知するパターンについて記述します。

構成のイメージとしては、先ほど挙げたクラスメソッドさんの記事にあるこのような構成になります。

CDKで実装していく

入力トランスフォーマーを定義する.

const inputTransformer = {
  InputPathsMap: {
    time: '$.time',
    account: '$.account',
    region: '$.region',
    resource: '$.resources[0]',
    'cluster-arn': '$.detail.clusterArn',
  },
  InputTemplate: JSON.stringify({
    version: '1.0',
    source: 'custom',
    content: {
      textType: 'client-markdown',
      title: ':warning:異常アラート:warning:',
      description:
        '異常が発生しました。',
      nextSteps: [
        'ECSが異常終了した原因と影響を確認しにいきましょう。',
        'Time: <time>',
        'Account: <account>',
        'Region: <region>',
        'Resource: <resource>',
        'ClusterARN: <cluster-arn>',
        'ログへのリンクなど',
      ],
    },
  }),
}

入力トランスフォーマーをEventBridgeのRuleに設定する.

const eventRule = new events.Rule()

eventRule.addTarget(
  new targets.SnsTopic(snsTopic, {
    message: events.RuleTargetInput.fromObject(inputTransformer),
  })

// inputTransformerを設定するためにL1にキャストしてTargetsを指定し直す
const cfnEventRule = eventRule.node.defaultChild as events.CfnRule
cfnEventRule.addPropertyOverride('Targets', [
  {
    Arn: ecsLogGroup.logGroupArn,
    Id: 'Logs',
  },
  {
    Arn: snsTopic.topicArn,
    Id: 'SNS',
    InputTransformer: inputTransformer,
  },
])

今回は事前に定義してあるevents.Ruleに対して、inputTransformerを設定しています。
そのため、一度L1にキャストしてTargetsの指定をし直す必要がありました。

まとめ

Chatbotのカスタム通知をCDKで実装する方法の紹介になります。
今回のように、 EventBridgeSNSChatbot のような構成になっている場合は比較的容易にカスタムメッセージを設定できるかなと感じました。
一方で、 CloudWatch AlarmSNSChatbot のようにEventBridgeを挟まずにChatbotで通知をしているパターンの場合はEventBridgeを明示的に定義するようにするしかないように感じていて、カスタム通知をするのがやや手間に感じます。
この辺り簡単にできるよ!っていう方法を知っている方いましたらぜひ教えていただきたいのと同時に良い方法を探していきたいと思います。

以上、Chatbotのカスタム通知のCDK実装で困っている人の役に立てば幸いです。

Discussion