mockmock(仮想 IoT デバイス作成サービス)で Cloud IoT Core を使ってみる

1. GCP の IoT サービス「Cloud IoT Core」に入門しよう

 GCP には Cloud IoT Core という IoT サービスがあり、2018年2月21日に GA(General Availability)となりました。Cloud IoT Core は SORACOM(IoT プラットフォーム)と親和性が高いサービスで、具体的には SORACOM Beam や Funnel を使って IoT デバイスからデータをセキュアに GCP へ送信することができます。
 ただし、今まで Cloud IoT Core を使うためには Raspberry Pi , Arduino , Wio LTE など IoT デバイスが必要だったのですが、mockmock というサービスを使うことで手軽に Cloud IoT Core 始めことができます。非 IoT エンジニアが Cloud IoT Core を触るには最適な組み合わせです。

2. mockmock とは

 株式会社 Fusic さんが提供している仮想 IoT デバイス作成サービス「 mockmock」はクラウド上に仮想デバイスを作成し、開発中のサーバーに疑似データをお届けするサービスです。実デバイスを使わずにサーバーアプリケーションの開発を進められるため、今までにないスマートな IoT 開発が実現します。また、mockmock は Cloud IoT Core に対応しています。
 なお、仮想 IoT デバイス 1台までは1年間無料でクレジットカード登録も不要です。2台以上または2年目以降も使い続ける場合は有料となります。On Demand タイプですと、1時間28円(税込)で仮想 IoT デバイスが10台利用できます。
 各サービスの公式 URL は以下です。サービスをあまり知らない方は、軽く読んでください。また最後に記載している「参考サイト」にも充実したリンクをまとめておきます。

3. mockmock を使いながら Cloud IoT Core を知ろう

 Cloud IoT Core を文章で説明すると増長となるので以下を抑えていけば十分です。しかし、文章だけでは漠然としているので mockmock を使うことで「Cloud IoT Core ってこういうものなんだ」と理解できると思われます。

  1. 公開暗号鍵方式を採用
     秘密鍵と公開鍵を自分で生成し、Cloud IoT Core に公開鍵を登録、IoT デバイス / SORACOM プラットフォーム / mockmock に秘密鍵を登録し、GCP で IoT デバイスの管理できます。
  2. MQTT と HTTP プロトコルに対応
     Cloud IoT Core が誕生した経緯は GCP サービスの1つである Pub/Sub が HTTP のみ対応だったため、Google 社内で「MQTT のフルマネージドサービスを作ってほしい」との要望があり、MQTT で有名な RabbitMQ をベースとし開発されました。MQTT は 1999 年から開発された歴史ある IoT / M2M 向けの軽量なプロトコルです。
  3. Google 版 PKI 認証局(X.509 証明書)の利用が可能
     Google が公開しているルート公開鍵を用いて署名を生成し、データに付与して Cloud IoT Core に送信できます。Google が認証局となり、非公開の暗号鍵で署名が正しいことを確認します。
  4. JSON Web Token(JWT)に対応
     JWT は電子署名付きの URL-safe を JSON 形式で表現し、JSON の改ざんチェックが可能です。有効期限も付与できるため、よりセキュアな認証が利用可能です。
  5. Cloud IoT Core から IoT デバイスへ送信可能
     通常、IoT デバイスから Cloud へデータを送信することが一般的ですが、遠隔地にある IoT デバイスをリモート制御したり、ファームウェア、プログラムファイルの更新が可能です。つまり、双方向通信が可能となります。

4. mockmock と GCP の構成図

 mockmock と Cloud IoT Core の間は MQTTS による暗号化通信で行われ、GCP の Pub/Sub にデータが届きます。受け取ったデータは、データの整形加工処理(例えば Dataflow / Functions)に送られ、データの蓄積(BigQuery / GCS)や機械学習(ML)による分析が可能となります。本記事は上表の記載された部分を詳しく説明します。

