Cloud Monitoring の Slack 通知をいい感じにしたい
はじめに
commmune Advent Calendar 2023 21日目は、
「Cloud Monitoring の Slack 通知をいい感じにしたい」です!
Cloud Monitoring では、アラートポリシーを作成して Slack へ通知させることができます。
通知先のチャンネルへ BOT を招待して、ポリシーの通知先として設定するだけですので非常に簡単です。
ただ、この通知メッセージにはいくつか改善したいポイントがあります。
- 通知がメッセージが縦に長いため、1 画面での表示件数が少なくなる
- 情報量が多く、ほとんど活用していない情報もメッセージに含まれる
- Markdown がそのままメッセージになってしまう
これらを改善するためにカスタム通知を作成したので、そのご紹介です。
アーキテクチャ
アラートポリシーの通知先には、Cloud Pub/Sub を指定することができます。
Cloud Pub/Sub をトリガーとした Cloud Functions を作成し、Cloud Functions で通知内容をカスタマイズしてから Slack へ通知させる流れになります。
Cloud Functions のデプロイは、Cloud Build でおこないます。また、Slack への認証情報は Secret Manager に保存します。
構築
1. Slack & Secret Manager
Slack BOT を作成します。作成方法は公式サイトにわかりやすく書いてあるので割愛します。
Slack BOT の Signing Secret と Bot User OAuth Access Token をそれぞれ、Secret Manager に登録します。# Signing Secret の登録
echo -n "xxxxxxxxxxxxxxxxx" | gcloud secrets create slack-signing-secret \
--replication-policy="automatic" \
--data-file=-
# Bot User OAuth Access Token の登録
echo -n "xoxb-000000000000" | gcloud secrets create slack-bot-user-oauth-token \
--replication-policy="automatic" \
--data-file=-
2. Cloud Monitoring で Cloud Pub/Sub を通知チャンネルとして設定する
Cloud Monitoring の通知先となる Cloud Pub/Sub を作成します。
# トピックの作成
gcloud pubsub topics create notificationTopic
作成しただけですとメッセージを送信できないので、Cloud Monitoring のサービスアカウントへ roles/pubsub.publisher
IAM ロールを付与します。
サービスアカウントのメールアドレスは、service-${PROJECT_NUMBER}@gcp-sa-monitoring-notification.iam.gserviceaccount.com
の形式になります。
PROJECT_NUMBER
は、gcloud コマンドで取得できます。
export YOUR_PROJECT_ID=xxxxxxxxxx
gcloud projects describe ${YOUR_PROJECT_ID} --format="value(project_number)"
Cloud Monitoring でアラートポリシーを作成して、通知チャンネルとしてprojects/PROJECT_NUMBER/topics/notificationTopic
を設定したら準備完了です。
3. Cloud Pub/Sub をトリガーとする Cloud Functions を作成する
チュートリアル を参考にして、Cloud Functions を作成します。
受け取ったメッセージの incident
に詳細[1]がはいっています。今回は、6つの値を使います。
- documentation.content : アラートポリシーの Documentation
- policy_name : アラートポリシー名
- url: 発火したインシデントの Google Cloud Console URL
- scoping_project_id : 指標スコープをホストするプロジェクトID
- state : インシデントの状態で
open
またはclosed
- severity : アラートポリシーの Severity Level
必要な情報をメッセージから取り出して、Slack の Block Kit を組み立てて送信します。インシデントがオープンしたときと、クローズしたときでラインカラーを変えることで視認性をあげています。
また、jsarafajr/slackify-markdown というものを使って、Markdown から Slack の形式に変換をかけて、メッセージを投稿するようにしました。
コード全体はこちらにあげています。
4. Cloud Build で Cloud Functions を deploy する
Cloud Build をつかって、Cloud Functions を作成します。オプションで Cloud Pub/Sub をトリガーとして設定し作成済みの Secret Manager のシークレットを deploy 時に設定します。こうすることで、環境変数としてアクセスすることができます。
ビルド構成ファイルを作成して、deploy を実行します。
# deployコマンド
gcloud builds submit --project=${YOUR_PROJECT_ID} --config ./cloudbuild.yaml
5. 通知をテストする
アラートポリシーを作成したあと、Cloud Pub/Sub のトピックを通知先に設定してください。Cloud Pub/Sub と Cloud Functions を挟んでいるため若干のタイムラグはありますが、正常にメッセージを受信できれば成功です🎉
左が今回の通知メッセージで、右がもともとの通知メッセージです。画面の占有度がだいぶかわったことがわかると思います😄
ドキュメントもきちんとフォーマットされているので、メッセージとしてもスッキリとした印象があります。
さいごに
こういった小さな改善でもアラート疲れを軽減する効果があるかと思います。ぜひ通知内容の改善も実施してみてください🔔
参考
- Cloud Monitoring と Cloud Run を使用したカスタム通知の作成 Google Cloud 公式ブログ
- 通知チャンネルの作成と管理 Google Cloud
- Secret Manager を使用してシークレットを作成してアクセスする Google Cloud
- Cloud Pub/Sub のチュートリアル(第 2 世代)Google Cloud Functions に関するドキュメント
- jsarafajr/slackify-markdown: Convert markdown into Slack-specific markdown
-
その他のキーは 通知チャンネルを作成する - スキーマの例 をご確認ください。 ↩︎
Discussion