CData Sync の処理結果を MS Teams に通知する

by 杉本和也 | 2021年10月04日

f:id:sugimomoto:20211004144851p:plain

こんにちは。CData Software Japan リードエンジニアの杉本です。

前回の記事で CData Sync のジョブ結果を Slack に通知する方法を紹介しました。

www.cdatablog.jp

今回はこちらを使っている人も多いであろう Microsoft のコラボレーションツール Teams に処理結果を通知する方法を紹介したいと思います。

MS Teams 側に Incoming Webhook のエンドポイントを準備する

まずは前回と同様にIncoming Webhookのエンドポイントを準備しましょう。

投稿したいチャネルのコネクタ画面に移動して、「Incoming Webhook」を構成します。

f:id:sugimomoto:20211004144321p:plain

Incoming Webhookの名前とアイコンを設定し登録しましょう。

f:id:sugimomoto:20211004144341p:plain

これでIncoming WebhookのURLを取得できるので、この値を元にCData Syncの設定を追加します。

f:id:sugimomoto:20211004144411p:plain

Sync に Post-Job イベントを追加する

MS Teams の Webhook URLを取得したら、そのURLを用いてPost-Job イベントのスクリプトを作成します。

cdn.cdata.com

「http」という変数にそれぞれパラメータを設定して「httpPost」というオペレーションメソッドにその変数を渡すことで、APIリクエストが実行されます。

今回も私が簡単な雛形を作っているので、これを利用してみましょう。

「<api:set attr="http.url" value="https://XXXX.webhook.office.com/webhookb2/XXXX@XXXX/IncomingWebhook/XXXXX/XXXXX"/> 」の部分だけ、作成したWebhook URLに差し替えてみてください。

<!-- NOTE: Do not edit api:info -->
<api:info title="After Run" desc="This event is fired after running a job.">
  <input name="JobName"         required="true" desc="The name of the job being executed." />
  <input name="Source"          required="true" desc="The name of source connection." />
  <input name="Destination"     required="true" desc="The name of destination connection." />
  <input name="JobStatus"       required="true" desc="The status of the completed run." />
  <input name="Query#"          required="true" desc="The hash of each query that ran." />
  <input name="QueryStatus#"    required="true" desc="The hash of the status of each query ran." />
</api:info>


<api:set attr="http.url"  value="https://XXXX.webhook.office.com/webhookb2/XXXX@XXXX/IncomingWebhook/XXXXX/XXXXX"/>
<api:set attr="http.contenttype"  value="application/json"/>

<api:set attr="_input.temp">
## Results
</api:set>

<api:enum prefix="Query#">
<api:set attr="_input.temp">
[_input.temp]
- [_index | just(5)] : [_value] : [QueryStatus#[_index]]
</api:set>
</api:enum>


<api:set attr="text">
- Source: [_input.Source]
- Destination: [_input.Destination]

[temp]
</api:set>

<api:set attr="http.postdata">
{
    "title":"JobName: [_input.jobname] / JobStatus: [_input.JobStatus]",    
    "text":"[text]"
}
</api:set>

<api:call op="httpPost" in="http"/>

このScriptを対象のジョブの「Post-Job イベント」のところに貼り付けます。

f:id:sugimomoto:20210923171631p:plain

設定を保存したら、試しにジョブを手動実行してみましょう。

f:id:sugimomoto:20210923171637p:plain

ジョブが完了すると、以下のように MS Teams にジョブの処理結果が通知されました!

それぞれのレプリケーション内容およびレプリケーション結果も表示できます。

f:id:sugimomoto:20211004144619p:plain

失敗の通知だけ行いたい場合(2021/10/13追記)

こちらの記事を公開した後に「失敗のときだけ通知したい場合はどうすればいいの?」という質問をお客様から頂きました。

スクリプトでは以下のようにIF文を使って、条件分岐を行うことができます。ここで「_input.JobStatus」の変数に格納されている処理結果を元に分岐して、失敗、つまり成功以外を通知させる設定にすることが可能です。

<api:if attr="_input.JobStatus" value="SUCCESS" operator="notequals">
 (SUCCESSで無い場合)
</api:if>

スクリプトの全体像としては以下のようになります。もしスケジュールを細かく組んでいる場合はこちらのほうが良いかもですね。

<!-- NOTE: Do not edit api:info -->
<api:info title="After Run" desc="This event is fired after running a job.">
  <input name="JobName"         required="true" desc="The name of the job being executed." />
  <input name="Source"          required="true" desc="The name of source connection." />
  <input name="Destination"     required="true" desc="The name of destination connection." />
  <input name="JobStatus"       required="true" desc="The status of the completed run." />
  <input name="Query#"          required="true" desc="The hash of each query that ran." />
  <input name="QueryStatus#"    required="true" desc="The hash of the status of each query ran." />
</api:info>
 
<api:if attr="_input.JobStatus" value="SUCCESS" operator="notequals">
 
<api:set attr="http.url"  value="https://XXXX.webhook.office.com/webhookb2/XXXX@XXXX/IncomingWebhook/XXXXX/XXXXX"/><api:set attr="http.contenttype"  value="application/json"/>
 
<api:set attr="_input.temp">
## Results
</api:set>
 
<api:enum prefix="Query#">
<api:set attr="_input.temp">
[_input.temp]
- [_index | just(5)] : [_value] : [QueryStatus#[_index]]
</api:set>
</api:enum>
 
 
<api:set attr="text">
- Source: [_input.Source]
- Destination: [_input.Destination]
 
[temp]
</api:set>
 
<api:set attr="http.postdata">
{
    "title":"JobName: [_input.jobname] / JobStatus: [_input.JobStatus]",    
    "text":"[text]"
}
</api:set>
 
<api:call op="httpPost" in="http"/>
 
</api:if>

おわりに

もし設定で不明な部分、よくわからない点があれば、テクニカルサポートまでお気軽にお問い合わせください。

https://www.cdata.com/jp/support/submit.aspx

関連コンテンツ

トライアル・お問い合わせ

30日間無償トライアルで、CData のリアルタイムデータ連携をフルにお試しいただけます。記事や製品についてのご質問があればお気軽にお問い合わせください。