5. Cloud IoT Core と Pub/Sub の設定

 上図(mockmock と GCP の構成図)のとおり、Cloud IoT Core で受け取ったデータを、メッセージングキューサービスである Pub/Sub に送信できるように環境構築します。これで正しくデータを送信されているかどうかを確認しましょう。

5.1 Pub/Sub の設定

 Cloud IoT Core の設定には、Pub/Sub のトピックを選択する必要があるので、トピックを作り、サブスクリプションも作成しましょう。
 「トピックの作成」をクリックし、トピック名を任意で入力します。(下図参照)

 トピック名はわかりやすく「iot-core」としました。次にサブスクリプションを作成しましょう。今回、新規作成したトピックには、サブスクリプションは 0 となっているので「新しい登録」をクリックします。(下図参照)

 サブスクリプション名は、トピック名と同じく「iot-core」としました。配信タイプが pull と push の2つから選択可能ですが、pull のままとします。(下図参照)

  Pub/Sub の設定はこれで終わりです。

5.2 Cloud IoT Core の設定

 GCP コンソール画面の左ペインにある「IoT Core」をクリックし、画面中央の「端末レジストリを作成」をクリックしましょう。(下図参照)

 入力項目を下表に示します。

項目 入力値 補足
レジストリ ID device-1 任意
リージョン asia-east1 3 リージョンから選択可能
プロトコル MQTT HTTP は今回使わないのでチェックを外す
Cloud Pub/Sub トピック project/ {プロジェクト名} /topics/iot-core プルダウンで選択
デバイス状態のトピック なし 省略可
CA 認証書 なし JWT 活用時に入力する項目
後で追加することも可能

 これで、Cloud IoT Core の初期設定は完了しました。多くの端末(IoT デバイス)を追加できます。(下図参照)

5.3 サービスアカウントの作成

 最後に mockmock で必要とする GCP のサービスアカウントを IAM で作成し、JSON 形式でダウンロードしましょう。GCP コンソール画面に左ペインより「IAM と管理」をクリック、「サービスアカウント」をクリックすると下図が表示されます。

 入力項目を下表に示します。

項目 入力値 補足
サービス アカウント名 Cloud IoT Core 任意
サービス アカウント ID cloud-iot-core サービスアカウント名を
入力すると自動生成される
Project role(役割) Cloud IoT プロビジョナー Cloud IoT Core のレジストリに
デバイスの追加 / 削除の権限
(最小権限を付与)
新しい秘密鍵の提供
(キータイプ)
JSON  

 「保存」ボタンをクリックすると、サービス アカウントとキーが格納された JSON ファイルをダウンロードします。

6. mockmock の設定

 mockmock で新規アカウントを作成します。メールアドレスがあれば十分です。ログイン後の画面が以下となっているはずです。

6.1 プロジェクト作成

 プロジェクトを新規作成してみましょう。入力項目を下表に示します。

項目 入力値 補足
プロジェクト名 Cloud IoT Core 任意
キャパシティ cn1 デフォルト値
サーバタイプ [GCP] Cloud IoT Core  
プロトコル MQTTS サーバタイプを変更すると HTTP から MQTTS に変更
GCP リージョン asia-east1 3 リージョンから選択可能
GCP レジストリ ID device-1 Cloud IoT Core 設定情報
GCP 認証キー(*.json) ダウンロードしたJSON ファイルを選択 GCPで作成したサービス アカウントとキー

 入力後に「登録」ボタンをクリックするとプロジェクトが作成されます。(上図参照)
 特筆すべきところは、矢印の「デバイスの公開鍵をダウンロード」できるところです。mockmock 側で、仮想デバイスの暗号鍵と公開鍵を生成し、公開鍵(.pem)は GCP の Cloud IoT Core の端末設定時に利用することができます。通常、Linux OS 上で、以下のコマンド(openssl)で秘密鍵と公開鍵を生成する必要がありますが、mockmock はこの部分を簡略化してくれています。

コード
openssl req -x509 -newkey rsa:2048 -keyout rsa_private.pem -nodes -out rsa_cert.pem -subj "/CN=unused"

