LoginSignup
16
13

More than 3 years have passed since last update.

【Microsoft Flow】フローを利用して Office 365 サービス正常性を監視する

Last updated at Posted at 2019-04-04

はじめに

Microsoft Flow を利用して Office 365 のサービス正常性を監視し、インシデント発生時に管理者へ自動で通知するフローの作成手順メモ。

今回は以下の2パターンの状況をトリガーにして管理者へのメール通知を行う構成の実装手順をそれぞれ紹介する。

  • 現在発生中のインシデントが1件以上ある場合
  • 過去1時間以内にステータスがアップデートされたインシデントが1件以上ある場合

前提

  • Azure Active Directory
  • Office 365(Outlook,Microsoft Flow)
  • Office 365 Service Communications API

手順

[2パターン共通]Azure Active Directory へのアプリケーションの登録

ブラウザから Azure ポータルに接続し、左ペインより[Azure Active Directory]-[アプリの登録(プレビュー)]を開いて、画面上部の[+新規登録]をクリック。
スクリーンショット 2019-04-03 13.53.38.png

アプリケーションの登録画面が開く。[名前]で任意のアプリ名(例:365kanshiApp)を指定し、[登録]をクリック。1
スクリーンショット 2019-04-03 14.01.03.png

新規登録したアプリの概要画面を開く。画面中央に表示される[アプリケーション(クライアント)ID]と[ディレクトリ(テナント)ID]の値をのちほどフロー作成手順の中で設定するので控えておく。
画面中央の[API アクセス許可の表示]をクリック。
スクリーンショット 2019-04-03 14.14.50.png

API のアクセス許可画面が開く。アクセス許可一覧で既に登録されている[User.Read]をクリック。
312e706e67.png

このアクセス許可は不要のため、[アクセス許可の削除]をクリックし、確認ダイアログで[はい、削除します]をクリックして削除。
68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3235383431362f30663739353335312d333137312d633765612d626564352d3838663462346362316561662e706e67.png

API のアクセス許可画面に戻る。[+アクセス許可の追加]をクリック。
68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3235383431362f36303464623738642d663339312d626134622d646639322d3234343961306563666635362e706e67.png

API一覧より[Office 365 Management APIs]を選択。
68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3235383431362f65396561396165392d653636382d396165362d613265622d3737366437393762306662652e706e67.png

[アプリケーションの許可]を選択し、[ServiceHealth.Read]にチェックを入れて、[アクセス許可の追加]をクリック。
68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3235383431362f30383033346233382d343130382d363132362d366563362d3437626235636264663535372e706e67.png

API のアクセス許可画面に戻る。画面下部の[XXに管理者の同意を与えます]をクリックし、確認ダイアログで[はい]をクリック。
スクリーンショット 2019-04-03 14.38.00.png

[ServiceHealth.Read]に対して管理者の同意が付与され、緑色のチェックが付く。
左ペインより[証明書とシークレット]をクリック。
スクリーンショット 2019-04-03 16.34.14.png

証明書とシークレット画面が開く。[+新しいクライアント シークレット]をクリック。
image.png

任意の有効期限を選択して、[追加]をクリック。
image.png

新規追加されるクライアントシークレットの値は、のちほどフロー作成手順の中で設定するので控えておく。
スクリーンショット 2019-04-03 16.44.02.png

フローの作成(現在発生中のインシデントがあれば通知パターン)

1. フローを新規作成

  1. Microsoft Flow を起動してマイ フロー画面を表示
  2. [新規]-[一から作成]メニューをクリック

2. スケジュールのトリガーの作成

本フローを1時間に一回のスケジュールで実行するトリガーを作成する。

  1. トリガー一覧より、[スケジュール]を選択
  2. [新しいパラメータの追加]をクリックして[タイムゾーン]と[開始時刻]にチェックを入れ、アクションの欄外をクリックしてパラメータを追加

image.png

3.プロパティを以下のように設定

プロパティ名 説明
間隔 1
頻度 時間
タイム ゾーン 任意のタイムゾーン
開始時刻 定期実行を開始したいyyyy-MM-ddTHH:mm:ss形式の任意の時刻 ※時刻末尾に「Z」は不要

スクリーンショット 2019-04-03 17.21.13.png

3. HTTP アクションの作成

Office 365 Service Communications API を呼び出して、フロー実行時点の Office 365 の正常性ステータスを取得するアクションを作成する。

  1. [新しいステップ]をクリック
  2. アクション一覧より、[HTTP]を選択
  3. プロパティを以下のように設定
