1. 概要/はじめに
ウェブ、アプリケーション サーバー、データベースで構成される多層アプリケーションは、ウェブ開発の基盤であり、多くのウェブサイトの出発点となりますが、成功すると、スケーラビリティ、統合、アジリティに関する課題が生じることがよくあります。たとえば、データをリアルタイムで処理する方法や、複数の主要なビジネス システムにデータを配信する方法などです。このような問題とインターネット規模のアプリケーションの要件が、分散メッセージング システムの必要性を高め、データ パイプラインを使用して復元力のあるリアルタイム システムを実現するアーキテクチャ パターンを生み出しました。そのため、リアルタイム データを分散メッセージング システムにパブリッシュする方法と、データ パイプラインを構築する方法を理解することは、デベロッパーとアーキテクトの両方にとって重要なスキルです。
作業内容
この Codelab では、モノのインターネット(IoT)デバイスから始まり、メッセージ キューを使用してデータを受信して配信し、サーバーレス関数を利用してデータをデータ ウェアハウスに移動し、情報を表示するダッシュボードを作成する天気データ パイプラインを構築します。IoT デバイスには気象センサー付きの Raspberry Pi を使用し、Google Cloud Platform のいくつかのコンポーネントでデータ パイプラインを形成します。Raspberry Pi の構築は有益ですが、この Codelab のオプション部分であり、ストリーミング天気データはスクリプトに置き換えることができます。

この Codelab の手順を完了すると、温度、湿度、露点、気圧を表示するダッシュボードにデータを供給するストリーミング データ パイプラインが作成されます。

学習内容
- Google Pub/Sub の使用方法
- Google Cloud Functions の関数をデプロイする方法
- Google BigQuery を活用する方法
- Google データポータルを使用してダッシュボードを作成する方法
- また、IoT センサーを構築する場合は、Google Cloud SDK の活用方法と、Google Cloud Platform へのリモート アクセス呼び出しを保護する方法についても学習します。
必要なもの
- Google Cloud Platform アカウント。Google Cloud Platform の新規ユーザーは、$300 の無料トライアルをご利用いただけます。
サンプルデータとスクリプトを活用するのではなく、この Codelab の IoT センサー部分を構築する場合は、次のものも必要になります(完全なキットまたは個々のパーツとして注文できます)。
- Raspberry Pi Zero W(電源、SD メモリカード、ケース付き)
- USB カードリーダー
- USB ハブ(Raspberry Pi の唯一の USB ポートにキーボードとマウスを接続できるようにするため)
- メス - メス ブレッドボード ワイヤー
- GPIO ハンマー ヘッダー
- BME280 センサー
- はんだごてとハンダ
また、HDMI 入力対応のパソコン用モニターまたはテレビ、HDMI ケーブル、キーボード、マウスを使用できることも前提としています。
2. 設定方法
セルフペース型の環境設定
Google アカウント(Gmail または G Suite)をお持ちでない場合は、アカウントを作成する必要があります。Google アカウントをお持ちの方も、お持ちでない方も、ぜひ $300 分の無料トライアルをご利用ください。
Google Cloud Platform のコンソール(console.cloud.google.com)にログインします。このラボでは、デフォルトのプロジェクト(「My First Project」)を使用することも、新しいプロジェクトを作成することもできます。新しいプロジェクトを作成する場合は、[リソースの管理] ページを使用します。プロジェクト ID は、すべての Google Cloud プロジェクトを通じて一意の名前にする必要があります(以下の ID はすでに使用されているため使用できません)。後で必要になるため、プロジェクト ID(例: プロジェクト ID は _____ です)をメモしておきます。


