Cortana Intelligence Suiteを構築（第1回）- 公開されているWeb APIのデータをAzure Event Hubsへ送信する

#この記事で試すこと
通常、Azure Event Hubsの一般的な使い方として、何らかのデバイスやローカルにおいてあるプログラムから、データをAzure Event HubsやAzure IoT Hubへ送信します。それについてのドキュメントは多く存在しますが、今回は、オープンデータ等、自分では制御出来ないものを対象に利用したい場合、どのようにAzure Event Hubsへ送信すれば良いかをドキュメント化してみました。

#事前に準備するもの
* Azure サブスクリプション
* Visual Studio 2015以降（どのエディションも利用可能）
    * 事前にAzure SDKが必要です（https://www.visualstudio.com/ja-jp/features/azure-tools-vs.aspx）
* オープンデータへのアクセス権限（権限が必要な場合）

#設定手順
##Azure Event Hubsの準備
まずはAzure Event Hubsを準備します。
※2016年9月にリリースされた、新しいAzure PortalのEvent Hubsでの構築方法を記載します。

1. [Azure Portal](URL http://porta.azure.com)へサインインし、「新規」>「データ + 分析」>「Event Hubs」の順にクリックします。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/a74e9922-28f9-5b3a-b455-4fb3566cdc41.png)

2. 各項目を記入していきます。記入したら、「作成」をクリックします。
**Name:** Event Hubsのアドレスを指定します。一意である必要があるため、入力した名前によっては、既に使われている可能性もあります。
**Pricing Tier:** 価格プランを指定します。現時点では、Basicプランと、Standardプランの2種類が選択できます。
今回はBasicプランで問題ありません。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/960c197c-474e-abe6-d38e-1cd471728d91.png)

3. デプロイが開始されます。１～３分ほどで完了します。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/e3133481-95ea-8537-e3db-13aaab250904.png)
デプロイが完了すると、以下のように表示されます。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/b3937c94-9dc8-e3bb-be2a-2dc68154395b.png)

4. 「その他サービス」>「Event Hubs」の順にクリックします。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/d5acaed6-8094-67ed-86a5-6f68c880d84d.png)

5. (2)で記入した名前のEvent Hubsをクリックします。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/833a1330-63aa-9fa9-f83c-aebbe4fab70e.png)

6. 「Shared access policies」を選択し、「Add」をクリックします。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/a17704f9-2c13-c46d-8535-480c4b301cd7.png)

7. 「Policy Name」に作成するアクセスポリシー（アクセス権限）の利用用途が後にわかりやすくなるような名前を指定します。
（ここではwebapiのデータを送信するためなので、「webapi」として入力しました）
Event Hubsへ送信する用途のみに利用するポリシーなので、Claimは「Send」にチェックを入れ、「Create」をクリックします。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/1adbdc50-30a5-ac58-b2b0-205e5b9aecea.png)

8. 作成されると、接続のためのアクセスキーを接続文字列が生成されます。
後に必要になるので、Primary KeyとConnection String - Primary Keyはメモ帳などにコピーしておきます。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/d82abdc8-4359-2a1d-64f5-ec2803b06c77.png)

9. Event Hubsを作成するためのネームスペースが作成されましたが、まだEvent Hubs自体は作成されていません。「Add Event Hub」をクリックし、「Name」を記入、「Create」をクリックすることでEvent Hubsが作成されます。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/40eb2ae8-3b49-7a58-726b-8cc354a0719a.png)

10. 以下のようなメッセージが表示されたら、デプロイ完了です。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/0be897bc-f55e-105b-e3d8-06e0d3e46504.png)


##プログラムを準備する
1. サンプルプログラムがGithubにアップされているので、まずは、そちらをダウンロードします。
https://github.com/Azure-Samples/event-hubs-dotnet-importfromweb

2. ソリューションファイル（GenericWebToEH.sln）を開き、「WorkerHost」フォルダにある、「App.config」を開きます。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/a6302b5d-ed4c-915a-2a8f-adcd21deb366.png)

3. 接続したいAPIの設定内容を入力します。

APIAddressには、データ取得したい、APIのアドレスを指定します。
※注意：　「&」記号が含まれる場合は代わりに「`&amp;`」で置換します。

 ```xml:app.config
  <XMLApiListConfig>
    <!-- Please use &amp; instead of & symbol-->
    <add APIAddress="APIのアドレス" />
  </XMLApiListConfig>
 ```

Microsoft.ServiceBus.EventHubToUseにはイベントハブ名を入力します。
ここに、事前にAzure PortalでEvent Hubsを作成した際に、メモ帳へコピペしていた情報を記入します。

```xml:app.config
    <add key="Microsoft.ServiceBus.EventHubToUse" value="[イベントハブ名]" /> 
    <add key="Microsoft.ServiceBus.ServiceBusConnectionString" value="[接続文字列]" />
```

4. API接続のためのユーザー名とパスワードを入力します。必要ない場合は""で空欄にします。
    
```xml:app.config
    <add key="UserName" value="[APIのユーザー名]" />
    <add key="Password" value="[APIのパスワード]" />
```

データを取得する間隔をミリ秒単位で指定します。
利用するAPIの利用規程に沿って、指定してください。

```xml:app.config
    <add key="SleepTimeMs" value="10000" />
```

SendJsonでは送信する形式を指定できます。「false」であれば、XML形式、「true」であれば、JSON形式で送信されます。