プロパティ名 説明
方法 GET
URI https://manage.office.com/api/v1.0/<テナント ID>/ServiceComms/CurrentStatus <テナント ID>はアプリ登録時に控えたディレクトリ(テナント)IDを指定
認証 Active Directory OAuth
テナント <テナント ID> アプリ登録時に控えたディレクトリ(テナント)IDを指定
対象ユーザー https://manage.office.com/
クライアント ID <クライアント ID> アプリ登録時に控えたクライアント IDを指定
資格情報の種類 シークレット
シークレット <クライアントシークレット> アプリ登録時に控えたクライアントシークレットを指定

スクリーンショット 2019-04-03 17.30.46.png

4. JSON の解析アクションの作成

API から取得した Office 365 の正常性ステータスの json データをパースして次手順で利用できるようにする。

  1. [新しいステップ]をクリック
  2. アクション一覧より、[JSON の解析]を選択
  3. プロパティを以下のように設定
プロパティ名
コンテンツ @{body('HTTP')}
スキーマ 下記の schema.json の内容(クリックして展開)を設定

schema.json
{
    "type": "object",
    "properties": {},
        "value": {
            "type": "array",
            "items": {
                "type": "object",
                "properties": {
                    "FeatureStatus": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "FeatureDisplayName": {},
                                "FeatureName": {},
                                "FeatureServiceStatus": {},
                                "FeatureServiceStatusDisplayName": {}
                            }
                        }
                    },
                    "Id": {},
                    "IncidentIds": {},
                    "Status": {},
                    "StatusDisplayName": {},
                    "StatusTime": {},
                    "Workload": {},
                    "WorkloadDisplayName": {}
                }
            }
        }
}

image.png

5. アレイのフィルター処理アクションの作成

API から取得した Office 365 の正常性ステータスの json データから、フロー実行時点でインシデントが発生しているサービスのみをフィルターして取得するようにする。

  1. [新しいステップ]をクリック
  2. アクション一覧より、[アレイのフィルター処理]を選択
  3. [詳細設定モード]をクリックし、プロパティを以下のように設定
プロパティ名
差出人 @body('JSON_の解析')?['value']
詳細設定モード @not(equals(length(item()?['IncidentIds']), 0))

image.png

6. 条件アクションの作成

前アクションのフィルター結果が1件以上である場合にのみ通知メールを送信するようにする。

  1. [新しいステップ]をクリック
  2. アクション一覧より、[条件]を選択
  3. 左辺の[値の選択]を選択して[式]にlength(body('アレイのフィルター処理'))を設定し、[OK]をクリック

image.png

4.オペレーターおよび右辺を以下のように設定

プロパティ名
オペレーター 次の値に等しい
右辺 0

image.png

7. 条件アクションの「いいえ」内で HTMLテーブルの作成 アクションの作成

インシデント情報の json データを HTML テーブルに変換し、通知メール内で HTML 要素として利用可能にする。

  1. 条件アクションの「いいえ」内の[アクションの追加]をクリック
  2. アクション一覧より、[HTML テーブルの作成]を選択
  3. [詳細オプションを表示する]をクリックし、プロパティを以下のように設定
プロパティ名
開始 @{body('アレイのフィルター処理')}
ヘッダーを含める はい
カスタム

4.ヘッダーを以下のように設定

ヘッダー
IncidentIds @item()?['IncidentIds']
DisplayName @item()?['WorkloadDisplayName']
StatusDisplayName @item()?['StatusDisplayName']

image.png

8. 条件アクションの「いいえ」内で メールの送信 アクションの作成

担当者に送信する通知メールを構成する。

  1. 条件アクションの「いいえ」内の[アクションの追加]をクリック
  2. アクション一覧より、[メールの送信]を選択
  3. プロパティを以下のように設定
プロパティ名
宛先 通知メール送信先メールアドレス
件名 [障害] JST @{addHours(utcNow(), 9, 'yyyy/MM/dd HH:mm')} Office 365 インシデント発生サービス数:@{length(body('アレイのフィルター処理'))}
本文 下記の body.html の内容(クリックして展開)を設定

body.html
body.html
<html>
<head>
  <style> 
table {
    font-family: "arial", Times, serif;
    border-collapse: collapse;
    width: 100%;
}
td, th {
    border: 1px solid #ddd;
    padding: 4px;
}
th {
    padding-top: 8px;
    padding-bottom: 8px;
    text-align: left;
    background-color: #3399ff;
    color: white;
}
  </style>