この Codelab の操作をすべて行っても、費用は数ドル程度ですが、その他のリソースを使いたい場合や、実行したままにしておきたいステップがある場合は、追加コストがかかる可能性があります。Codelab の最後にある「クリーンアップ」セクションを必ずご確認ください。
3. BigQuery テーブルを作成する
BigQuery は、サーバーレスでスケーラビリティに優れ、低コストのエンタープライズ データ ウェアハウスです。IoT デバイスからストリーミングされるデータを保存するのに最適なオプションであり、分析ダッシュボードで情報をクエリすることもできます。
IoT 気象データをすべて保持するテーブルを作成しましょう。Cloud コンソールで BigQuery を選択します。BigQuery が新しいウィンドウで開きます(元のウィンドウは閉じないでください。後でアクセスする必要があります)。

プロジェクト名の横にある下矢印アイコンをクリックし、[新しいデータセットを作成] を選択します。

[データセット] に「weatherData」と入力し、保存場所を選択して [OK] をクリックします。

データセットの横にある [+] 記号をクリックして、新しいテーブルを作成します。

[ソースデータ] で [空のテーブルを作成] を選択します。[宛先テーブル名] に「weatherDataTable」と入力します。[スキーマ] で、[フィールドを追加] ボタンを合計 9 個のフィールドが表示されるまでクリックします。下の図のようにフィールドに入力します。各フィールドの適切なタイプも選択してください。すべて完了したら、[テーブルを作成] ボタンをクリックします。

次のような結果が表示されます。

これで、天気データを受信するデータ ウェアハウスが設定されました。
4. Pub/Sub トピックを作成する
Cloud Pub/Sub は、ストリーム分析とイベント駆動型コンピューティング システム向けの、シンプルで信頼性の高いスケーラブルな基盤として機能します。そのため、受信した IoT メッセージを処理し、ダウンストリーム システムで処理できるようにするのに最適です。
BigQuery のウィンドウが開いている場合は、Cloud コンソールに戻ります。Cloud Console を閉じた場合は、https://console.cloud.google.com に移動します。
Cloud コンソールで、[Pub/Sub]、[トピック] の順に選択します。

[API を有効にする] というプロンプトが表示されたら、[API を有効にする] ボタンをクリックします。

[トピックを作成] ボタンをクリックします。

トピック名として「weatherdata」と入力して [作成] をクリックします。

新しく作成されたトピックが表示されます。

これで、IoT メッセージをパブリッシュし、他のプロセスがそれらのメッセージにアクセスできるようにする Pub/Sub トピックが作成されました。
トピックへの安全なパブリッシュ
Google Cloud コンソール外のリソース(IoT センサーなど)から Pub/Sub トピックにメッセージをパブリッシュする場合は、サービス アカウントを使用してアクセスをより厳密に制御し、信頼証明書を作成して接続のセキュリティを確保する必要があります。
Cloud コンソールで、[IAM と管理]、[サービス アカウント] の順に選択します。

[サービス アカウントを作成] ボタンをクリックします。

[ロール] プルダウンで、Pub/Sub パブリッシャー ロールを選択します。

サービス アカウント名(iotWeatherPublisher)を入力し、[新しい秘密鍵の提供] チェックボックスをオンにして、[キーのタイプ] が [JSON] に設定されていることを確認し、[作成] をクリックします。

セキュリティ キーが自動的にダウンロードされます。キーは 1 つしかないため、紛失しないようにすることが重要です。[閉じる] をクリックします。

サービス アカウントが作成され、それに関連付けられたキー ID があることがわかります。

後で鍵に簡単にアクセスできるように、Google Cloud Storage に保存します。Cloud コンソールで、[ストレージ]、[ブラウザ] の順に選択します。

[バケットを作成] ボタンをクリックします。

ストレージ バケットの名前を選択します(Google Cloud 全体でグローバルに一意の名前である必要があります)。[作成] ボタンをクリックします。

自動的にダウンロードされたセキュリティ キーを見つけて、ストレージ バケットにドラッグ&ドロップするか、アップロードします。

鍵のアップロードが完了すると、Cloud Storage ブラウザに表示されます。

