Google BigQueryへのデータ連携

1 はじめに

このページでは、ウェビオのデータをデータ連携機能を用いて、Google Cloud Platform(GCP)上のBigQueryに転送します。

BigQueryに転送することで、GCP上でウェビオのデータを分析・利用することができるほか、Data Portalでリアルタイムにデータを可視化することが可能になります(参考: Data Portalを用いた可視化)。

2 仕組み

データ連携機能から直接BigQueryにデータを取り入れることはできないため、Google Cloud Functionsを利用します。 ウェビオコンソールからCloud Functionsへのデータ連携を設定することで、BigQueryにデータを転送します。

システム図

3 注意点

GCPは有料サービスのため、使用料によっては支払いが発生する場合があります。

下記の設定で、1分間に75データをBigQueryに転送した場合、月500円程度で利用することができます。 (弊社の試算によるもので、正確な料金については保証いたしかねます)

4 事前準備

  • GCPのセットアップ
    • GCPを初めてご利用になる場合、初期設定が必要です
  • 転送するセンサデータの選定
    • こちらの書式凡例を参照のうえ、必要なデータ項目を選んでください
    • 必要なデータ項目のみ保存することで、GCPの支払額を抑えられる場合があります

5 実装

5.1 BigQuery の準備

まずはBigQueryで、データを保存しておくためのテーブルを作成します。 GCPのメニューからBigQueryを開きます。

ページ内に表示されているプロジェクト(例: webiot-bigquery)をクリックし、「データセットを作成」を選択してください。 「データセットID(例: dataset_01)」を入力して、データセットを作成してください。

さらに、作成したデータセットをクリックし、「テーブルを作成」を選択してください。 「テーブル名(例: table_01)」を入力して、テーブルを作成してください。

ここまででこのような構成になります。 BigQueryテーブル構成

続いて、テーブルのスキーマ(カラム)の設定を行います。

作成したテーブル(例: table_01)をクリックし、「スキーマを編集」を選択してください。 「フィールドを追加」をクリックし、4 事前準備で選定したデータ項目を記入します。

「テキストとして編集」をオンにして以下のテキストをコピー&ペーストし、「テキストとして編集」をオフにすることで、すべての項目が入力されます。 必要に応じて不要な項目を右端の×で消去してください。

webiot_id:STRING,webiot_name:STRING,gateway_id:STRING,gateway_name:STRING,unixtime:INTEGER,datatype:STRING,value:FLOAT,unit:STRING,value01:FLOAT,value02:FLOAT,value03:FLOAT,data_id:STRING,packet_id:INTEGER,rssi:FLOAT,battery:FLOAT

スキーマ設定

必要な項目を追加し終えたら、「保存」を押してください。

5.2 Cloud Functions の準備

続いて、BigQueryにデータを挿入するCloud Functionsを作成します。

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

まずは、BigQueryへの書き込み権限のあるユーザ(サービスアカウント)を作成します。 GCPのメニューから「IAMと管理」の中にあるサービスアカウントを開きます。

「サービスアカウントを作成」を選択します。

1. サービスアカウントの詳細では、サービスアカウント名(例: webiot-bigquery-dataowner)を入力して、「作成」を選択します。

Service Account設定1

2. このサービスアカウントにプロジェクトへのアクセスを許可するでは、「BigQueryデータオーナー」の権限を追加して、「続行」を選択します。

Service Account設定1

3. ユーザーにこのサービス アカウントへのアクセスを許可では、必要に応じて設定を追加してください。このチュートリアルでは設定する必要はありません。

「完了」を選択して設定を終了してください。

5.2.2 Cloud Functions を作成する

続いて、Cloud Functionsを作成します。 GCPのメニューからCloud Functionsを開きます。

「関数の作成」を選択します。

ここで設定することは4つあります。

  • 関数名に区別しやすい名前を入力(例: webiot-bigquery-function)
  • トリガーがHTTPであることを確認し、「未認可の呼び出しを許可」にチェック
  • メモリは128MiBで十分です
  • 「ランタイムサービスアカウント」を先ほど作成したサービスアカウントに設定

設定ができたら、トリガーを保存して「次へ」を選択します。

Cloud Functionsの設定

次に、実行するコードの設定をします。

まず、ランタイムがNodeであることを確認します。 バージョンはどれでもかまいませんが、2021年現在では12を利用するのが一番安定しています。

次に、エントリポイントをwebiotとしてください。

続いて、index.jsに次のコードをコピー&ペーストします。 3,4行目のデータセット名とテーブル名を、5.1 BigQuery の準備で作成したものに書き換えてください。

(注) req.body.keyはセキュリティのために追加しています。別の文字列に変更する場合は、5.3 Webiot データ連携の設定のBODYのkeyが同じ文字列になるようにしてください。

