データマネジメントユニットの藤井温子です。
この記事では、ワークフローでエラー発生時にSlackで通知する方法について解説します。Treasure Workflowは、ワークフローが実行失敗した際にプロジェクト最終編集者のメールアドレスに通知メールが送信されるようデフォルト設定されていますが、Treasure Data CDPを使うチームのメンバー全員に通知したいケースがあるかと思います。
そのような場合には、Slack通知の設定をすると便利です。ワークフロー内に_error:の設定を記述しておくことで、ワークフローが実行失敗した際に、任意のSlackチャンネルに通知を送ることができます。
_error:とは
前提知識として、ワークフロー実行時にエラーが発生したときに、_error:以下のタスクが実行されます。例えば、下記のように別のdigファイルを呼び出すこともできます。
_error: +wf_error_handling: call>: common/function/wf_error_handling.dig
Slack側の設定
Treasure Data CDPから通知を送るには、Slackの「Slack App」を利用します。Slack Appを設定して、APIのURLに対してリクエストをPOSTすると、指定されたチャネルでSlack Appがメッセージを投稿してくれます。大まかな流れとしては、下記のステップでSlack側の設定を進めます。
1. Slack Appを新規作成する
「Slack API」から新しくAppを作成します。
2. Appのスコープを設定する
作成したAppが何をできるかを指定します。今回の場合 chat:write, chat:write.customize, incoming-webhook の3つが必要です。
Bot User OAuth Tokenを取得する
スコープの設定が完了したら、発行されているOAuth Tokenをコピーします。Tokenは、後でTreasure Workflow側の設定で使用します。
作成したSlack Appを通知したいチャネルに招待する
Slackのワークスペースで、通知を送りたいチャネルに作成したAppを追加します。チャネルにAppが居ないと通知を送ることができません。設定周りの詳細ははSlack APIのページや下記のページ等をご参考ください。
- Slack API
- Slack APIを使用してメッセージを送信する
- 【2021年版】slackAPIでメッセージ投稿するボットアプリ作成・設定(スコープ権限を詳細解説) | AutoWorker〜Google Apps Script(GAS)とSikuliで始める業務改善入門
Treasure Workflow側での記述
Treasure Workflow側では、以下の2つの作業が必要です。
- タスクの記述
- シークレット(認証情報)の設定
1. タスクの記述
_error: 以下にタスクを記述します。_error: 以下に直接記述しても良いですが、エラー通知のタスクは他のワークフローでも使い回しできるので、別のdigファイルに切り出してcall>:オペレータで呼び出す形にすると便利です。http>:オペレータでSlack APIのURLを呼び出し、content:の以下に通知の内容や送り先のSlackチャネルの情報を記述します。弊社のデータマネジメントチームでは、下記の内容でエラー通知を記述しています。
- エラーが発生したワークフローの名前
- セッションタイム(現地時間)
- ワークフローのURL(コンソール)
- Rerunする際のTD toolbeltのコマンド
通知の内容はblocks: 以下に記載していきます。type: sectionの中で内容を段組みにして表示しています。blocksの中身の作成方法もSlackの公式サイトにて解説されていますので、ぜひカスタマイズしてみてください。今回の場合は、送信先のSlackチャネル ${slack_ch} 、ワークフローの名前 ${wf_name} 、コンソールのURLに必要なAPIリージョン ${api_region} は別途変数を定義しています。
+slack_alert: http>: "https://slack.com/api/chat.postMessage" --Slack APIのURL method: POST content_format: json content: channel: ${slack_ch} username: "Failure Alert" --Slack上に表示される投稿者名 icon_emoji: ':fireball:' --Slackのアイコン blocks: - type: header text: type: plain_text text: "ワークフロー実行失敗" - type: section fields: - type: mrkdwn text: |- *Workflow Name* ${wf_name} *Session Time* ${session_local_time} - type: mrkdwn text: |- *Console Access* https://console.${api_region}/app/workflows/sessions/${session_id} *Command for Rerun* `td wf retry ${attempt_id} --latest-revision --resume`
2. シークレット(認証情報)の設定
http>:を実行する際の認証情報を、シークレットに登録します。Slack側で取得したBot User OAuth Tokenをコピーし、Bearer XXXXXX(取得したToken) となるように記載します。
以上で設定完了です。エラーが発生したときは、Slackチャネルにこのようなメッセージが届きます。
プロジェクト内で_error:を記述する場所
下記のように、複数のワークフローをまとめて動かすプロジェクトの構成の場合は、_error:でSlack通知の設定を記述するのは日次で実行するワークフロー(ここではcron_daily.dig)のみでOKです。cron_daily.digの中でproc_01.digやproc_02.digが呼び出されて実行されるため、仮にproc_01.digやproc_02.digが実行失敗した場合でも、最終的にcron_daily.digも実行失敗するため、エラー通知が届きます。
おわりに
データの取り込みや処理は日々実行されるため、エラーに気づかずに対応が遅れると、リカバリが大変になってしまいます。Slack通知を上手く活用しながら、エラーに対処していきましょう。この記事が少しでも参考になりましたら幸いです。