後で使用できるように、ストレージ バケット名とセキュリティ鍵ファイル名をメモしておきます。
5. Cloud Functions の関数を作成する
クラウド コンピューティングにより、完全なサーバーレス コンピューティング モデルを実現できるようになりました。このモデルでは、どこでイベントが発生しても、それに応答してオンデマンドでロジックを起動できます。このラボでは、天気トピックにメッセージが公開されるたびに Cloud Functions が起動し、メッセージを読み取って BigQuery に保存します。
Cloud Console で [Cloud Functions] を選択します。

API メッセージが表示されたら、[API を有効にする] ボタンをクリックします。

[関数の作成] ボタンをクリックします。

[名前] フィールドに「function-weatherPubSubToBQ」と入力します。[トリガー] で [Cloud Pub/Sub トピック] を選択し、[トピック] プルダウンで [weatherdata] を選択します。ソースコードにはインライン エディタを選択します。[index.js] タブで、次のコードを貼り付けて、元のコードを置き換えます。projectId、datasetId、tableId の定数を環境に合わせて変更してください。
/**
* Background Cloud Function to be triggered by PubSub.
*
* @param {object} event The Cloud Functions event.
* @param {function} callback The callback function.
*/
exports.subscribe = function (event, callback) {
const BigQuery = require('@google-cloud/bigquery');
const projectId = "myProject"; //Enter your project ID here
const datasetId = "myDataset"; //Enter your BigQuery dataset name here
const tableId = "myTable"; //Enter your BigQuery table name here -- make sure it is setup correctly
const PubSubMessage = event.data;
// Incoming data is in JSON format
const incomingData = PubSubMessage.data ? Buffer.from(PubSubMessage.data, 'base64').toString() : "{'sensorID':'na','timecollected':'1/1/1970 00:00:00','zipcode':'00000','latitude':'0.0','longitude':'0.0','temperature':'-273','humidity':'-1','dewpoint':'-273','pressure':'0'}";
const jsonData = JSON.parse(incomingData);
var rows = [jsonData];
console.log(`Uploading data: ${JSON.stringify(rows)}`);
// Instantiates a client
const bigquery = BigQuery({
projectId: projectId
});
// Inserts data into a table
bigquery
.dataset(datasetId)
.table(tableId)
.insert(rows)
.then((foundErrors) => {
rows.forEach((row) => console.log('Inserted: ', row));
if (foundErrors && foundErrors.insertErrors != undefined) {
foundErrors.forEach((err) => {
console.log('Error: ', err);
})
}
})
.catch((err) => {
console.error('ERROR:', err);
});
// [END bigquery_insert_stream]
callback();
};
[package.json] タブで、プレースホルダ コードの上に次のコードを貼り付けます。
{
"name": "function-weatherPubSubToBQ",
"version": "0.0.1",
"private": true,
"license": "Apache-2.0",
"author": "Google Inc.",
"dependencies": {
"@google-cloud/bigquery": "^0.9.6"
}
}
実行する関数が「HelloWorld」に設定されている場合は、「subscribe」に変更します。[作成] ボタンをクリックする

関数がデプロイされたことが表示されるまで、約 2 分かかります。

おめでとうございます!これで、Functions 経由で Pub/Sub が BigQuery に接続されました。
6. IoT ハードウェアをセットアップする(省略可)
Raspberry Pi とセンサーを組み立てる
ピンが 8 個以上ある場合は、ヘッダーを 7 個のピンのみにトリミングします。ヘッダーピンをセンサーボードにハンダ付けします。

Raspberry Pi にハンマー ヘッダーピンを慎重に取り付けます。

こちらの手順に沿って SD カードをフォーマットし、NOOBS(New Out Of Box Software)インストーラをインストールします。SD カードを Raspberry Pi に挿入し、Raspberry Pi をケースに入れます。

下の図に従って、ブレッドボードのワイヤーを使用してセンサーを Raspberry Pi に接続します。

Raspberry Pi のピン | センサーの接続 |
ピン 1(3.3V) | VIN |
ピン 3(CPIO2) | SDI |
ピン 5(GPIO3) | SCK |
ピン 9(グラウンド) | GND |

