
目次
はじめに
本記事では、Oracle Cloud Infrastructure (OCI)とThingsBoardを組み合わせて、IoTデバイスデータの見える化システムを構築する方法をご紹介します。
OCIの無料枠を活用することも可能なのですが、今回は無料枠を獲得できず有料枠での実装になりましたが、ThingsBoardのCommunity Editionを導入することで、コストを抑えつつ高機能なIoTプラットフォームを実現できます。さらに、SSL対応やテレメトリーデータの加工など、実用的な設定方法も解説します。
Oracle Cloud Infrastructure (OCI) とは
Oracle Cloud Infrastructure(OCI)は、高速で信頼性の高いクラウド環境を提供し、企業が必要とするアプリケーションやワークロードをサポートする多彩な機能を備えたエンタープライズクラウドサービスです。クラウドネイティブからエンタープライズITまであらゆるワークロードに対応しており、高いパフォーマンス、高い信頼性、高いコスト優位性を特長としています。
特に無料枠(Oracle Cloud Free Tier)では、他のクラウドサービスと比較して非常に寛大なリソース(4CPU/24GBメモリ/4Gbps帯域)を無期限で提供しており、クラウド学習や小規模なシステム運用に最適です。
Always Free(無期限無料)サービス
OCIでは、期間の制限なく以下のサービスを無料で利用することができます。
コンピュート
- AMDプロセッサベース:1/8OCPUと1GBのメモリーを搭載した2つの仮想マシン
- Armベース(Ampere A1):4 OCPUと24GBメモリを搭載した仮想マシン
- 月あたり3,000 OCPU時間と18,000 GB時間まで利用可能
- 4 OCPUを750時間(約1か月)使うと、3,000OCPU時間になります
- 24GBのメモリを750時間使うと、18,000GB時間になります
- ネットワーク帯域は4Gbpsまで利用可能
- 最大4つのVMインスタンスを作成可能(リソースの範囲内で分割して使用可能)
ストレージ
- 合計200GBまでの2つのブロックストレージボリューム
- 10GBのオブジェクトストレージ
- 10GBのアーカイブストレージ
データベース
- Oracle Autonomous Database
ThingsBoardとは
ThingsBoardは、IoTデバイスの管理とデータの可視化を可能にするオープンソースのIoTプラットフォームです。このプラットフォームは、デバイスの接続性、データ収集、処理、そして視覚化までを一貫して提供し、IoTソリューションの開発と展開を大幅に簡素化します。
ThingsBoardの大きな魅力の一つは、Community Editionが完全に無料で利用できることです。このエディションは Apache 2.0 ライセンスの下で提供されており、個人利用だけでなく商用利用も可能です。
主な特徴
- デバイス管理: ThingsBoardは、多様なIoTデバイスを簡単に接続し管理することができます。MQTT、CoAP、HTTPなどの標準的なIoTプロトコルをサポートしているため、ほとんどのデバイスと互換性があります。
- データ収集と保存: センサーやデバイスからのテレメトリデータを効率的に収集し、スケーラブルで耐障害性のある方法で保存します。
- リアルタイムデータ可視化: 収集されたデータは、カスタマイズ可能なダッシュボードを通じてリアルタイムで視覚化できます。30以上の設定可能なウィジェットが用意されており、多くのIoTユースケースに対応できます。
- データ分析: 収集されたデータに基づいて、アラームの発生や自動化ルールの設定が可能です。これにより、デバイスの状態監視や予防的なメンテナンスが容易になります。
データの可視化
ThingsBoardの強みの一つは、データの可視化機能です。以下のような機能により、IoTデバイスから収集したデータを効果的に表示し、分析することができます:
- カスタマイズ可能なダッシュボード: ユーザーは自身のニーズに合わせてダッシュボードをカスタマイズできます。グラフ、ゲージ、マップなど、多様なウィジェットを組み合わせて直感的なインターフェースを作成できます。
- リアルタイムモニタリング: デバイスからのデータをリアルタイムで表示し、即座に状況を把握することができます。
- 履歴データの分析: 過去のデータを簡単に閲覧し、トレンドや異常を特定することができます。
- アラート機能: 特定の条件が満たされた場合にアラートを発生させ、迅速な対応を可能にします。
ThingsBoardは、IoTプロジェクトを始めるための優れた選択肢です。無料で利用できる豊富な機能セットと、直感的なデータ可視化ツールにより、IoTデータの価値を最大限に引き出すことができます。スマートエネルギー、産業用IoT、スマートビルディングなど、さまざまな分野で活用されており、IoTソリューションの迅速な開発と展開を支援します。
OCIにインスタンスを作成
下記ページにあるようにThingsBoard Marketplace イメージからインスタンスを生成する方法もありますが、このイメージのThingsBoardのバージョンは、3.6.4であり少し古いバージョンのため、今回はUbuntu24.04のインスタンスを生成しDockerでThingsBoardを稼働します。
パブリックIPアドレスの予約
インスタンスにアクセスするために、パブリックIPアドレスが必要になります。インスタンス生成時に自動割り当てすることも可能ですが、事前にパブリックIPアドレスを予約しておき、そのIPアドレスを生成したインスタンスに割当ます。
[ネットワーキング] – [予約済パブリックIP] – [パブリックIPアドレスの予約]
- 予約済パブリックIPアドレス名:PublicIP01
- コンパートメントに作成:変更不要
- xxxxのIPアドレス・ソース:Oracle
インスタンス作成
[コンピュート] – [インスタンス] – [インスタンスの作成]
- 名前:わかりやすい任意の名前
- イメージ:Canonical Ubuntu 24.04
- シェイプ:専門と前世代 VM.Standard.E3.Flex(メモリを8GBに変更)
- プライマリVNIC情報:パブリックIPv4アドレスの自動割当てのチェックを外す
- SSHキーの追加:Save private keyをクリックしダウンロード
以上の設定でインスタンスを作成します。
予約済IPアドレス割り当て
インスタンスの作成が完了すると自動的に起動します。インスタンスの詳細画面の左側の下部に[アタッチされたVNIC]という項目があるので、それをクリックします。
画面下部に「アタッチされたVNIC」というリストがあり、すでに自動生成されたVNICがあるため名前をクリックします。
画面左下部の[リソース] – [メトリック] – [IPv4アドレス]をクリックします。
IPv4 アドレスのリストがあるため、編集します。
パブリックIPタイプ
[予約済パブリックIP] – [既存の予約済IPアドレスの選択] – [事前に予約していたIPアドレスを選択]
ネットワーク・セキュリティ・グループ作成
[ネットワーキング] – [仮想クラウド・ネットワーク] – VCNの名前をクリック – [ネットワーク・セキュリティ・グループ] – [ネットワーク・セキュリティ・グループの作成]
- 名前:わかりやすい任意の名前
- セキュリティ・ルールの追加
- 方向:イングレス
- ソースタイプ:CIDR
- ソースCIDR:0.0.0.0/0
- プロトコル:TCP
- 宛先ポート範囲:8080
同様に、ポート80、443も追加します。
ネットワーク・セキュリティ・グループを作成したら、インスタンスの詳細画面にて、ネットワーク・セキュリティ・グループを編集状態にし、作成したネットワーク・セキュリティ・グループを割り当てます。
以上の設定により、ダウンロードしたSSH キーを使いパブリックIPアドレスに接続することでログインできます。
ユーザ名は「ubuntu」(インスタンスの詳細画面で確認可能)
Ubuntuの初期設定
sudo apt update && sudo apt upgrade -y
ufwの有効化
sudo ufw limit proto tcp from any to any port 22
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 8080/tcp
sudo ufw enable
設定状態を確認します。
sudo ufw status
fail2banの設定
sudo apt install fail2ban
fail2ban-client --version
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
fail2banの設定は下記サイトの情報を参考に設定します。
Dockerのインストール
下記サイトを参考にインストールします。
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo docker run hello-world
非ルートユーザーとしてDockerを管理する
sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker
docker run hello-world
DockerにThingsBoardをインストール
下記ページを参考にDockerにThingsBoardを構築します。
nano docker-compose.yml
version: '3.0'
services:
mytb:
restart: always
image: "thingsboard/tb-postgres"
ports:
- "8080:9090"
- "1883:1883"
- "7070:7070"
- "5683-5688:5683-5688/udp"
environment:
TB_QUEUE_TYPE: in-memory
volumes:
- ~/.mytb-data:/data
- ~/.mytb-logs:/var/log/thingsboard
mkdir -p ~/.mytb-data && sudo chown -R 799:799 ~/.mytb-data
mkdir -p ~/.mytb-logs && sudo chown -R 799:799 ~/.mytb-logs
docker compose up -d && docker compose logs -f mytb
これでThingsBoardが起動します。起動までに少し時間がかかります。
起動後は、http://<パブリックIPアドレス>:8080 にブラウザからアクセスすることで、ログイン画面が表示されます。
ThingsBoardの初期設定
http://<パブリックIPアドレス>:8080 にブラウザからアクセスする。
初期ユーザーアカウントのパスワードを変更する
ThigsBoardインストール時点で、3つのユーザーが作成されています。
各ユーザーでログインし、初期パスワードを変更します。
- System Administrator(システム管理者):
メールアドレス: sysadmin@thingsboard.org
パスワード: sysadmin - Tenant Administrator(テナント管理者):
メールアドレス: tenant@thingsboard.org
パスワード: tenant - Customer User(顧客ユーザー):
メールアドレス: customer@thingsboard.org
パスワード: customer
ドメインの割当て
パブリックIP直打ちではなくドメインでアクセスできるようにします。
ドメインはどこから取得したものでも利用できます。今回はXserverドメインにて取得したドメインを利用しました。
下記サイトの情報を参考に設定します。
ゾーンの作成
[ネットワーキング] – [仮想クラウド・ネットワーク] – [DNS管理] – [ゾーン] – [ゾーンの作成]
- メソッド:手動
- ゾーン・タイプ:プライマリ
- ゾーン名:取得したドメイン
- コンパートメントに作成:変更不要
ネームサーバーの設定
ゾーンを作成すると、ネームサーバーの一覧が表示されるのでメモしておき、ドメインを取得したサービス(今回はXserver ドメイン)の管理画面からネームサーバーを指定します。
DNSレコード設定
作成したゾーンの[レコード]にて[レコードの管理]をクリックし、[レコードの追加]をクリックします。
- 名前:サブドメインで利用する場合は入力。空欄でもOK。
- レコードタイプ:A – IPv4アドレス
- TTL:3600
- Address(アドレス):インスタンスのパブリックIPアドレス
以上の設定により、http://ドメイン:8080 でThingsBoardにアクセス可能になります。接続可能になるまで、しばらく時間がかかります。(最大48時間)
SSL接続設定
ThingsBoardにデータを送信する際、httpでの送信でも可能ですが、SSL対応にしてhttpsでの送信にすることでセキュリティが向上します。
特に、ログイン情報やデバイスのアクセストークンが漏洩するリスクを低減できます。
また、外部から接続する際に、SSL対応していなければ送信できない場合もあります。今回はこれに該当し、1nceからThingsBoardにデータを送信する際にはSSLでなければ送信できません。
よって、ThingsBoardにSSL接続するよう設定します。いくつか方法がありますが、簡単に設定できるnginxのリバースプロキシを利用する方法で設定します。
Nginx と Certbot をインストール
sudo apt-get install nginx certbot python3-certbot-nginx
sudo nano /etc/nginx/sites-available/default
上記ファイルに次の内容を追加します。
server {
listen 443 ssl;
server_name あなたのドメイン;
ssl_certificate /etc/letsencrypt/live/あなたのドメイン/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/あなたのドメイン/privkey.pem;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
sudo nginx -t
sudo systemctl restart nginx
Let’s Encrypt で証明書を取得します。
sudo certbot --nginx -d あなたのドメイン
証明書の自動更新を設定します。
sudo systemctl status certbot.timer
証明書の自動更新のテスト
sudo certbot renew --dry-run
以上の設定により、https://ドメインでThingsBoardにアクセス可能になります。
【オプション】テレメトリーデータの加工
今回は10年間のランニングコストがわずか2000円で使えるIoT専用SIM 1nceを使ってデバイスからデータを送信し、1nceからThingsBoardにデータを転送することで見える化します。
1nceについては、別記事にまとめています。
1nceから外部へWebhookで送信されるデータのフォーマットは次のようなフォーマットです。
{
"payload": {
"type":"JSON",
"value":{
"humi":57.36629,
"rain":0,
"temp":23.034637,
"press":10.365234,
"deviceid":1,
"lux":0
}
},
"received": "1670598749915",
"id": "xxxxxx",
"source": "UDP",
"type": "TELEMETRY_DATA",
"version": "1.0.0",
"device": {
"iccid": "xxxxxx",
"ip": "xxxxxx",
"imsi": "xxxxxx"
}
}
グラフ化したいデータは、payloadのvalue内の項目なのですが、普通に1nceからThingsBoardに接続しデータを送信すると上記のすべてのデータがデバイスの受信データとして保存されます。
また、最初にも記載しましたが、ThingsBordのデータを送信するAPIのURLには、デバイスごとに異なるアクセストークンが含まれており、デバイスごとに送信先URLを変更する必要があります。
しかし、1nceに登録するwebhookのURLは全デバイスに共通のURLを登録しなければなりません。よって、ThingsBoardにデータを送信するまえに、受信したデータを加工し、その後、ThingsBordにデータを送信するという流れになります。
- 1nceから全デバイス共通のURLにデータをPOSTする。
- 受信したデータをdeviceid、iccid、imsiなどを利用してデバイスを識別し、そのデバイスに対応したアクセストークンを用いてThingsBoard用のAPIに変換する。
- ThingsBoardではpayloadのvalue内のデータのみでよいため、その部分を抜き出したJSONを構築する。
- ThingsBoard用URLに作成したJSONをPOSTする。
以上のような処理を自動的に行うことが必要になります。
このあたりの処理が、ThingsBoard Professional EditionであればHTTPインテグレーションを利用することで解決できるかもしれません。
今回はCommunity EditionのためHTTPインテグレーションは利用できないので、独自の処理を盛り込みます。
実装方法は色々あると思いますが、今回は今まで使ったことがないnginx-module-njs パッケージをインストールし、nginxの設定内でJavaScriptコードを実行し、テレメトリーデータの加工処理を行いました。
詳細は割愛しますが、1nceから全デバイスのデータを送信するためのエンドポイントを作成し、そこに送信されたデータをJavaScriptで加工してからThingsBoardに送信するようにしています。
ThingsBoard利用例
SONY SPRESENSEを利用して収集した降雨データをThingsBoardにて見える化した事例を下記記事にまとめています。
まとめ
本記事では、Oracle Cloud Infrastructure (OCI)とThingsBoardを活用し、IoTデバイスから収集したデータを効果的に可視化するシステム構築の手順をご紹介しました。このシステムを導入することで、リアルタイムなデータ分析、迅速な問題特定、そしてデータに基づいた意思決定が可能となります。
多くのデータを収集・見える化することにより、各種ノウハウの属人化解消にもつながります。
IoTデータを見える化するツールには様々なものが公開されています。多くは有料であり、無料のツールはデータの保存期間が限定されるなどの制限があります。データは長期的に保存・利用したい、ただし、ランニングコストは抑えたい場合には、今回ご紹介したOCIとThingsBoardの組み合わせは適していると思います。
FAQ
-
このシステムの主な特徴は何ですか?
-
OCIとThingsBoardのCommunity Editionを組み合わせることで、低コストで高機能なIoTプラットフォームを実現できます。SSL対応やテレメトリーデータの加工など、実用的な機能も備えています。
-
どのようなIoTプロジェクトに適していますか?
-
スマート農業IoT、産業用IoT、スマートビルディングなど、様々な分野でのIoTデータの収集、管理、可視化に適しています。
-
OCIの無料枠でどの程度のリソースが使えますか?
-
Ampere A1 Computeインスタンスで4 OCPUと24GBメモリ、4Gbpsの帯域幅が無期限で利用可能です。ただし、現在はリソース不足で利用困難な場合があります。
-
ThingsBoardのCommunity Editionでできることは何ですか?
-
デバイス管理、テレメトリデータの収集・処理、ダッシュボード作成、MQTT/CoAP/HTTPプロトコルのサポート、ルールエンジンによるデータ処理などが可能です。
-
ThingsBoardのデータ可視化機能にはどのようなものがありますか?
-
カスタマイズ可能なダッシュボード、リアルタイムモニタリング、履歴データの分析、アラート機能などがあります。
-
システムのセットアップにはどのような手順が必要ですか?
-
OCIでのインスタンス作成、Ubuntuの初期設定、DockerでのThingsBoard導入、ドメイン割り当て、SSL設定などの手順が必要です。
-
SSL接続の設定方法は?
-
NginxのリバースプロキシとLet’s Encryptを使用してSSL証明書を取得し、設定します。
-
テレメトリーデータの加工が必要な理由は何ですか?
-
デバイスごとに異なるアクセストークンを使用する必要があるため、共通URLで受信したデータを各デバイス用に加工する必要があります。
-
データの加工処理はどのように実装しますか?
-
受信したデータからデバイスを識別し、対応するアクセストークンを用いてThingsBoard用のAPIに変換する処理を実装します。