</head>
<body>
@{body('HTML_テーブルの作成')}
</body>
</html>

image.png

4.[詳細オプションを表示する]をクリックして、[HTML]をはいに設定

image.png

9. フローの保存

任意のフロー名を指定して[保存]をクリックしフローを保存する。
image.png

動作確認(現在発生中のインシデントがあれば通知パターン)

トリガーで設定した時刻にフローが実行され、実行時点で発生中のインシデントが1件以上ある場合は下記のようなメールが設定された宛先に配信される。

スクリーンショット 2019-04-05 15.23.59.png

メール通知されたインシデントについて Office 365 管理センターから確認してみる。

サービス正常性画面を見ると、メール通知されたインシデントIDのインシデント/アドバイザリが現在発生中であることが確認できる。

image.png

フローの作成(過去1時間以内にアップデートされたインシデントがあれば通知パターン)

1. フローを新規作成

  1. Microsoft Flow を起動してマイ フロー画面を表示
  2. [新規]-[一から作成]メニューをクリック

2. スケジュールのトリガーの作成

本フローを1時間に一回のスケジュールで実行するトリガーを作成する。

  1. トリガー一覧より、[スケジュール]を選択
  2. [新しいパラメータの追加]をクリックして[タイムゾーン]と[開始時刻]にチェックを入れ、アクションの欄外をクリックしてパラメータを追加

image.png

3.プロパティを以下のように設定

プロパティ名 説明
間隔 1
頻度 時間
タイム ゾーン 任意のタイムゾーン
開始時刻 定期実行を開始したいyyyy-MM-ddTHH:mm:ss形式の任意の時刻 ※時刻末尾に「Z」は不要

スクリーンショット 2019-04-03 17.21.13.png

3. HTTP アクションの作成

Office 365 Service Communications API を呼び出して、Office 365 の正常性ステータスのメッセージ履歴を取得するアクションを作成する。

  1. [新しいステップ]をクリック
  2. アクション一覧より、[HTTP]を選択
  3. プロパティを以下のように設定
プロパティ名 説明
方法 GET
URI https://manage.office.com/api/v1.0/<テナント ID>/ServiceComms/Messages <テナント ID>はアプリ登録時に控えたディレクトリ(テナント)IDを指定
認証 Active Directory OAuth
テナント <テナント ID> アプリ登録時に控えたディレクトリ(テナント)IDを指定
対象ユーザー https://manage.office.com/
クライアント ID <クライアント ID> アプリ登録時に控えたクライアント IDを指定
資格情報の種類 シークレット
シークレット <クライアントシークレット> アプリ登録時に控えたクライアントシークレットを指定

スクリーンショット 2019-04-03 20.13.04.png

4. JSON の解析アクションの作成

API から取得した 正常性ステータスの json データをパースして次手順で利用できるようにする。

  1. [新しいステップ]をクリック
  2. アクション一覧より、[JSON の解析]を選択
  3. プロパティを以下のように設定
プロパティ名
コンテンツ @{body('HTTP')}
スキーマ 下記の schema.json の内容(クリックして展開)を設定

schema.json
{
    "type": "object",
    "properties": {
        "value": {
            "type": "array",
            "items": {
                "type": "object",
                "properties": {
                    "AffectedWorkloadDisplayNames": {
                        "type": "array"
                    },
                    "AffectedWorkloadNames": {
                        "type": "array"
                    },
                    "Status": {},
                    "Workload": {},
                    "WorkloadDisplayName": {},
                    "ActionType": {},
                    "AffectedTenantCount": {},
                    "AffectedUserCount": {},
                    "Classification": {},
                    "EndTime": {},
                    "Feature": {},
                    "FeatureDisplayName": {},
                    "Id": {},
                    "ImpactDescription": {},
                    "LastUpdatedTime": {},
                    "MessageType": {},
                    "Messages": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "MessageText": {
                                    "type": "string"
                                },
                                "PublishedTime": {
                                    "type": "string"
                                }
                            },
                            "required": [
                                "MessageText",
                                "PublishedTime"
                            ]
                        }
                    },
                    "PostIncidentDocumentUrl": {},
                    "Severity": {},
                    "StartTime": {},
                    "Title": {}
                },
                "required": []
            }
        }
    }
}

image.png

5. アレイのフィルター処理アクションの作成

API から取得した正常性ステータスの json データから、フロー実行時点から過去1時間以内にインシデント情報がアップデートされたサービスのみをフィルターして取得するようにする。

  1. [新しいステップ]をクリック
  2. アクション一覧より、[アレイのフィルター処理]を選択
  3. [詳細モードで編集]をクリックし、プロパティを以下のように設定