モニター(ミニ HDMI コネクタを使用)、キーボード/マウス(USB ハブを使用)、電源アダプターの順に接続します。
Raspberry Pi とセンサーを構成する
Raspberry Pi の起動が完了したら、目的のオペレーティング システムとして Raspbian を選択し、目的の言語が正しいことを確認してから、[Install](ウィンドウの左上にあるハードドライブ アイコン)をクリックします。

Wi-Fi アイコン(画面の右上)をクリックして、ネットワークを選択します。セキュリティ保護されたネットワークの場合は、パスワード(事前共有キー)を入力します。

ラズベリー アイコン(画面の左上)をクリックし、[Preferences]、[Raspberry Pi Configuration] の順に選択します。[インターフェース] タブで、I2C を有効にします。[ローカライズ] タブで、[言語 / 地域] と [タイムゾーン] を設定します。タイムゾーンを設定したら、Raspberry Pi を再起動します。

再起動が完了したら、ターミナル アイコンをクリックしてターミナル ウィンドウを開きます。

次のコマンドを入力して、センサーが正しく接続されていることを確認します。
sudo i2cdetect -y 1
結果は次のようになります。77 と表示されていることを確認してください。

Google Cloud SDK をインストールする
Google Cloud プラットフォームのツールを活用するには、Raspberry Pi に Google Cloud SDK をインストールする必要があります。この SDK には、Google Cloud Platform の管理と活用に必要なツールが含まれており、複数のプログラミング言語で使用できます。
Raspberry Pi でターミナル ウィンドウを開き(まだ開いていない場合)、SDK のバージョンを Raspberry Pi のオペレーティング システムと一致させる環境変数を設定します。
export CLOUD_SDK_REPO="cloud-sdk-$(lsb_release -c -s)"
次に、Google Cloud SDK パッケージが保存されている場所を追加します。これにより、SDK のインストールを求められたときに、インストール ツールが検索する場所を認識できるようになります。
echo "deb http://packages.cloud.google.com/apt $CLOUD_SDK_REPO main" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list
Google のパッケージ リポジトリから公開鍵を追加して、Raspberry Pi がインストール時にセキュリティを検証し、コンテンツを信頼するようにします。
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
Raspberry Pi のすべてのソフトウェアが最新であることを確認し、コア Google Cloud SDK をインストールします。
sudo apt-get update && sudo apt-get install google-cloud-sdk
「Do you want to continue?」というプロンプトが表示されたら、Enter キーを押します。
Python パッケージ マネージャーを使用して tendo パッケージをインストールします。このパッケージは、スクリプトが複数回実行されているかどうかを確認し、天気スクリプトのアプリケーション用にインストールされているかどうかを確認するために使用されます。
pip install tendo
Python パッケージ マネージャーを使用して、Python 用の Google Cloud PubSub パッケージと OAuth2 パッケージがインストールされ、最新の状態になっていることを確認します。
sudo pip install --upgrade google-cloud-pubsub
sudo pip install --upgrade oauth2client
Google Cloud SDK を初期化する
この SDK を使用すると、Google Cloud にリモートで認証されたアクセスが可能になります。この Codelab では、セキュリティ キーを Raspberry Pi に簡単にダウンロードできるように、ストレージ バケットへのアクセスに使用します。
Raspberry Pi のコマンドラインで、
gcloud init --console-only
「Would you like to log in (Y/n)?」と表示されたら、Enter キーを押します。
[ブラウザで次のリンクに移動してください] の後に https://accounts.google.com/o/oauth? で始まる長い URL が表示されたら、マウスで URL をポイントして右クリックし、[URL をコピー] を選択します。次に、ウェブブラウザ(画面左上にある青い地球のアイコン)を開き、アドレスバーを右クリックして [貼り付け] をクリックします。
ログイン画面が表示されたら、Google Cloud アカウントに関連付けられているメールアドレスを入力して Enter キーを押します。パスワードを入力して [次へ] ボタンをクリックします。
Google Cloud SDK が Google アカウントへのアクセスを求めているというメッセージが表示されます。[許可] ボタンをクリックします。
確認コードが表示されます。マウスでハイライト表示し、右クリックして [コピー] を選択します。ターミナル ウィンドウに戻り、カーソルが「Enter verification code:」の右側にあることを確認し、マウスで右クリックして [貼り付け] を選択します。Enter ボタンを押します。
「Pick cloud project to use:」と表示されたら、この Codelab で使用しているプロジェクト名に対応する番号を入力して、Enter キーを押します。
Compute API を有効にするよう求められたら、Enter ボタンを押して有効にします。その後、Google Compute Engine の設定を構成するよう求められます。Enter キーを押します。候補のリージョンとゾーンのリストが表示されます。その中から近くのリージョンとゾーンを選択し、対応する番号を入力して Enter キーを押します。
しばらくすると、追加情報が表示されます。これで、Google Cloud SDK が構成されました。ウェブブラウザ ウィンドウは今後使用しないため、閉じていただいて構いません。
センサー ソフトウェアと天気スクリプトをインストールする
Raspberry Pi のコマンドラインから、入力/出力ピンから情報を読み取るために必要なパッケージを複製します。
git clone https://github.com/adafruit/Adafruit_Python_GPIO
ダウンロードしたパッケージをインストールする
cd Adafruit_Python_GPIO
sudo python setup.py install
cd ..
天気センサーを有効にするプロジェクト コードのクローンを作成する
git clone https://github.com/googlecodelabs/iot-data-pipeline
センサー ドライバを、ダウンロードしたソフトウェアの残りの部分と同じディレクトリにコピーします。
cd iot-data-pipeline/third_party/Adafruit_BME280
mv Adafruit_BME280.py ../..
cd ../..
スクリプトを編集するには、次のように入力します。
nano checkWeather.py
プロジェクトをプロジェクト ID に、トピックを Pub/Sub トピックの名前に変更します(これらは、この Codelab の「設定」と「Pub/Sub トピックを作成する」セクションで説明しました)。
sensorID、sensorZipCode、sensorLat、sensorLong の値を任意の値に変更します。特定の場所や住所の緯度と経度の値については、こちらをご覧ください。
必要な変更が完了したら、Ctrl+X キーを押して nano エディタの終了を開始します。「Y」を押して確定します。
# constants - change to fit your project and location
SEND_INTERVAL = 10 #seconds
sensor = BME280(t_mode=BME280_OSAMPLE_8, p_mode=BME280_OSAMPLE_8, h_mode=BME280_OSAMPLE_8)
credentials = GoogleCredentials.get_application_default()
project="myProject" #change this to your Google Cloud project id
topic = "myTopic" #change this to your Google Cloud PubSub topic name
sensorID = "s-Googleplex"
sensorZipCode = "94043"
sensorLat = "37.421655"
sensorLong = "-122.085637"
セキュリティ キーをインストールする
セキュリティ キー([トピックへの安全なパブリッシュ] セクション)を Raspberry Pi にコピーします。
SFTP または SCP を使用して、ローカルマシンから Raspberry Pi(/home/pi ディレクトリ)にセキュリティ キーをコピーした場合は、次の手順をスキップして、パスのエクスポートに進みます。
セキュリティ キーをストレージ バケットに配置した場合は、ストレージ バケットの名前とファイルの名前を覚えておく必要があります。gsutil コマンドを使用してセキュリティ鍵をコピーします。このコマンドは Google Storage にアクセスできます(gsutil という名前が付けられている理由と、ファイルへのパスが gs:// で始まる理由)。次のコマンドは、バケット名とファイル名に変更してください。
gsutil cp gs://nameOfYourBucket/yourSecurityKeyFilename.json .
ファイルのコピー中であることを示すメッセージが表示され、その後、操作が完了したことを示すメッセージが表示されます。
Raspberry Pi のコマンドラインから、セキュリティ キーのパスをエクスポートします(ファイル名を適宜変更してください)。
export GOOGLE_APPLICATION_CREDENTIALS=/home/pi/iot-data-pipeline/yourSecurityKeyFilename.json
これで、Google Cloud にデータを送信する準備が整った IoT 天気センサーが完成しました。
7. データ パイプラインを開始する
Compute API を有効にする必要がある場合がある
Raspberry Pi からのデータ ストリーミング
Raspberry Pi IoT 気象センサーを構築した場合は、気象データを読み取って Google Cloud Pub/Sub に push するスクリプトを開始します。/home/pi/iot-data-pipeline ディレクトリにいない場合は、まずそこに移動します。
cd /home/pi/iot-data-pipeline
天気スクリプトを開始する
python checkWeather.py
ターミナル ウィンドウに、天気データの結果が毎分エコーバックされます。データが流れている場合は、次のセクション(データが流れていることを確認する)に進みます。
シミュレートされたデータ ストリーミング
IoT 天気センサーを構築していない場合は、Google Cloud Storage に保存されている一般公開データセットを使用してデータ ストリーミングをシミュレートし、既存の Pub/Sub トピックにデータをフィードできます。Google Dataflow と、Cloud Storage から読み取って Pub/Sub に公開するための Google 提供のテンプレートが使用されます。
このプロセスの一環として、Dataflow に一時ストレージの場所が必要になるため、この目的でストレージ バケットを作成しましょう。
Cloud コンソールで、[ストレージ]、[ブラウザ] の順に選択します。

[バケットを作成] ボタンをクリックします。

ストレージ バケットの名前を選択します(Google Cloud 全体でグローバルに一意の名前である必要があります)。[作成] ボタンをクリックします。このストレージ バケットの名前は、すぐに必要になるため覚えておいてください。

Cloud Console で、[Dataflow] を選択します。

[テンプレートからジョブを作成](画面上部)をクリックします。

次の点に注意して、以下のようにジョブの詳細を入力します。
- dataflow-gcs-to-pubsub のジョブ名を入力します。
- リージョンは、プロジェクトがホストされている場所に応じて自動的に選択されるため、変更する必要はありません。
- GCS Text to Cloud Pub/Sub の Cloud Dataflow テンプレートを選択する
- [Input Cloud Storage File(s)] に「gs://codelab-iot-data-pipeline-sampleweatherdata/*.json」(これは一般公開データセットです)と入力します。
- 出力 Pub/Sub トピックの正確なパスはプロジェクト名によって異なり、「projects/yourProjectName/topics/weatherdata」のようになります。
- [一時的な場所] に、作成した Google Cloud Storage バケットの名前と 「tmp」というファイル名の接頭辞を設定します。「gs://myStorageBucketName/tmp」のようになります。
すべての情報が入力されたら(下記を参照)、[ジョブを実行] ボタンをクリックします。

Dataflow ジョブの実行が開始されます。

Dataflow ジョブが完了するまでに約 1 分かかります。

8. データが流れていることを確認する
Cloud Functions のログ
Cloud Functions が Pub/Sub によってトリガーされていることを確認する
gcloud beta functions logs read function-weatherPubSubToBQ
ログには、関数が実行され、データが受信され、BigQuery に挿入されていることが表示されます。

BigQuery データ
データが BigQuery テーブルに流れていることを確認します。Cloud Console から BigQuery(bigquery.cloud.google.com)に移動します。

プロジェクト名(ウィンドウの左側)の下にある [データセット](weatherData)、[テーブル](weatherDataTable)の順にクリックし、[テーブルのクエリ] ボタンをクリックします。

SQL ステートメントにアスタリスクを追加して、以下のように SELECT * FROM... となるようにし、[クエリを実行] ボタンをクリックします。

プロンプトが表示されたら、[クエリを実行] ボタンをクリックします。

結果が表示された場合、データは適切に流れています。

データが流れるようになったので、分析ダッシュボードを構築する準備が整いました。
9. データポータル ダッシュボードを作成する
Google データポータルではデータを情報豊富なダッシュボードやレポートにまとめて、簡単に読み取りや共有ができ、全面的にカスタマイズすることもできます。
ウェブブラウザで https://datastudio.google.com にアクセスします。

[新しいレポートの開始] で [空白] をクリックし、[開始] ボタンをクリックします。

チェックボックスをオンにして利用規約に同意し、[次へ] ボタンをクリックして、受信するメールを選択し、[完了] ボタンをクリックします。[新しいレポートの開始] で、[空白] をクリックします。

[新しいデータソースを作成] ボタンをクリックします。

[BigQuery] をクリックし、[Authorize] ボタンをクリックして、データポータルで使用する Google アカウントを選択します(このアカウントは、この Codelab で使用してきたアカウントと同じである必要があります)。

[許可] ボタンをクリックします。

プロジェクト名、データセット、テーブルを選択します。[接続] ボタンをクリックします。

以下に示すように、タイプ フィールドを変更します(timecollected と sensorID 以外のすべてが数値になります)。timecollected は Date Hour(Date だけでなく)に設定されていることに注意してください。以下のように [Aggregation] フィールドを変更します(露点、温度、湿度、気圧は平均値とし、その他はすべて [なし] に設定します)。[レポートを作成] ボタンをクリックします。

[レポートに追加] ボタンをクリックして確定します。

Google アカウントの選択を求められたら、アカウントを選択して [許可] ボタンをクリックし、データポータルでレポートを Google ドライブに保存できるようにします。

ダッシュボードを作成するための空白のキャンバスが表示されます。アイコンの上部の行から [時系列] を選択します。

空白のシートの左上隅に長方形を描画します。空白のシートの約 1/4 を占めるようにします。

ウィンドウの右側にある [スタイル] タブを選択します。[欠損データ] を [線が 0 になる] から [線が途切れる] に変更します。[左 Y 軸] セクションで、[軸の最小値] の 0 を削除して、(自動)に変更します。

シートのグラフをクリックし、コピー/貼り付け(Ctrl+C/Ctrl+V)を 3 回行います。各グラフがレイアウトの 4 分の 1 を占めるように配置します。

各グラフをクリックし、[時系列プロパティとデータ] セクションで既存の指標(露点)をクリックして、4 つの気象データ(露点、気温、湿度、気圧)すべてに独自のグラフが表示されるまで、別の指標を選択します。


これで、基本的なダッシュボードが完成しました。

10. 完了
これで、データ パイプライン全体が作成されました。この演習では、Google Pub/Sub の使用方法、サーバーレス関数のデプロイ方法、BigQuery の活用方法、データポータルを使用した分析ダッシュボードの作成方法を学習しました。また、Google Cloud SDK を安全に使用して、Google Cloud Platform にデータを取り込む方法についても学習しました。これで、可用性を維持しながら大量のデータを処理できる重要なアーキテクチャ パターンを実際に体験できました。

クリーンアップ
天気データと分析パイプラインのテストが完了したら、実行中のリソースを削除できます。
IoT センサーを構築した場合は、シャットダウンします。ターミナル ウィンドウで Ctrl+C キーを押してスクリプトを停止し、次のコマンドを入力して Raspberry Pi の電源を切ります。
shutdown -h now
Cloud Functions に移動し、function-weatherPubSubToBQ の横にあるチェックボックスをオンにして、[削除] をクリックします。

Pub/Sub に移動し、[トピック] をクリックして、weatherdata トピックの横にあるチェックボックスをオンにしてから、[削除] をクリックします。

[ストレージ] に移動し、ストレージ バケットの横にあるチェックボックスをオンにして、[削除] をクリックします。

bigquery.cloud.google.com に移動し、プロジェクト名の横にある下矢印をクリックし、weatherData データセットの右にある下矢印をクリックして、[データセットを削除] をクリックします。

メッセージが表示されたら、データセット ID(weatherData)を入力して、データの削除を完了します。
