はじめに
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]-[アプリの登録(プレビュー)]を開いて、画面上部の[+新規登録]をクリック。
アプリケーションの登録画面が開く。[名前]で任意のアプリ名(例:365kanshiApp)を指定し、[登録]をクリック。1
新規登録したアプリの概要画面を開く。画面中央に表示される[アプリケーション(クライアント)ID]と[ディレクトリ(テナント)ID]の値をのちほどフロー作成手順の中で設定するので控えておく。
画面中央の[API アクセス許可の表示]をクリック。
API のアクセス許可画面が開く。アクセス許可一覧で既に登録されている[User.Read]をクリック。
このアクセス許可は不要のため、[アクセス許可の削除]をクリックし、確認ダイアログで[はい、削除します]をクリックして削除。
API のアクセス許可画面に戻る。[+アクセス許可の追加]をクリック。
API一覧より[Office 365 Management APIs]を選択。
[アプリケーションの許可]を選択し、[ServiceHealth.Read]にチェックを入れて、[アクセス許可の追加]をクリック。
API のアクセス許可画面に戻る。画面下部の[XXに管理者の同意を与えます]をクリックし、確認ダイアログで[はい]をクリック。
[ServiceHealth.Read]に対して管理者の同意が付与され、緑色のチェックが付く。
左ペインより[証明書とシークレット]をクリック。
証明書とシークレット画面が開く。[+新しいクライアント シークレット]をクリック。
新規追加されるクライアントシークレットの値は、のちほどフロー作成手順の中で設定するので控えておく。
フローの作成(現在発生中のインシデントがあれば通知パターン)
1. フローを新規作成
- Microsoft Flow を起動してマイ フロー画面を表示
- [新規]-[一から作成]メニューをクリック
2. スケジュールのトリガーの作成
本フローを1時間に一回のスケジュールで実行するトリガーを作成する。
- トリガー一覧より、[スケジュール]を選択
- [新しいパラメータの追加]をクリックして[タイムゾーン]と[開始時刻]にチェックを入れ、アクションの欄外をクリックしてパラメータを追加
3.プロパティを以下のように設定
プロパティ名 | 値 | 説明 |
---|---|---|
間隔 | 1 | |
頻度 | 時間 | |
タイム ゾーン | 任意のタイムゾーン | |
開始時刻 | 定期実行を開始したいyyyy-MM-ddTHH:mm:ss 形式の任意の時刻 |
※時刻末尾に「Z」は不要 |
3. HTTP アクションの作成
Office 365 Service Communications API を呼び出して、フロー実行時点の Office 365 の正常性ステータスを取得するアクションを作成する。
- [新しいステップ]をクリック
- アクション一覧より、[HTTP]を選択
- プロパティを以下のように設定
プロパティ名 | 値 | 説明 |
---|---|---|
方法 | 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を指定 |
資格情報の種類 | シークレット | |
シークレット | <クライアントシークレット> | アプリ登録時に控えたクライアントシークレットを指定 |
4. JSON の解析アクションの作成
API から取得した Office 365 の正常性ステータスの json データをパースして次手順で利用できるようにする。
- [新しいステップ]をクリック
- アクション一覧より、[JSON の解析]を選択
- プロパティを以下のように設定
プロパティ名 | 値 |
---|---|
コンテンツ | @{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": {}
}
}
}
}
5. アレイのフィルター処理アクションの作成
API から取得した Office 365 の正常性ステータスの json データから、フロー実行時点でインシデントが発生しているサービスのみをフィルターして取得するようにする。
- [新しいステップ]をクリック
- アクション一覧より、[アレイのフィルター処理]を選択
- [詳細設定モード]をクリックし、プロパティを以下のように設定
プロパティ名 | 値 |
---|---|
差出人 | @body('JSON_の解析')?['value'] |
詳細設定モード | @not(equals(length(item()?['IncidentIds']), 0)) |
6. 条件アクションの作成
前アクションのフィルター結果が1件以上である場合にのみ通知メールを送信するようにする。
- [新しいステップ]をクリック
- アクション一覧より、[条件]を選択
- 左辺の[値の選択]を選択して[式]に*
length(body('アレイのフィルター処理'))
*を設定し、[OK]をクリック
4.オペレーターおよび右辺を以下のように設定
プロパティ名 | 値 |
---|---|
オペレーター | 次の値に等しい |
右辺 | 0 |
7. 条件アクションの「いいえ」内で HTMLテーブルの作成 アクションの作成
インシデント情報の json データを HTML テーブルに変換し、通知メール内で HTML 要素として利用可能にする。
- 条件アクションの「いいえ」内の[アクションの追加]をクリック
- アクション一覧より、[HTML テーブルの作成]を選択
- [詳細オプションを表示する]をクリックし、プロパティを以下のように設定
プロパティ名 | 値 |
---|---|
開始 | @{body('アレイのフィルター処理')} |
ヘッダーを含める | はい |
列 | カスタム |
4.ヘッダーを以下のように設定
ヘッダー | 値 |
---|---|
IncidentIds | @item()?['IncidentIds'] |
DisplayName | @item()?['WorkloadDisplayName'] |
StatusDisplayName | @item()?['StatusDisplayName'] |
8. 条件アクションの「いいえ」内で メールの送信 アクションの作成
担当者に送信する通知メールを構成する。
- 条件アクションの「いいえ」内の[アクションの追加]をクリック
- アクション一覧より、[メールの送信]を選択
- プロパティを以下のように設定
プロパティ名 | 値 |
---|---|
宛先 | 通知メール送信先メールアドレス |
件名 | [障害] JST @{addHours(utcNow(), 9, 'yyyy/MM/dd HH:mm')} Office 365 インシデント発生サービス数:@{length(body('アレイのフィルター処理'))} |
本文 | 下記の 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>
4.[詳細オプションを表示する]をクリックして、[HTML]をはい
に設定
9. フローの保存
任意のフロー名を指定して[保存]をクリックしフローを保存する。
動作確認(現在発生中のインシデントがあれば通知パターン)
トリガーで設定した時刻にフローが実行され、実行時点で発生中のインシデントが1件以上ある場合は下記のようなメールが設定された宛先に配信される。
メール通知されたインシデントについて Office 365 管理センターから確認してみる。
サービス正常性画面↗を見ると、メール通知されたインシデントIDのインシデント/アドバイザリが現在発生中であることが確認できる。
フローの作成(過去1時間以内にアップデートされたインシデントがあれば通知パターン)
1. フローを新規作成
- Microsoft Flow を起動してマイ フロー画面を表示
- [新規]-[一から作成]メニューをクリック
2. スケジュールのトリガーの作成
本フローを1時間に一回のスケジュールで実行するトリガーを作成する。
- トリガー一覧より、[スケジュール]を選択
- [新しいパラメータの追加]をクリックして[タイムゾーン]と[開始時刻]にチェックを入れ、アクションの欄外をクリックしてパラメータを追加
3.プロパティを以下のように設定
プロパティ名 | 値 | 説明 |
---|---|---|
間隔 | 1 | |
頻度 | 時間 | |
タイム ゾーン | 任意のタイムゾーン | |
開始時刻 | 定期実行を開始したいyyyy-MM-ddTHH:mm:ss 形式の任意の時刻 |
※時刻末尾に「Z」は不要 |
3. HTTP アクションの作成
Office 365 Service Communications API を呼び出して、Office 365 の正常性ステータスのメッセージ履歴を取得するアクションを作成する。
- [新しいステップ]をクリック
- アクション一覧より、[HTTP]を選択
- プロパティを以下のように設定
プロパティ名 | 値 | 説明 |
---|---|---|
方法 | 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を指定 |
資格情報の種類 | シークレット | |
シークレット | <クライアントシークレット> | アプリ登録時に控えたクライアントシークレットを指定 |
4. JSON の解析アクションの作成
API から取得した 正常性ステータスの json データをパースして次手順で利用できるようにする。
- [新しいステップ]をクリック
- アクション一覧より、[JSON の解析]を選択
- プロパティを以下のように設定
プロパティ名 | 値 |
---|---|
コンテンツ | @{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": []
}
}
}
}
5. アレイのフィルター処理アクションの作成
API から取得した正常性ステータスの json データから、フロー実行時点から過去1時間以内にインシデント情報がアップデートされたサービスのみをフィルターして取得するようにする。
- [新しいステップ]をクリック
- アクション一覧より、[アレイのフィルター処理]を選択
- [詳細モードで編集]をクリックし、プロパティを以下のように設定
プロパティ名 | 値 |
---|---|
開始 | @body('JSON_の解析')?['value'] |
詳細モード | @greater(formatDateTime(item()?['LastUpdatedTime']), addHours(utcNow(), -1)) |
6. 条件アクションの作成
前アクションのフィルター結果が1件以上である場合にのみ通知メールを送信するようにする。
- [新しいステップ]をクリック
- アクション一覧より、[条件]を選択
- 左辺の[値の選択]を選択して[式]に*
length(body('アレイのフィルター処理'))
*を設定し、[OK]をクリック
4.オペレーターおよび右辺を以下のように設定
プロパティ名 | 値 |
---|---|
オペレーター | 次の値に等しい |
右辺 | 0 |
7. 条件アクションの「いいえ」内で HTMLテーブルの作成 アクションの作成
インシデント情報の json データを HTML テーブルに変換し、通知メール内で HTML 要素として利用可能にする。
- 条件アクションの「いいえ」内の[アクションの追加]をクリック
- アクション一覧より、[HTML テーブルの作成]を選択
- [詳細オプションを表示する]をクリックし、プロパティを以下のように設定
プロパティ名 | 値 |
---|---|
開始 | @{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','') |
8. 条件アクションの「いいえ」内で メールの送信 アクションの作成
担当者に送信する通知メールを構成する。
- 条件アクションの「いいえ」内の[アクションの追加]をクリック
- アクション一覧より、[メールの送信]を選択
- プロパティを以下のように設定
プロパティ名 | 値 |
---|---|
宛先 | 通知メール送信先メールアドレス |
件名 | [障害] JST @{addHours(utcNow(), 9, 'yyyy/MM/dd HH:mm')} Office 365 インシデント情報更新サービス数:@{length(body('アレイのフィルター処理'))} |
本文 | 下記の 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>
4.[詳細オプションを表示する]をクリックして、[HTML]をはい
に設定
9. フローの保存
任意のフロー名を指定して[保存]をクリックしフローを保存する。
動作確認(過去1時間以内にアップデートされたインシデントがあれば通知パターン)
トリガーで設定した時刻にフローが実行され、実行時刻から過去1時間以内にインシデント情報がアップデートされたサービスが1件以上ある場合、下記のようなメールが通知先のメールアドレスに配信される。
メール通知されたインシデントについて Office 365 管理センターから確認をしてみる。
サービス正常性画面↗を見ると、「EX176985」「EX177050」のインシデント/アドバイザリ情報が LastUpdateTime の時刻に実際に更新されている。
また、メッセージセンター画面↗を見ると、「MC177199」のアナウンスが LastUpdateTime の時刻に実際に投稿されている。
おわりに
Office 365 のサービス正常性を定期取得するフローは下記のテンプレートが公式からも提供されていますが、テンプレートそのままでは利用できず、アプリケーション登録やアプリケーションIDの設定は別途ユーザーが行う必要があります。
今回の記事ではこのテンプレートを一部参考にしつつ、API から取得してメール通知するデータの項目や、通知メールを送付する条件などをカスタマイズした手順としています。
-
ここで[サポートされているアカウントの種類]で[任意の組織のディレクトリ内のアカウント]を選択すると、アプリを登録する Azure Active Directory と、フローを作成する Office 365 が別組織の場合でも構成可能になると思われます。 ↩