データマネジメントチームの金野 浩之です。
以前のブログでWorkflowの成否をメールに通知する方法をご紹介させていただきました。普段の業務ではメールではなく、SlackやMicrosoft Teamsなどのチャットツールを利用されている方も多いかと思います。
今回は、Workflowのエラー通知をメールではなくMicrosoft Teamsのチャネルへ送信する方法についてご紹介いたします。TreasureDataのWorkflowエンジンであるDigdagではHTTPオペレータをサポートしていますので、WorkflowからTeamsに通知を送信するには、Teams APIはPOST形式のHTTPリクエストでメッセージを送信することができるTeams APIを利用します。※2021年9月時点のTeams APIの仕様によります。
WorkflowでのHTTPオペレータの利用方法
WorkflowにてHTTPオペレータを使用する場合のサンプルコードは以下の通りです。Teamsにメッセージを送信する処理はそれ単体でdigファイルを作成しおき、queryなどを実行する大本のWorkflowでエラーが発生した場合にcallオペレータで呼び出すようにします。
2行目がWorkflowのHTTPオペレータになり、リクエスト送信先のURLを記載します。3行目はHTTPリクエストのメソッドを記載します。今回はPOSTメソッドを利用します。(HTTPオペレータではGETメソッドもサポートしており、その場合はオプションの指定方法が異なります)4行目にはPOSTするコンテンツの本文を、5行目と6行目ではコンテンツのフォーマットと、コンテンツタイプを指定します。
こちらでWorkflowを実行すると2行目で指定したURLに対してリクエストを送信することができます。Teams API経由でメッセージを送信する場合、httpオペレータで指定するリクエストの投げ先となるURLと、実際に送信するメッセージを上記フォーマットに併せて定義します。
Microsoft Teamsの事前準備
Workflowに定義するHTTPリクエストの投げ先は、Microsoft Teamsで作成できる受信Webhook URLを使用します。受信Webhook URLの作成はMicrosoft社のDocsをご参照ください。
Workflowの実装方法
ここで取得した受信用Webhook URLをWorkflowのhttpオペレータの引数に指定します。例えば、https://zzzzzzz.webhook.office.com/XXXXXXXXXX/ のようなWebhook URLが発行された場合、下記図の2行目のようにWorkflowへ定義します。また、Teamsへ送信するメッセージは下記5行目のようにJSON形式でcontentに定義する必要があります。併せてcontent_format: text、content_type: application/jsonと指定します。
これのWorkflowを実行すると、contentに指定した値がTeamsのチャットに送信されます。
よりリッチなメッセージの配信について
アダプティブカードという形式にすることで、送信するコンテンツのレイアウトを整えたり、太字にするなどの装飾も可能です。以下はアダプティブカードに則って作成したメッセージの例です。${session_id}や$(attempt_id}などのWorkflow実行時に得られる情報を動的にメッセージへ埋め込むことで、エラーの発生したjobにすぐアクセスできるようなリンクも生成することができます。
{"type":"message","attachments":[ {"contentType":"application/vnd.microsoft.card.adaptive","contentUrl":null,"content": { "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", "type": "AdaptiveCard", "version": "1.0", "body": [ { "type": "Container", "items": [ { "type": "TextBlock", "text": "Workflow Failure Alert", "weight": "bolder", "size": "medium" }, ] }, { "type": "Container", "items": [ { "type": "TextBlock", "text": "please re run teams_api_test", "wrap": true }, { "type": "FactSet", "facts": [ { "title": "workflow_name:", "value": "teams_api_test" }, { "title": "session_time:", "value": "${session_local_time}" }, { "title": "Console Access:", "value": "[https://console.treasuredata.com/app/workflows/sessions/${session_id}](https://console.treasuredata.com/app/workflows/sessions/${session_id})" }, { "title": "Command for Rerun:", "value": "`td wf retry ${attempt_id} --latest-revision --resume`" } ] } ] } ] } } ] }
こちらのアダプティブメッセージを使った場合、Teams側でメッセージを受信するとこのように表示されます。見出しが太字で強調され、TDコンソールへのリンクURLもハイパーリンクが張られていることがおわかりいただけるかと思います。
エラー発生時にTeamsへメッセージを送信する際は、あらかじめTeamsにメッセージを送信する処理のみのdigファイルを作成していただき、以下のようにerrorタスクからcallオペレータで呼び出すような形で実装します。
おわりに
今回はWorkflowのエラー発生時にMicrosoft Teamsへエラー通知を行う場合の実装方法をご紹介させていただきました。プロジェクトが大きくなるとTreasureDataへアクセスする人数も増え、運用負荷がかかってくることも多いかと思います。プロジェクトチーム全体でWorkflowの実行結果を確認できるような仕組みを入れることでメンバー間で情報共有しやすくなりますので、ぜひお役立てください。