6.2 mock グループ新規作成

 mock グループは、同じ動作をする mock をグループとして扱うものです。 実際の IoT システムでは、デバイスの型やバージョンの違いによって、データのフォーマットが異なったり、 データ送信先や送信間隔が異なったりすることがあります。そのような場合に mock グループを分けて設定してください。入力項目を下表に示します。

項目 入力値 補足
mockグループ名 Cloud IoT Core 任意
最大接続時間 [sec] (空欄) mock の最大稼働時間。
空欄の場合は、停止操作を行うまで
稼働し続ける。
mock 定数のフィールド なし mock には、個別に割り振られた定数値を
設定することができます。
デバイスのシリアル番号などに
使用できます。

 上図のとおり mockグループの作成が終わりました。mock 管理などの設定を行う前に、データテンプレートを先に作成しましょう。

6.3 データテンプレート新規作成

 データテンプレートは、mock から送信する json のフォーマットと、それぞれのキーに対する値の生成方法を定義します。 また、HTTP(S) での通信を行う場合は、リクエストヘッダを定義することもできます。入力項目を下表に示します。

項目 入力値 補足
テンプレート名 Cloud IoT Core 任意
作成方法 新しく作成する ・新しく作成する
・コピーして作成する
・実際に送信されるjson データの
サンプルを元に作成する
以上の3種類から選択

 上図のとおり、mockmock の3つの設定箇所

  1. プロジェクト
  2. mockグループ
  3. データテンプレート

 は完成しました。名称はすべて「Cloud IoT Core」に統一し作成します。後は、仮想 IoT デバイスである「mock」を以下の手順で作成します。

  1. mock ステータスを作成
  2. mock を作成する
  3. テスト送信する
  4. mock 起動する(Cloud IoT Core、Pub/Sub にデータを送信開始)

6.4 mock ステータスの作成

 mock グループに mock ステータスを作成します。文字通り、mock の状態を表すところです。「mock ステータス作成」ボタンをクリックしましょう。
 入力項目を下表に示します。

項目 入力値 補足
状態名 Cloud IoT Core 任意
初期状態 チェック mock 起動時に各ステータスから
開始される
Topic   event / state のいずれか
QoS 1 メッセージ到達保証性
0:最高1回
1:最低1回
2:正確に1回
Retain 無効 ブローカーへの最終メッセージを
保持するか否か
最小データ送信間隔 [sec] 10  
最大データ送信間隔 [sec] 10  
データテンプレート Cloud IoT Core 選択済み

「登録」ボタンをクリックすると、mock ステータスが下図のように作成されました。

6.5 mock を作成

 「mock 管理」タブをクリックして、mock の管理画面に移動し、「mock 作成」ボタンをクリックし、Cloud IoT Core の デバイス ID を入力する必要があります。ただし、本記事の Cloud IoT Core の設定時にデバイスを作成していません。
 実は、サービスアカウント(役割:Cloud IoT プロビジョナー)を mokmock に付与したのは、mock の ID で Cloud IoT Core にデバイス登録できるからです。
 したがって、今回は空欄のままで登録ボタンをクリックします。

6.6 テスト送信

 「mock ステータス」タブをクリックして、「Cloud IoT Core(初期状態)」をクリックします。下図の矢印です。

 画面を少しスクロールさせると、「テスト送信」の項目があり「送信」ボタンをクリックしましょう。

 下表のようにテスト結果が表示されます。

 成否が true になっているのでテストがクリアになっています。
 他の項目を見ると Cloud IoT Core を理解する上で非常に参考になる情報となります。

 ホスト :mqtt.googleapis.com (Cloud IoT Core のホスト名)
 トピック :/devices/mk-cd62be147e9c/events
 プロトコル :MQTTS
 ポート :8883