プロパティ名
開始 @body('JSON_の解析')?['value']
詳細モード @greater(formatDateTime(item()?['LastUpdatedTime']), addHours(utcNow(), -1))

image.png

6. 条件アクションの作成

前アクションのフィルター結果が1件以上である場合にのみ通知メールを送信するようにする。

  1. [新しいステップ]をクリック
  2. アクション一覧より、[条件]を選択
  3. 左辺の[値の選択]を選択して[式]にlength(body('アレイのフィルター処理'))を設定し、[OK]をクリック

image.png

4.オペレーターおよび右辺を以下のように設定

プロパティ名
オペレーター 次の値に等しい
右辺 0

image.png

7. 条件アクションの「いいえ」内で HTMLテーブルの作成 アクションの作成

インシデント情報の json データを HTML テーブルに変換し、通知メール内で HTML 要素として利用可能にする。

  1. 条件アクションの「いいえ」内の[アクションの追加]をクリック
  2. アクション一覧より、[HTML テーブルの作成]を選択
  3. [詳細オプションを表示する]をクリックし、プロパティを以下のように設定
プロパティ名
開始 @{body('アレイのフィルター処理')}
ヘッダーを含める はい
カスタム

4.ヘッダーを以下のように設定

ヘッダー
IncidentId @item()?['Id']
DisplayName @item()?['WorkloadDisplayName']
FeatureDisplayName @item()?['FeatureDisplayName']
Classification @item()?['Classification']
Status @item()?['Status']
LastUpdatedTime(JST) @addHours(item()?['LastUpdatedTime'], 9, 'yyyy/MM/dd HH:mm')
Message replace(string(last(item()?['Messages'])),'\n\n','')

image.png

8. 条件アクションの「いいえ」内で メールの送信 アクションの作成

担当者に送信する通知メールを構成する。

  1. 条件アクションの「いいえ」内の[アクションの追加]をクリック
  2. アクション一覧より、[メールの送信]を選択
  3. プロパティを以下のように設定
プロパティ名
宛先 通知メール送信先メールアドレス
件名 [障害] JST @{addHours(utcNow(), 9, 'yyyy/MM/dd HH:mm')} Office 365 インシデント情報更新サービス数:@{length(body('アレイのフィルター処理'))}
本文 下記の body.html の内容(クリックして展開)を設定

body.html
body.html
<html>
<head>
  <style> 
table {
    font-family: "arial", Times, serif;
    border-collapse: collapse;
    width: 100%;
}
td, th {
    border: 1px solid #ddd;
    padding: 4px;
}
th {
    padding-top: 8px;
    padding-bottom: 8px;
    text-align: left;
    background-color: #3399ff;
    color: white;
}
  </style>
</head>
<body>
@{body('HTML_テーブルの作成')}
</body>
</html>

image.png

4.[詳細オプションを表示する]をクリックして、[HTML]をはいに設定

image.png

9. フローの保存

任意のフロー名を指定して[保存]をクリックしフローを保存する。

image.png

動作確認(過去1時間以内にアップデートされたインシデントがあれば通知パターン)

トリガーで設定した時刻にフローが実行され、実行時刻から過去1時間以内にインシデント情報がアップデートされたサービスが1件以上ある場合、下記のようなメールが通知先のメールアドレスに配信される。

スクリーンショット 2019-04-05 14.25.19.png

メール通知されたインシデントについて Office 365 管理センターから確認をしてみる。

サービス正常性画面を見ると、「EX176985」「EX177050」のインシデント/アドバイザリ情報が LastUpdateTime の時刻に実際に更新されている。

image.png

また、メッセージセンター画面を見ると、「MC177199」のアナウンスが LastUpdateTime の時刻に実際に投稿されている。

image.png

おわりに

Office 365 のサービス正常性を定期取得するフローは下記のテンプレートが公式からも提供されていますが、テンプレートそのままでは利用できず、アプリケーション登録やアプリケーションIDの設定は別途ユーザーが行う必要があります。
今回の記事ではこのテンプレートを一部参考にしつつ、API から取得してメール通知するデータの項目や、通知メールを送付する条件などをカスタマイズした手順としています。

image.png


  1. ここで[サポートされているアカウントの種類]で[任意の組織のディレクトリ内のアカウント]を選択すると、アプリを登録する Azure Active Directory と、フローを作成する Office 365 が別組織の場合でも構成可能になると思われます。 

16
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
13