const {BigQuery} = require('@google-cloud/bigquery');
const bigquery = new BigQuery();
const dataset = bigquery.dataset('dataset_01');   // 作成したデータセットの名前に変更してください
const table = dataset.table('table_01');          // 作成したテーブルの名前に変更してください

exports.webiot = (req, res) => {
  // APIキーが一致しているかチェック
  if(req.body.key !== 'sxPSpsUpd2xuiaHTWH8x') {
    res.status(403).json({ msg: 'Wrong key' });
    return;
  }

  // 空白文字列""は挿入できない場合があるので、nullに置き換える
  const row = req.body.data;
  Object.keys(row).forEach(key => {
    if(row[key] == "") {
      row[key] = null;
    }
  });

  // BigQueryにデータを追加
  table.insert(row, (error, apiRes) => {
    if (error) {  // データ追加時にエラーが発生した場合
      const body = { msg: 'bigquery-api-error', code: error.code, errors: JSON.stringify(error.errors), row: JSON.stringify(row) };
      console.error(body);
      res.status(error.code).json(body);
      return;
    }

    // データ追加に成功した場合
    res.status(200).json({ row: row, apiRes: apiRes });
  })
};

さらに、package.jsonには次のコードをコピー&ペーストします。

{
  "name": "webiot-bigquery",
  "version": "0.0.1",
  "dependencies": {
    "@google-cloud/bigquery": "^5.5.0"
  }
}

Cloud Functionsの設定

「デプロイ」を選択します。 数分待つとビルドが完了して利用できるようになります。

関数の詳細を開き、「トリガー」タブに表示されている「トリガーURL」を確認します。 このURLはデータ連携時に使用するので、コピーしておいてください。

Cloud Functions URL

5.3 Webiot データ連携の設定

最後にウェビオコンソールでデータ連携の設定をし、Cloud Functionsにセンサデータを転送します。 ウェビオコンソールのデータ連携ページを開きます。

「ルール追加」のボタンを押し、HTTP POSTを選択します。

次は、Big Queryにデータを送信したいセンサを選択します。チームを選択するとセンサーが表示されるので、必要なデータタイプを選択してください。

続いての画面の「送信先URL」には、Cloud Functionsの「トリガーURL」をペーストします。 「BODY」には以下の内容をコピー&ペーストし、4 事前準備で選定したデータ項目以外を消去してください。

5.2.2 Cloud Functions を作成するでkeyを変更した場合は、keyの値を書き換えてください。

{
  "key": "sxPSpsUpd2xuiaHTWH8x",
  "data": {
    "webiot_id": "{{id}}",
    "webiot_name": "{{name}}",
    "gateway_id": "{{gatewayid}}",
    "gateway_name": "{{gatewayname}}",
    "unixtime": "{{unixtime}}",
    "datatype": "{{datatype}}",
    "value": "{{value}}",
    "unit": "{{unit}}",
    "value01": "{{value01}}",
    "value02": "{{value02}}",
    "value03": "{{value03}}",
    "data_id": "{{dataid}}",
    "packet_id": "{{packetid}}",
    "rssi": "{{rssi}}",
    "battery": "{{battery}}"
  }
}

最後に「設定する」を選択します。

5.4 BigQuery でデータを確認

BigQueryを開きます。

データを追加するテーブルのプレビューからデータが追加されていることが確認できたら設定は完了です。

データチェック

5.5 うまく動作しない場合は

センサには新しいデータが来ているのに、BigQueryにデータが転送されていない場合、エラーが起きている可能性があります。

ウェビオコンソールのデータ連携ページの「ログ」や、Cloud Functionsの詳細ページの「ログ」のタブで、エラーの内容を確認することができます。

ウェビオコンソールからログを確認した場合、下のような画面が表示されます。 エラーが発生したものはコードの部分が赤色になるので、「詳細」ボタンをクリックしてエラーを確認してください。

ウェビオコンソールのデータ連携ログ画面

6 最後に

今回は、データ連携機能を用いてウェビオのデータをBigQueryに転送しました。 BigQueryにリアルタイムにデータを転送することで、Google Cloud Platform上でウェビオのデータを分析・利用できるようになります。

BigQueryに保存したデータをData Portalでグラフにする記事も公開しています。 もしご興味がありましたらご覧ください。

お問い合わせ

ご不明な点がございましたら、お気軽にお問い合わせ下さい。
ピクスー株式会社

  • 所在地: 〒150-0002 東京都渋谷区渋谷1-20-9 co-factory渋谷402 ピクスー株式会社
  • メール: info@webiot.io
  • 電話番号: 090-9863-0987(担当:塩澤)