Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

この記事で試すこと

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

事前に準備するもの

設定手順

Azure Event Hubsの準備

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

  1. Azure Portalへサインインし、「新規」>「データ + 分析」>「Event Hubs」の順にクリックします。
    image

  2. 各項目を記入していきます。記入したら、「作成」をクリックします。
    Name: Event Hubsのアドレスを指定します。一意である必要があるため、入力した名前によっては、既に使われている可能性もあります。
    Pricing Tier: 価格プランを指定します。現時点では、Basicプランと、Standardプランの2種類が選択できます。
    今回はBasicプランで問題ありません。
    image

  3. デプロイが開始されます。1~3分ほどで完了します。
    image
    デプロイが完了すると、以下のように表示されます。
    image

  4. 「その他サービス」>「Event Hubs」の順にクリックします。
    image

  5. (2)で記入した名前のEvent Hubsをクリックします。
    image

  6. 「Shared access policies」を選択し、「Add」をクリックします。
    image

  7. 「Policy Name」に作成するアクセスポリシー(アクセス権限)の利用用途が後にわかりやすくなるような名前を指定します。
    (ここではwebapiのデータを送信するためなので、「webapi」として入力しました)
    Event Hubsへ送信する用途のみに利用するポリシーなので、Claimは「Send」にチェックを入れ、「Create」をクリックします。
    image

  8. 作成されると、接続のためのアクセスキーを接続文字列が生成されます。
    後に必要になるので、Primary KeyとConnection String - Primary Keyはメモ帳などにコピーしておきます。
    image

  9. Event Hubsを作成するためのネームスペースが作成されましたが、まだEvent Hubs自体は作成されていません。「Add Event Hub」をクリックし、「Name」を記入、「Create」をクリックすることでEvent Hubsが作成されます。
    image

  10. 以下のようなメッセージが表示されたら、デプロイ完了です。
    image

プログラムを準備する

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

  2. ソリューションファイル(GenericWebToEH.sln)を開き、「WorkerHost」フォルダにある、「App.config」を開きます。
    image

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

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

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

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

app.config
    <add key="Microsoft.ServiceBus.EventHubToUse" value="[イベントハブ名]" /> 
    <add key="Microsoft.ServiceBus.ServiceBusConnectionString" value="[接続文字列]" />
  1. API接続のためのユーザー名とパスワードを入力します。必要ない場合は""で空欄にします。
app.config
    <add key="UserName" value="[APIのユーザー名]" />
    <add key="Password" value="[APIのパスワード]" />

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

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

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

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

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

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

  2. Azure アプリケーションの公開ウィザードが立ち上がります。まだログインしていない場合は、AzureサブスクリプションのログインIDでログインし、「次へ」をクリックします。
    image

  3. 名前、地域、レプリケーションを設定し、「作成」をクリックします。
    image

  4. 設定は既定のままにし、「次へ」をクリックします。
    image

  5. 内容を確認し、問題がなければ「発行」をクリックします。
    image

  6. 以下のように「Microsoftのアクティビティログ」が表示されたらデプロイ完了です。
    image

  7. Azure ポータルの「Event Hubs」から受信件数が確認できます。以下のように、定期的にデータの受信件数が確認できたら、無事送信されていることを意味します。
    image

東京メトロのオープンデータで試してみた

APIの準備

今回は、東京メトロのAPIを利用してみました。( https://developer.tokyometroapp.jp/
事前に登録が必要ですので、数日余裕を持ってご登録ください。

  1. Account右にある▼をクリックし、「アクセストークンの確認・追加」をクリックします。
    image

  2. 「アクセストークンの追加発行」をクリックします。
    image

  3. わかりやすい名前を記入し、「Submit」をクリックします。
    image

  4. APIキーが表示されますので、こちらのメモを取ります。
    image

  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へ設定してみたいと思います。
以下の内容へ変更して、デプロイすれば設定完了です!

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/

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away