膨大なセンサーデータと連携 ! Azure Cosmos DB 連携: 解説

みなさん、こんにちは。

前回に続き、膨大なセンサーデータから自動で異常を検知して Dynamics 365 にケースを自動作成するサンプルデザインを紹介します。
前回の記事を読まれていない方は、是非ご覧ください。

膨大なセンサーデータと連携 ! Azure Cosmos DB 連携: 概要
膨大なセンサーデータと連携 ! Azure Cosmos DB 連携: 事前準備 その 1
膨大なセンサーデータと連携 ! Azure Cosmos DB 連携: 事前準備 その 2

前回で、事前準備は完了しました。今回は、なぜこのようなデザインになっているのかを解説していきたいと思います。

概要

2 つのポイントを解説していきます。

- なぜコネクタ (Azure API) が必要なのか?
- 別の項目を連携するにはどうしたらよいか?

今一度サンプルデザインをご覧ください。

image_thumb190

なぜコネクタ (Azure API) が必要なのか?

サンプルデザインをご覧になって、なぜコネクタ(Azure API) が必要なのかと疑問に思われた方もいらっしゃると思います。
理由は、Logic Apps にて Azure Cosmos DB のトリガーがないためと説明しましたが、一方、このコネクタは具体的に何をしているのか技術的な観点を解説します。

Azure Cosmos DB Document API

コネクタは、Logic Apps と Azure Cosmos DB の間にあり、Logic Apps のリクエストを Azure Cosmos DB に中継しています。
Azure Cosmos DB の API を利用するには、3 つの項目を HTTP ヘッダーに含める必要があります。

1. トークンのタイプ (type): トークンのタイプを指定します。(Master or resource)
2. トークンのバージョン (ver): トークンのバージョンを指定します。(現在は 1.0)
3. ハッシュされたトークン署名(sig): ここがポイントです。詳細は後ほど解説します。

実際にヘッダーに追加された例を示します。
type=master&ver=1.0&sig=5mDuQBYA0kb70WDJoTUzSBMTG3owkC0/cEN4fqa18/s=

ハッシュされたトークン署名

ハッシュされたトークン署名は、4つの情報をもとに生成します。

1. リクエストの種類(GET, POST or PUT)
2. 対象リソースの種類("dbs", "colls", "docs")
3. リソースのリンク(例: "dbs/MyDatabase/colls/MyCollection")
4. リクエスト発行日時(例: Tue, 01 Nov 1994 08:12:31 GMT)

Azure Cosmos DB は、リクエストする日時ごとにハッシュされたトークン署名を生成してアクセスする必要があります。本サンプルデザインにおいて、この処理を実施しているのがまさしくコネクタになります。トークンについての詳細は以下を参照ください。

Constructing the hashed token signature for a master token:
https://docs.microsoft.com/ja-jp/rest/api/documentdb/access-control-on-documentdb-resources?redirectedfrom=MSDN#constructkeytoken

Connector of のソースコードの確認

では、コネクタのソースコードを実際にチェックしてみましょう。

1. コネクタの GitHub に行きます。

https://github.com/jeffhollan/docdb-connector

2. docdb-connector/controllers/document.ts を開きます。

image

3. document.ts には、5 つの API が定義が記載されいるのがわかります。

- POST - create a document
- POST - Upsert a document - called from a PUT /docs on client
- GET - get a document by index
- PUT - replace a document by index
- POST - query for documents - client calls via POST on /query/docs

4. 5 つ目の POST - query for documents を見てみます。getAuthorizationUsingMasterKey メソッドを呼び出してハッシュされたトークン署名を取得しています。

image

5. メソッドの定義は docdb-connector/resources/utils.ts にあります。

image

これは、公開情報にあるサンプルコードを利用していることがわかります。

https://docs.microsoft.com/ja-jp/rest/api/documentdb/access-control-on-documentdb-resources?redirectedfrom=MSDN#constructkeytoken

つまり、コネクタは、Logic Apps から受け取ったリクエストに対する ハッシュされたトークン署名を生成し、Azure Cosmos DB へリクエストを送り、結果を返却してます。

別の項目を連携するにはどうしたよいか?

続いて、Azure Cosmos DB から取得したセンサーデータのうち、Id ではなく別の項目を Dynamics 365 レコードに引き継ぐにはどうしたらよいか解説します。
まずセンサーデータを開きます。センサーデータには、”id” と “status” 項目があります。

image

続いて、作成した Logic Apps を開きます。現在は、タイトルにセンサーデータの "id" 項目の値を設定しています。

image

今度は、[説明] という項目に “status” を設定してみます。[コードビュー] をクリックします。

image

“description”: “@item()[‘status’]” を挿入します。

image

保存して実行します。

実行結果を開きます。description に “status” の値が設定されていることがわかります。

image

続いて、Dynamics 365 を開きます。

image

作成されたサポート案件を開きます。[説明] に値が設定されていることがわかります。

image

まとめ

4 回に分けて IoT のシナリオを想定したサンプルデザインを紹介しました。サンプルデザインにより、今後検討される方が評価しやすくなれば幸いです。

なお、Dynamics 365 と Azure Cosmos DB 連携は、製品標準機能(現在はプレビュー)として今後提供される予定です。これにより、標準機能でより簡単に評価できます。

https://docs.microsoft.com/ja-jp/dynamics365/customer-engagement/customize/virtual-entity-documentdb-provider-requirements

本記事で紹介したサンプルデザインは、標準機能とは ”別の選択肢” の 1 つとして理解いただければと思います。

– プレミアフィールドエンジニアリング 河野 高也

※本情報の内容(添付文書、リンク先などを含む)は、作成日時点でのものであり、予告なく変更される場合があります。