目次
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 は以下です。サービスをあまり知らない方は、軽く読んでください。また最後に記載している「参考サイト」にも充実したリンクをまとめておきます。
- mockmock: https://mock-mock.com/ja/
- Cloud IoT Core: https://cloud.google.com/iot-core/
3. mockmock を使いながら Cloud IoT Core を知ろう
Cloud IoT Core を文章で説明すると増長となるので以下を抑えていけば十分です。しかし、文章だけでは漠然としているので mockmock を使うことで「Cloud IoT Core ってこういうものなんだ」と理解できると思われます。
- 公開暗号鍵方式を採用
秘密鍵と公開鍵を自分で生成し、Cloud IoT Core に公開鍵を登録、IoT デバイス / SORACOM プラットフォーム / mockmock に秘密鍵を登録し、GCP で IoT デバイスの管理できます。 - MQTT と HTTP プロトコルに対応
Cloud IoT Core が誕生した経緯は GCP サービスの1つである Pub/Sub が HTTP のみ対応だったため、Google 社内で「MQTT のフルマネージドサービスを作ってほしい」との要望があり、MQTT で有名な RabbitMQ をベースとし開発されました。MQTT は 1999 年から開発された歴史ある IoT / M2M 向けの軽量なプロトコルです。 - Google 版 PKI 認証局(X.509 証明書)の利用が可能
Google が公開しているルート公開鍵を用いて署名を生成し、データに付与して Cloud IoT Core に送信できます。Google が認証局となり、非公開の暗号鍵で署名が正しいことを確認します。 - JSON Web Token(JWT)に対応
JWT は電子署名付きの URL-safe を JSON 形式で表現し、JSON の改ざんチェックが可能です。有効期限も付与できるため、よりセキュアな認証が利用可能です。 - 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つの設定箇所
- プロジェクト
- mockグループ
- データテンプレート
は完成しました。名称はすべて「Cloud IoT Core」に統一し作成します。後は、仮想 IoT デバイスである「mock」を以下の手順で作成します。
- mock ステータスを作成
- mock を作成する
- テスト送信する
- 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. 参考サイト
- mockmock 公式サイト
- Cloud IoT Core 公式サイト
- SORACOM Funnel の Cloud Pub/Sub アダプターを使用してGoogle Cloud Platformにデータを送信する (SORACOM 開発者向けサイト)
- 新機能:SORACOM が Google Cloud Platform と連携出来るようになりました! (SORACOM 公式ブログ)
- 『 1 行でわかる Google Cloud Platform』公開 (GCP Japan ブログ)
- SORACOMのサービス内容を整理する(2018年4月) (Qiita)
9. まとめ
mockmock を使うことで Cloud IoT Core を手軽に使える手段が SORACOM に加えて1つ増えました。GCP が提供する様々なサービスと上手く組み合わせることで、地球規模の IoT サービスを提供できるかもしれません。
本記事を読んでいただいた方がアイデアを思いつき、世界を驚かせるクールなサービスを提供するキッカケになれば幸いです。
弊社では GCP のコンサルティングから導入・運用支援サービスを提供しておりますので、ご興味のある方はお問い合わせください。また、インフラエンジニアだけでなく、あらゆる職種で仲間も募集しています。Google Cloud Platform に関わる仕事をしてみたい方、ぜひ一緒にクラウドエースで働きませんか!
ご応募、お待ちしています。