Azure Status の RSS フィードを取得して Microsoft Teams チャネルに通知したい

# Teams の Office 365 コネクタがリタイア

今まで [Azure Status](http://azure.microsoft.com/en-us/status/?wt.mc_id=AZ-MVP-5003113) の RSS フィードは、[Teams の RSS コネクタ](https://support.microsoft.com/ja-jp/office/7f25902b-4f6f-4953-a8a3-fa039eb3bbee?wt.mc_id=AZ-MVP-5003113)を使ってチャネルに通知していましたが、Teams の Office 365 コネクタがリタイアするということで、別のソリューションに移行する必要があります。

https://devblogs.microsoft.com/microsoft365dev/retirement-of-office-365-connectors-within-microsoft-teams/?wt.mc_id=AZ-MVP-5003113

:::note info
**Microsoft Teams の Office 365 コネクタとは**
Microsoft Teams 内でさまざまな外部サービスやアプリケーションからの情報を受け取るための機能です。これにより、Teams のチャネルに直接通知や更新情報を表示することができます。筆者やその周りでは、RSS、Incoming Webhook、Azure DevOps などをよく使っていました。
:::

なお、移行先として、Power Automate クラウドフロー ([Teams Workflows](https://support.microsoft.com/ja-jp/office/242eb8f2-f328-45be-b81f-9817b51a5f0e?wt.mc_id=AZ-MVP-5003113)) が推奨されています。


# はじめに

この投稿では、Teams の RSS コネクタを用いた Teams チャネルの通知を、Power Automate クラウドフローに移行 (作成) するにあたって、いろいろギモンに思ったこと、調べたことをメインに書きます。


# 今までと同じように通知させたい！ :persevere:

Teams の RSS コネクタからの通知と同じように挙動するワークフローを目指して作ってみましたが、思ったとおりに動作しません。

以下、見受けられた問題点です。

- [When a feed item is published](https://learn.microsoft.com/en-us/connectors/rss/?wt.mc_id=AZ-MVP-5003113#when-a-feed-item-is-published) トリガーではなぜか受け取れない
    → **[解決]** [List all RSS feed items](https://learn.microsoft.com/en-us/connectors/rss/?wt.mc_id=AZ-MVP-5003113#list-all-rss-feed-items) アクションを用いて定期的にクロールする
- Teams の RSS コネクタを使った場合はチャネルに通知されるが、Power Automate クラウドフローでは通知されない
    - RSS フィードの `publishDate` を用いた条件に合致したら Teams チャネルへ通知するようにしてみたが、なかなかこの条件に合致せず...**そもそも `publishDate` の値が間違っているのか？**
    - **Teams の RSS コネクタでは異なる条件を用いているのか？**

上記のようにギモンがありましたので、それぞれの観点から実際に Teams の RSS コネクタを使ってチャネルに通知された時、RSS フィードの各項目がどのように変化しているか調べてみました。

※ Azure Status の RSS フィードの値は、Teams の RSS コネクタによってチャネルへ通知された頃に取得したものを用いて調べました。


## そもそも `publishDate` の値が間違っているのか？

$RSS フィードの publishDate ≧ (取得時の日時 (UTC) - 1h)$ 

という条件でチャネルに通知させようと試みましたが、RSS フィードの内容が更新されても `publishDate` は思ったとおりに更新されていないようです。[When a feed item is published](https://learn.microsoft.com/en-us/connectors/rss/?wt.mc_id=AZ-MVP-5003113#when-a-feed-item-is-published) トリガーで受け取れなかった理由はどうやらこれっぽいですね。

ちなみに `updatedOn` は、常に `0001-01-01 00:00:00Z` がセットされていました。

| 取得時 (JST) | RSS 通知 | WF 通知 | publishDate (UTC) |
|:-:|:-:|:-:|:-:|
| 7/30 20:00 | - | - |  |
| 7/30 21:00 | **有** | **有** | 2024-07-30 11:50:52Z |
| 7/30 22:00 | **有** | 無 | 2024-07-30 11:13:00Z |
| 7/30 23:00 | **有** | 無 | 2024-07-30 12:00:00Z |
| 7/31 00:00 | **有** | 無 | 2024-07-30 12:00:00Z |
| 7/31 01:00 | 無 | 無 | 2024-07-30 12:00:00Z |
| 7/31 02:00 | **有** | 無 | 2024-07-30 12:00:00Z |
| 7/31 03:00 | **有** | 無 | 2024-07-30 12:00:00Z |
| 7/31 04:00 | **有** | 無 | 2024-07-30 12:00:00Z |
| 7/31 05:00 | **有** | 無 | 2024-07-30 12:00:00Z |
| 7/31 06:00 | **有** | 無 | 2024-07-30 12:00:00Z |
| 7/31 07:00 | - | - |  |

※RSS 通知 ... Teams の RSS コネクタからの通知
※WF 通知 ... Power Automate クラウドフロー (Teams Workflows) からの通知
※「7/30 20:00」と「7/31 07:00」は、Azure Status の RSS フィードにレコードが無かった

ということで、`publishDate` の値が間違っているというか、ちょっとあてにならないみたいです。

## Teams の RSS コネクタでは異なる条件を用いているのか？

下表は、実際に取得した Azure Status の RSS フィードのレコードを前回分と比較した結果です。

| 取得時 (JST) | RSS 通知 | id | title | updatedOn | publishDate | summary | categories |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| 7/30 20:00 | - |   |   |   |   |   |   |
| 7/30 21:00 | **有** | **_X_** | **_X_** | **_X_** | **_X_** | **_X_** | **_X_** |
| 7/30 22:00 | **有** | **_X_** | **_X_** | ↑ | **_X_** | **_X_** | **_X_** |
| 7/30 23:00 | **有** | ↑ | ↑ | ↑ | **_X_** | **_X_** | **_X_** |
| 7/31 00:00 | **有** | ↑ | ↑ | ↑ | ↑ | **_X_** | ↑ |
| 7/31 01:00 | 無 | ↑ | ↑ | ↑ | ↑ | ↑ | ↑ |
| 7/31 02:00 | **有** | ↑ | ↑ | ↑ | ↑ | **_X_** | ↑ |
| 7/31 03:00 | **有** | **_X_** | **_X_** | ↑ | ↑ | **_X_** | **_X_** |
| 7/31 04:00 | **有** | ↑ | ↑ | ↑ | ↑ | **_X_** | **_X_** |
| 7/31 05:00 | **有** | **_X_** | **_X_** | ↑ | ↑ | **_X_** | ↑ |
| 7/31 06:00 | **有** | ↑ | ↑ | ↑ | ↑ | **_X_** | ↑ |
| 7/31 07:00 | - |   |   |   |   |   |   |

※ ↑印は、前回取得した値と同じだったことを表す
※ _X_ 印は、前回取得した値と差異があったことを表す
※ 変化することが無さそうな項目 (独断と偏見) は割愛
※「7/30 20:00」と「7/31 07:00」は、Azure Status の RSS フィードにレコードが無かった

以上のように調べた結果、以下の事柄が見受けられました。

- `publishDate` は、最初にセットされた日時からあまり変更がなさそう
    (はじめの頃は微調整？があり、過去にさかのぼることもあった)
- `updatedOn` は、常に `0001-01-01 00:00:00Z` がセットされている
- `id`、`title` も変化する場合がある
    (キーとなりそうな値も変化されてしまうと、レコードとして管理するのは難しそう)
- 他の項目に差異がなくても `summary` に変化があれば、通知されている
- 前回分と差異がない (すべての項目) 場合は Teams チャネルには通知されていない

Teams の RSS コネクタを使った通知と同じことを Power Automate クラウドフローで実現するには、前回取得した RSS フィードの内容 (主に通知に必要な項目) を保持し、そして今回取得したものと比較し、差異があったら通知するという仕組みを作らなければなりません。

また、今回は RSS フィードには 1 レコードのみでしたが、[List all RSS feed items](https://learn.microsoft.com/en-us/connectors/rss/?wt.mc_id=AZ-MVP-5003113#list-all-rss-feed-items) アクションを用いて定期的にクロールする際は、複数レコードの場合も考慮する必要がありますね。


# 結論！

本来のゴールは、

- Teams の RSS コネクタから Power Automate クラウドフロー (Teams Workflows) に移行すること
- Azure のサービス正常性 (問題発生) を Teams チャネルに通知すること

です。

前述のようにいろいろ調べたり、いろいろ検討してみましたが、そこまで凝ったフローを作成する必要はなく、シンプルに「定期的に Azure Status の RSS フィードを読み込み、Azure のサービス正常性 (問題発生) の情報が取得できたら、Teams チャネルにメッセージを投稿する」というフローで良いだろうと、筆者は結論づけました。


## これでいいのだ :relieved:

簡単ですが、筆者が作ったフローについて説明します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/1514fdae-4362-a52d-d61d-eb70308b3541.png)

1\. 定期的に実行するフローを作成します

https://learn.microsoft.com/ja-jp/power-automate/run-scheduled-tasks?wt.mc_id=AZ-MVP-5003113&tabs=classic-designer

2\. [List all RSS feed items](https://learn.microsoft.com/en-us/connectors/rss/?wt.mc_id=AZ-MVP-5003113#list-all-rss-feed-items) アクションで [Azure Status の RSS フィード](https://azure.status.microsoft/ja-jp/status/feed/)のレコードを取得します

https://learn.microsoft.com/en-us/connectors/rss/?wt.mc_id=AZ-MVP-5003113#list-all-rss-feed-items

3\. 通知するメッセージ内容 (`title`, `primaryLink`, `summary` など) をいいかんじに編集して、[Post message in a chat or channel](https://learn.microsoft.com/en-us/connectors/teams/?wt.mc_id=AZ-MVP-5003113&tabs=text1%2Cdotnet#post-message-in-a-chat-or-channel) アクションで Teams チャネルにメッセージを投稿します
※取得した「Azure Status の RSS フィード」のレコード分、これを繰り返します

https://learn.microsoft.com/en-us/connectors/teams/?wt.mc_id=AZ-MVP-5003113&tabs=text1%2Cdotnet#post-message-in-a-chat-or-channel

ということで、とてもシンプルなフローとなりました。:sweat_smile:


# さいごに

Azure Status の RSS フィードにはどのようなデータが流れてくるのか、「Teams の RSS コネクタから通知」はこんなふうに動いていたんだね (あくまで筆者の想像) って知ることができただけでも良いかなと思います！:thumbsup: