データマネジメントチームの金野 浩之です。
以前のブログで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の実行結果を確認できるような仕組みを入れることでメンバー間で情報共有しやすくなりますので、ぜひお役立てください。
