テスト仮想化技術検証 ーMQTT- IBM Confidential © 2015 IBM Corporation
by user
Comments
Transcript
テスト仮想化技術検証 ーMQTT- IBM Confidential © 2015 IBM Corporation
テスト仮想化技術検証 ーMQTT- IBM Confidential © 2015 IBM Corporation 目次 はじめに (参考)MQTTについて 使用環境 確認・検証項目 – – – – – 2 サービスの論理/物理リソース定義 レコーディング テストの作成および実行 スタブの作成および実行 その他 © 2015 IBM Corporation IBM Confidential はじめに ~MQTTプロトコル仮想化~ MQTT(MQ Telemetry Transport)プロトコルを使用するサー ビスに対する通信の記録、テストやスタブの作成および実行につ いての設定方法の確認や実機検証を行う 確認・検証項目 – – – – サービスの論理/物理リソース定義(トポロジー・ディスカバリー含む) レコーディング テストの作成および実行 スタブの作成および実行 基本構成 パブリッシュ/サブスクライブ型 デバイス (クライアント) パブリッシュ Eclipse Paho MQTT Clients Sample 3 MQTTブローカー test.mosquitto.org © 2015 IBM Corporation サブスクライブ アプリケーション (サービス) Eclipse Paho MQTT Clients Sample IBM Confidential (参考)MQTTについて パブリッシュ/サブスクライブ型 デバイスA アプリケーションX MQTTブローカー ・・・ … ・・・ トピック1 トピック2 デバイスB MQTTプロトコル • デバイスとアプリケーションが疎結合であり、通信 相手の存在を意識せずに使用できる。 • パブリッシュ/サブスクライブ型であるため、メッ セージを仲介するMQTTブローカーが必要となる。 • シンプルで通信オーバーヘッドが小さく、クライア ント実装のフットプリントも小さい。 • デバイスにMQTTクライアント実装が必要となる (マイコン機器などでは、実装が難しい場合もあ る)。 • トランスポート・レベルの暗号化、デバイスの接続 認証、送達保障(QoS)など、IoTにおいて有用な 機能をプロトコル・レベルでサポートしている。 IoT向けに設計されたプロトコルであるため、有用な機能が多く使いやすい。 パブリッシュ/サブスクライブ型であるため、ブローカーを用意する必要がある。 4 © 2015 IBM Corporation IBM Confidential Cons Pros MQTTプロトコル アプリケーションY 使用環境 MQTTブローカー – – 5 Web上で公開されているオープンなMQTTテスト環境であるtest.mosquitto.orgを利用 test.mosquitto.orgはオープンソースのMQTTブローカー実装であるMosquittoがHostingされ たテスト用環境 © 2015 IBM Corporation IBM Confidential 使用環境 MQTTクライアント – – – 6 基本構成におけるデバイスおよびアプリケーションはいずれもMQTTクライアントとしてMQTT ブローカーを介したMQTT通信を行う MQTTクライアントを実装するための代表的なMQTTクライアント・ライブラリとして以下のも のがある • IBM Mobile Messaging and M2M Client Pack MA9B – IBM提供のMQTTクライアント・ライブラリ – Java(Pahoベース)、C、JavaScriptをサポート • Eclipse Paho MQTT Clients – オープンソースのMQTTクライアント – C、C++、Java、JavaScript、Python and Goをサポート • MQTT.js – Node.js用MQTTクライアント 上記のMobile Messaging and M2M Client Pack MA9Bに含まれるEclipse Pahoベースの サンプルアプリケーションをMQTTクライアントとして検証では利用する © 2015 IBM Corporation IBM Confidential 確認・検証項目 サービスの論理/物理リソース定義 – – 手作業による定義 トポロジー・ディスカバリー – – テストの作成 テストの実行 レコーディング テストの作成および実行 スタブの作成および実行 – – – スタブの作成 直接モード プロキシーモード – ポート・フォワード・プロキシー設定 その他 7 © 2015 IBM Corporation IBM Confidential サービスの論理/物理リソース定義 手作業による定義 デバイス (クライアント) アプリケーション (サービス) MQTTブローカー 手作業 RIT トポロジー・ディスカバリー デバイス (クライアント) プロキシー MQTTブローカー (インターセプト) ディスカバリー 8 © 2015 IBM Corporation アプリケーション (サービス) RIT IBM Confidential サービスの論理/物理リソース定義 手作業による定義 – 「アーキテクチャー・スクール」パースペクティブ上で論理MQTT接続を作成 (参考) http://www-01.ibm.com/support/knowledgecenter/SSBLQQ_8.7.0/com.ibm.rational.rit.protocol.doc/topics/ t_ritmqtt_creating_logical_mqtt_connections.html 9 © 2015 IBM Corporation IBM Confidential サービスの論理/物理リソース定義 – 接続をバインドする物理MQTTブローカーを作成。MQTTブローカーへの接続情報を設定 MQTTブローカーのホスト とポートを指定 接続テストを実施し、「MQTTブローカーに正 常に接続しました」と表示されればOK 10 © 2015 IBM Corporation IBM Confidential サービスの論理/物理リソース定義 – – MQTT接続を開き、「レコーディング・スタジオ」タブに記録対象のトピックを指定 指定したトピック(複数可)に対してパブリッシュされたメッセージのみが記録対象となる 以下のワイルドカードが使用可能 ・番号記号 (#) 文字は階層の完全なサブ ツリーを表すため、サブスクリプション ・トピック・ストリングの最後の文字に 使用 (例:top1/top2/#) ・正符号 (+) 文字は、階層の単一レベル を表し、区切り文字 (/) 相互の間に使用 (例:top1/+/top3) 11 © 2015 IBM Corporation IBM Confidential サービスの論理/物理リソース定義 – – 12 物理ビュー上では物理MQTTブローカーを確認することができる スタブ・モードは「直接」(デフォルト)および「プロキシーでのシフトおよびパススルーの 使用」から選択する © 2015 IBM Corporation IBM Confidential サービスの論理/物理リソース定義 トポロジー・ディスカバリー – – – – 13 MQTTプロトコルのトポロジー・ディスカバリーにも対応している この場合、プロトコル監視に使用するインターセプトはTCPインターセプト(実体はHTTP/TCP プロキシー)となる MQTT通信をキャプチャーするため、監視対象となるMQTTクライアントまたはアプリケーショ ンとMQTTブローカーとの間の通信をインターセプト(プロキシー)経由で実行する必要がある • このため必要なHTTP/TCPプロキシーの設定については次頁を参照 TCPインターセプトを監視ポイントとしてディスカバリーを開始し、MQTT通信を実行すると以 下のようにリソースが検出される。検出対象はパブリッシュのみである © 2015 IBM Corporation IBM Confidential HTTP/TCPプロキシーの設定 – – – MQTTはHTTPと異なるプロトコルのため、HTTPのプロキシー設定ではMQTT通信のプロキシ ー設定は実現できない。そのためHTTP/TCPプロキシーのTCP転送規則を設定し、リバース・ プロキシーとして構成することによりHTTP/TCPプロキシーを経由したMQTT通信を実現する プロキシーのTCP転送規則設定はregistration.xml上に転送規則を記述することにより行い、っ プロキシーに対する通信がMQTTブローカーを宛先として転送されるように設定する。設定変 更した後はプロキシーを再始動する必要がある • disconnect属性(省略可能)については設定値により挙動に違いは見られず MQTTクライアント/アプリケーションはMQTTブローカーではなくプロキシーを宛先として MQTT通信を実行するように構成する ・・・ <!-The following example forwarding rules demonstrate the use of different bind addresses. IP address - binds to the specified adapter. 0.0.0.0 binds to all addresses/adapters on the machine and is useful if you don‘t kn the specific hostname/IP that the machine is actually listening on localhost - only allows connections FROM the local machine and should only be used --> <forward bind=“0.0.0.0:1883" destination="test.mosquitto.org:1883" type="mqtt" /> <!-<forward bind="localhost:1883" destination="example.com:1883" type="mqtts" disconnect="live" /> --> 14 © 2015 IBM Corporation IBM Confidential サービスの論理/物理リソース定義 – 15 検出されたリソースを選択し、モデル化される対象を確認の上、モデル化を実行する © 2015 IBM Corporation IBM Confidential サービスの論理/物理リソース定義 – 16 以下の論理/物理リソースが生成される • 論理リソース(論理ビュー) – MQTT接続 – オペレーション(宛先トピック名と同名) • 物理リソース(物理ビュー) – MQTTブローカー © 2015 IBM Corporation IBM Confidential レコーディング 直接サブスクライブによる記録 – RITのMQTTサポートでは、使用される MQ TTブローカーに接続し、そのブローカーから伝達 されるトピックに直接サブスクライブすることにより、MQTTトラフィックを記録できる。 • HTTP/TCPプロキシーを介在せず、RITが直接サブスクライバーとしてMQTTブローカー へ接続してメッセージを取得している • RITはクライアント/アプリケーションを特に区別せず、指定したトピックにパブリッシ ュされた全てのメッセージを記録する • プロキシー方式による記録はサポートされていない デバイス (クライアント) 記録 17 アプリケーション (サービス) MQTTブローカー © 2015 IBM Corporation RIT IBM Confidential レコーディング – 18 パブリッシュされたメッセージがイベント・ビューに記録される © 2015 IBM Corporation IBM Confidential レコーディング – 記録されるMQTTヘッダーおよびメッセージ本文は以下の通り • ヘッダーの値はRITがMQTTブローカーから受信する際のメッセージのヘッダー値が入るた め、QoSヘッダーの値などは常に0になる(デバイス→ブローカーのメッセージにおけるヘ ッダーは記録できない) ヘッダー メッセージ本文 19 © 2015 IBM Corporation IBM Confidential レコーディング – 20 宛先トピックによるフィルタリングが可能。またトピック名のワイルドカード指定(#,+)も できる © 2015 IBM Corporation IBM Confidential (参考)MQTTのQoS機能 クライアントの不安定な稼働環境を想定し、クライアント⇔サー バー間のメッセージ送達保証レベルを3段階で指定可能 – – – 21 QoS = 0 :メッセージは1回のみ送信される(送信先に届くかは保証しない) QoS = 1 :メッセージは最低1回は送信先に送られる(重複の可能性あり) QoS = 2 :メッセージは必ず正確に1回送信先に送られる © 2015 IBM Corporation IBM Confidential テストの作成および実行 テスト実行によるパブリッシュ – MQTTにおけるテストでは、RIT上に作成したテストからMQTTブローカーに対してテスト・メ ッセージをパブリッシュすることにより、当該メッセージ(トピック)をサブスクライブして いるアプリケーションを検証することができる デバイス (クライアント) MQTTブローカー RIT テスト 22 アプリケーション (サービス) パブリッシュ © 2015 IBM Corporation IBM Confidential テストの作成および実行 テストの作成 – – 通常通り作成すると、パブリッシュ・アクションが追加されたテストが作成される パブリッシュ・アクションのプロパティ画面でMQTTヘッダーやメッセージの設定を実施 • メッセージ本文はバイト配列のため、文字列を設定する場合はスキーマ「バイト」をメッ セージのdata要素に適用すればよい(記録から作成する場合は適用済みのため不要) スキーマ・セレクター 23 © 2015 IBM Corporation IBM Confidential テストの作成および実行 テストの実行 – – 24 テストに設定されたメッセージがMQTTブローカーにパブリッシュされる アクションを追加することにより、特定トピックのサブスクライブ等を行うことも可能 © 2015 IBM Corporation IBM Confidential スタブの作成および実行 直接モードでのスタブ実行 デバイス (クライアント) アプリケーション (サービス) MQTTブローカー RIT スタブ サブスクライブ プロキシーモードでのスタブ実行 デバイス (クライアント) プロキシー MQTTブローカー ルーティング 25 © 2015 IBM Corporation アプリケーション (サービス) RIT スタブ IBM Confidential スタブの作成および実行 スタブの作成 – – 26 通常通り作成すると、パブリッシュされたメッセージを受信するのみのスタブが作成される アクティビティーにログやパブリッシュ等のアクションを追加してスタブを構成する © 2015 IBM Corporation IBM Confidential スタブの作成および実行 スタブの実行(直接モード) – – 27 MQTTブローカーに対してサブスクライバーとして稼動するスタブを実行する 直接モードの場合、パススルー(パススルー・アクションのデフォルト)がサポートされない ため、アクションを破棄に変更する。(パススルーのままだと以下のように実行時にコンパイ ル・エラーが発生する) © 2015 IBM Corporation IBM Confidential スタブの作成および実行 スタブの実行(プロキシーモード) – – 28 MQTTブローカー自体のスタブとして稼動するスタブを実行する 物理MQTTブローカーを開き、「スタブ」タブでスタブ・モードを以下のように変更する。その 上でスタブを実行するとルーティング規則が設定されスタブが起動する © 2015 IBM Corporation IBM Confidential スタブの作成および実行 – プロキシーからMQTTブローカーに接続できない状況でスタブを起動した場合、クライアント に対してエラーが返され、スタブが利用できない • MQTTクライアントからプロキシーに接続要求する際、プロキシーからMQTTブローカー に対しても接続要求が必ず行われるためである クライアントにおけるエラー出力 Connecting to tcp://localhost:1883 with client ID mqtt_client_sample reason 32109 msg 接続喪失 loc 接続喪失 cause java.io.EOFException excep 接続喪失 (32109) - java.io.EOFException 接続喪失 (32109) - java.io.EOFException at org.eclipse.paho.client.mqttv3.internal.CommsReceiver.run(CommsReceiv er.java:142) at java.lang.Thread.run(Thread.java:795) Caused by: java.io.EOFException at java.io.DataInputStream.readByte(DataInputStream.java:279) at org.eclipse.paho.client.mqttv3.internal.wire.MqttInputStream.readMqtt WireMessage(MqttInputStream.java:56) at org.eclipse.paho.client.mqttv3.internal.CommsReceiver.run(CommsReceiv er.java:103) ... 1 more 29 © 2015 IBM Corporation IBM Confidential スタブの作成および実行 – – 30 パススルー・アクションを破棄に設定しておくことで、スタブのロジックを実行した後、 MQTTブローカーにメッセージを送信せずに処理が終了する。アクションをパススルーにする とスタブのロジックを実行した上でメッセージをMQTTブローカーへ転送する いずれの場合もMQTTクライアント側でのパブリッシュ処理が終了せずハング • MQTT.jsを使用したJavaScriptクライアントでアクセスすると正常に動作するため、おそ らくPahoライブラリ(Java)の問題であると考えられる © 2015 IBM Corporation IBM Confidential ポート・フォワード・プロキシー設定 – 物理MQTTブローカーのポート・フォワード・プロキシーを設定すると、RITからポート・フォ ワード・プロキシー経由でブローカーに接続する • KCにはHTTP/TCPプロキシーを指定すると記載されているが、このプロキシーは HTTP/TCPプロキシーである必要はない(TCPポート・フォワードが可能であればOK) • FW越しにRIT-MQTTブローカー接続する場合などに使用すると考えられる デバイス (クライアント) MQTTブローカー アプリケーション (サービス) Port Forward プロキシー RIT 31 © 2015 IBM Corporation IBM Confidential ポート・フォワード・プロキシー設定 – 物理MQTTブローカーのポート・フォワード・プロキシーを設定すると、プロキシーモードの スタブにおけるルーティング規則が構成されず、スタブへのルーティングが行われない • 記録、テスト、直接モードのスタブはプロキシー経由でブローカーに接続して正常に動作 する • 一旦設定すると設定を外しても該当のMQTTブローカーではプロキシーモードのスタブが 動作しない(MQTTブローカーの再作成が必要) デバイス (クライアント) プロキシー MQTTブローカー アプリケーション (サービス) Port Forward プロキシー ルーティング 32 © 2015 IBM Corporation RIT スタブ IBM Confidential ポート・フォワード・プロキシー設定 – 前頁の状態で該当のスタブをRTCPへパブリッシュし、RTVS上で起動したところ、ルーティン グ規則が正常に設定され、スタブが稼動した • RIT側のスタブ用ルーティング生成部分の問題だと考えられる デバイス (クライアント) プロキシー MQTTブローカー アプリケーション (サービス) Port Forward プロキシー RIT パブリッシュ ルーティング 33 © 2015 IBM Corporation RTVS スタブ IBM Confidential