LoginSignup
1
1

More than 1 year has passed since last update.

CloudWatch AlarmをSlackに通知する

Posted at

まえがき

👆このやり方でノンコーディングでSlackにメッセージ投稿できることがわかった
とりあえず”動けばよかった”ので、1分に一回起動するようにしていた。

EventBridgeでは、AWSリソースの状態変更を取得してイベント発生できるので、いろんなことができそうです。
ここでは、
CloudWatch Alarmの状態変更があったらSlackに通知する
をします

概要

1、イベントを捕捉する:EventPattern
2、イベントメッセージの項目を拾う:InputPathsMap
3、メッセージを出力する:InputTemplate

----------------------------------------
   全体を表示(折りたたみ)
 ------------------------------------------
AWSTemplateFormatVersion: "2010-09-09"
Parameters:
  AlertNamePrefix:
    Type: String
  SlackChannelName:
    Type: String
  SlackDestinationArn:
    Type: String
  EventBridgeRoleArn:
    Type: String
Resources:
  SlackAlarmALARMRule:
    Type: AWS::Events::Rule
    Properties:
      State: ENABLED
      EventPattern: !Sub
        - |
          {
            "source": ["aws.cloudwatch"],
            "detail-type": ["CloudWatch Alarm State Change"],
            "detail": {
              "alarmName": [{"prefix": "${AlarmName}"}],
              "state": {
                "value": ["ALARM"]
              }
            }
          }
        - {AlarmName: !Ref AlertNamePrefix}
      Targets:
        - Id: slack-destination
          Arn: !Ref SlackDestinationArn
          RoleArn: !Ref EventBridgeRoleArn
          InputTransformer:
            InputPathsMap: 
                "AlarmName": "$.detail.alarmName"
                "PrevState": "$.detail.previousState.value"
                "State": "$.detail.state.value"
                "Reason": "$.detail.state.reason"
            InputTemplate: !Sub
              - |
                {
                  "channel": "${ChannelName}",
                  "username": "監視bot",
                  "icon_emoji": ":tea:",
                  "text":"異常ですよ <AlarmName>  <PrevState> -> <State>",
                  "attachments": [{
                    "text": "<Reason>",
                    "color": "danger",
                    "footer": "EventBridge"
                  }]
                }
              - {ChannelName: !Ref SlackChannelName} 

起動パラメータ

AlertNamePrefix 捕捉するCloudWatch Alarm名称(先頭一致)
SlackChannelName Slackチャンネル名
SlackDestinationArn API送信先のARN 前記事参照
EventBridgeRoleArn EventBridge用IAMロール 前記事参照
AWSTemplateFormatVersion: "2010-09-09"
Parameters:
  AlertNamePrefix:
    Type: String
  SlackChannelName:
    Type: String
  SlackDestinationArn:
    Type: String
  EventBridgeRoleArn:
    Type: String

Resources:
  SlackAlarmALARMRule:
    Type: AWS::Events::Rule
    Properties:
      State: ENABLED

1、イベントを捕捉する:EventPattern

      EventPattern: !Sub
        - |
          {
            "source": ["aws.cloudwatch"],
            "detail-type": ["CloudWatch Alarm State Change"],
            "detail": {
              "alarmName": [{"prefix": "${AlarmName}"}],
              "state": {
                "value": ["ALARM"]
              }
            }
          }
        - {AlarmName: !Ref AlertNamePrefix}

複雑な抽出はできないので命名規則とかよく考える必要がありそうですな

2、イベントメッセージの項目を拾う:InputPathsMap

      Targets:
        - Id: slack-destination
          Arn: !Ref SlackDestinationArn
          RoleArn: !Ref EventBridgeRoleArn
          InputTransformer:
            InputPathsMap: 
                "AlarmName": "$.detail.alarmName"
                "PrevState": "$.detail.previousState.value"
                "State": "$.detail.state.value"
                "Reason": "$.detail.state.reason"

一旦変数に入れる感じですな

3、メッセージを出力する:InputTemplate

            InputTemplate: !Sub
              - |
                {
                  "channel": "${ChannelName}",
                  "username": "監視bot",
                  "icon_emoji": ":tea:",
                  "text":"異常ですよ <AlarmName>  <PrevState> -> <State>",
                  "attachments": [{
                    "text": "<Reason>",
                    "color": "danger",
                    "footer": "EventBridge"
                  }]
                }
              - {ChannelName: !Ref SlackChannelName} 

出力方法。。Slackの👇この形にあわせてやれば良いのです

あとがき

イベントの対象抽出方法や、変換でできることが限られている(条件式とか使えない)ので、パターン別のルールを作るとか考える必要がありそうですな

今までイベント発生をSNS経由でLambdaでSlack通知するように書いていたので、これは楽ちん

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1