6.7 mock 起動する

 mockmock での最後の操作です。「mock 管理」タブをクリックし、「mock 一覧」に表示されている 1台の仮想 IoT デバイスを起動しましょう。

 ID :mk-cd62be147e9c
 稼働ステータス :稼働中
 ステータス更新日時 :2018/07/03 08:44:59UTC

 これで mockmock と GCP (Cloud IoT Core、Pub/Sub)が接続されましたので、まずは、Cloud IoT Core の端末がどのような設定になっているのか、GCP コンソール画面で確認してみましょう。

 Cloud IoT Core 設定時は端末は空白でしたが、1端末が追加され、RSA256 の公開鍵(有効期限:無限)が登録済みです。これは mockmock 側で端末を生成してくれたことを意味します。

6.8 送信したデータを確認

 GCP コンソールの右側にある「Google Cloud Shell を有効化」を行い、ブラウザ下段に Cloud Shell を表示させましょう。

 次に、Pub/Sub のサブスクリプションを pull 形式で読み込んでみましょう。Cloud Shell 上でのコマンドは以下です。

コード
$ gcloud beta pubsub subscriptions pull --auto-ack projects/iota01-177621/subscriptions/iot-core

ポイント1: projects/ [プロジェクト ID]
ポイント2:/subscriptions/ [Pub/Sub で登録したサブスクリプション名]

実行結果

DATA :ペイロード(mockmock で出力するペイロードを柔軟に変更可能)
MESSAGE_ID:Pub/Sub が付与するメッセージID(上述の gcloud を再実行で ID が変更)
ATTRIBUTES :属性(デバイス情報、GCP のプロジェクト ID など)

 これで mockmock を使った Cloud IoT Core → Pub/Sub までデータ通信を行うことができました。本記事を参考に実際に試してみると非常に簡単です。

6.9 mock を停止

 mockmock のコンソール画面を開き、「mock 管理」から mock の操作で「停止」ボタンをクリックしましょう。これだけで仮想 IoT デバイスを停止することができます。

7. Cloud IoT Core で抑えておきたいポイント

 Cloud IoT Core を使う上で理解しておくこと、GCP 以外のサービスと組み合わせることで、より Cloud IoT Core のポテンシャルを高められることを整理してみました。

ポイント

  • 暗号鍵はデバイスに格納、公開鍵は Cloud IoT Core に格納される。

ポイントを踏まえた構成

  • 製造施設内に IoT ゲートウェイを設置し、暗号鍵を格納する。
  • センサーから Wifi , Bluetooth , Beacon で IoT ゲートウェイを経由し、Cloud IoT Core に MQTTS で暗号化通信を行う
  • IoT ゲートウェイはサーバラックのように施錠し、暗号鍵の盗難を防ぐ。
  • IoT デバイスや IoT ゲートウェイに暗号鍵を組み込みたくない場合(特に屋外設置)SORACOM Platform を採用する。
  • SORACOM Platform に暗号鍵を格納し、かつ、耐ダンパー性が高い SIM を用いることで、よりセキュアなデータ通信が行える。
  • 屋外設置時は、GPS、キャリア基地局、WiFIi ルータのSSIDとMACアドレス(BSSID) から得られるローケーション情報もデータに付与させることで、IoT デバイスが想定外の移動を検知する仕組みも考慮する。

8. 参考サイト

9. まとめ

 mockmock を使うことで Cloud IoT Core を手軽に使える手段が SORACOM に加えて1つ増えました。GCP が提供する様々なサービスと上手く組み合わせることで、地球規模の IoT サービスを提供できるかもしれません。
 本記事を読んでいただいた方がアイデアを思いつき、世界を驚かせるクールなサービスを提供するキッカケになれば幸いです。
 
 弊社では GCP のコンサルティングから導入・運用支援サービスを提供しておりますので、ご興味のある方はお問い合わせください。また、インフラエンジニアだけでなく、あらゆる職種で仲間も募集しています。Google Cloud Platform に関わる仕事をしてみたい方、ぜひ一緒にクラウドエースで働きませんか!
ご応募、お待ちしています。
 

次の記事を読み込んでいます
次の記事を読み込んでいます
次の記事を読み込んでいます
次の記事を読み込んでいます
次の記事を読み込んでいます