LoginSignup
7
10

More than 1 year has passed since last update.

AWS RDS(Aurora MySQL)のスロークエリ発生件数をSlackに通知する

Last updated at Posted at 2023-01-30

前提条件

RDSのスロークエリをCloudWatch Logsに出力している。
awscli v2、jq、curl、sed、catが使用できる環境である。
IAMロール等で、awscliからCloudWatch Logsにアクセスする権限が付与されている。
SlackのIncoming WebHooksのURLを取得済みである。

この記事について

「AWS RDS(Aurora MySQL)のスロークエリ発生件数をSlackに通知する」Bashスクリプトの紹介です。

こんな通知が飛びます。
image.png

リンクから、CloudWatch Logsへアクセスする事ができます。
cron等で、日次実行する事を想定しています。

スクリプト(Bash)

CloudShellで動作確認をしています。

#!/bin/bash

#メッセージを保存する一時ファイル
TEMP_MESSAGE_FILE=$(mktemp templogfile.XXXXXX)

# Slack送信用の設定
COLOR='#32CD32'
WEBHOOK_URL='SlackのIncoming WebHooksのURL'

# CloudWatch Logsから、スロークエリのログを、「日本時間:昨日の00:00~23:59までの期間」で取得
REGION='ap-northeast-1'
LOG_GROUP='スロークエリのロググループ名(例:/aws/rds/cluster/gotchamall-prd/slowquery)'
YESTERDAY=`TZ=Asia/Tokyo date -d '-24 hour' '+%Y-%m-%d'`
START_TIME=`TZ=Asia/Tokyo date --date="${YESTERDAY} 00:00:00.000" +%s%3N`
END_TIME=`TZ=Asia/Tokyo date --date="${YESTERDAY} 23:59:59.999" +%s%3N`

# ログストリーム名を取得
aws logs describe-log-streams --log-group-name ${LOG_GROUP} | jq -r ".logStreams[] | .logStreamName" | while read LOG_STREAM; do
    # ログをタブ区切りで取得
    aws logs filter-log-events --log-group-name ${LOG_GROUP} --log-stream-names ${LOG_STREAM} --start-time $START_TIME --end-time ${END_TIME} \
        | jq -r '.events[] | [(.timestamp/1000+32400 | strftime("%Y-%m-%d %H:%M:%S")), .message] | @tsv' \
        | sed 's/\\n$//' \
        > ${TEMP_MESSAGE_FILE}

    # Slackに通知するための各設定
    # スロークエリの件数
    COUNT=`cat ${TEMP_MESSAGE_FILE} | wc -l`

    # タイトル
    TITLE="LOG STREAM: ${LOG_STREAM}"

    # CloudWatch LogsのURL
    URL="https://${REGION}.console.aws.amazon.com/cloudwatch/home?region=${REGION}#logsV2:log-groups/log-group/"
    URL="${URL}${LOG_GROUP//\//\$252F}/log-events/${LOG_STREAM}\$3FfilterPattern\$3D\$26start\$3D${START_TIME}\$26end\$3D${END_TIME}"

    # 本文
    MESSAGE="DATE:${YESTERDAY}\nCOUNT: ${COUNT}\n${URL}"

    #Slack Incoming WebHooks 送信
    curl -s -S -X POST --data-urlencode \
      "payload={ \
        \"attachments\": [ \
          { \
            \"pretext\": \"${TITLE}\", \
            \"color\": \"${COLOR}\", \
            \"text\": \"${MESSAGE}\" \
          } \
        ] \
      }" \
    ${WEBHOOK_URL}
done

# 後始末
trap "
  rm ${TEMP_MESSAGE_FILE}
" 0

参考元

https://qiita.com/neruneruo/items/eac2ab18686aba0fe483
https://blog.serverworks.co.jp/2022/04/07/163722
https://mariyudu.hatenablog.com/entry/2019/06/29/150937

7
10
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
7
10