```xml:app.config
    <add key="SendJson" value="false" />
```

Event Hubsへ送信する際に追加のパラメータを指定できます。
今回は利用しないので、空欄のままですが、例えば複数のメッセージをEvent Hubsへ送信する場合、後でStream Analyticsなどで利用する際の識別方法として便利です。

```xml:app.config
    <!--Optional message settings, default values will be used if unspecified-->
    <add key="MessageSubject" value="" />
    <add key="MessageDeviceId" value="" />
    <add key="MessageDeviceDisplayName" value="" />
  </appSettings>
```

##Azureへプログラムをデプロイする
1. Azure Web Appsへデプロイします。Visual Studioにある、「DeployWorker」を右クリックし、「公開」を選択します。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/e25403cc-665a-5435-3dab-98bbe260071f.png)

2. Azure アプリケーションの公開ウィザードが立ち上がります。まだログインしていない場合は、AzureサブスクリプションのログインIDでログインし、「次へ」をクリックします。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/90345ee0-0adc-7713-012b-4afc77b7b6db.png)

3. 名前、地域、レプリケーションを設定し、「作成」をクリックします。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/86b5ece5-86e5-6cf6-deac-e5d99d655d01.png)

4. 設定は既定のままにし、「次へ」をクリックします。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/8c93e179-fdb5-fd44-d41c-50d7cdd56752.png)

5. 内容を確認し、問題がなければ「発行」をクリックします。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/1d7fcb4e-ae3f-ccc4-e9f4-93d0053999a7.png)

6. 以下のように「Microsoftのアクティビティログ」が表示されたらデプロイ完了です。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/2743cd1d-0def-2d36-3c0b-2a736a823020.png)

7. Azure ポータルの「Event Hubs」から受信件数が確認できます。以下のように、定期的にデータの受信件数が確認できたら、無事送信されていることを意味します。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/64f90042-88d3-beac-3b8a-094441d2c6a3.png)


#東京メトロのオープンデータで試してみた
##APIの準備
今回は、東京メトロのAPIを利用してみました。（ https://developer.tokyometroapp.jp/ ）
事前に登録が必要ですので、数日余裕を持ってご登録ください。

1. Account右にある▼をクリックし、「アクセストークンの確認・追加」をクリックします。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/0ad3369c-27ca-24b4-4ca4-109e5cb926b0.png)

2. 「アクセストークンの追加発行」をクリックします。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/8ebdda90-05c9-7925-cc3f-73585fe7ab3a.png)

3. わかりやすい名前を記入し、「Submit」をクリックします。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/13d32c28-15b9-f3bb-6d47-e982c765d2ae.png)

4. APIキーが表示されますので、こちらのメモを取ります。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/5fed3082-5ab2-acd4-7702-fb9e8c983d5b.png)

5. 利用方法、URL等は開発者用のサイト（ https://developer.tokyometroapp.jp/documents ）にドキュメントが用意されていますので、そちらをご覧ください。今回は、運行状況と電車の位置を取得したいので、以下のアドレスを利用します：

列車ロケーション情報
`https://api.tokyometroapp.jp/api/v2/datapoints?rdf:type=odpt:Train&acl:consumerKey=[APIキー]`

運行情報
`https://api.tokyometroapp.jp/api/v2/datapoints?rdf:type=odpt:TrainInformation&acl:consumerKey=[APIキー]`

##Azureへの設定
準備が整ったところで、App.Configへ設定してみたいと思います。
以下の内容へ変更して、デプロイすれば設定完了です！

 ```xml:app.config
  <XMLApiListConfig>
    <!-- Please use &amp; instead of & symbol-->
    <add APIAddress="https://api.tokyometroapp.jp/api/v2/datapoints?rdf:type=odpt:TrainInformation&amp;acl:consumerKey=[APIキー]" />
    <add APIAddress="https://api.tokyometroapp.jp/api/v2/datapoints?rdf:type=odpt:Train&amp;acl:consumerKey=[APIキー]" />
  </XMLApiListConfig>

  <appSettings>
    <add key="Microsoft.ServiceBus.EventHubToUse" value="[Event Hubs名]" /> 
    <add key="Microsoft.ServiceBus.ServiceBusConnectionString" value="[Event Hubs接続文字列]" />
    
    <add key="UserName" value="" />
    <add key="Password" value="" />

    <add key="SleepTimeMs" value="60000" />
    <!--Worler Role will send XML if false, and Json otherwise-->
    <add key="SendJson" value="true" />

    <!--Optional message settings, default values will be used if unspecified-->
    <add key="MessageSubject" value="" />
    <add key="MessageDeviceId" value="" />
    <add key="MessageDeviceDisplayName" value="" />
  </appSettings>
```

次回の記事では、この東京メトロのデータをAzure Stream AnalyticsやAzure Data Factoryを使って、データのリアルタイムとバッチ加工の方法についてご紹介します。お楽しみに！



#リンク集
著者が作成する際に、参考にしたリンクです：
https://github.com/Azure-Samples/event-hubs-dotnet-importfromweb
https://azure.microsoft.com/en-us/documentation/samples/?service=iot-hub
https://developer.tokyometroapp.jp/documents
https://blogs.msdn.microsoft.com/eventhubs/2016/08/29/azure-event-hubs-now-live-on-new-azure-portal/