OCIでThingsBoardを使ってIoTデバイスデータを見える化(SSL対応)


はじめに

本記事では、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インスタンスを作成可能(リソースの範囲内で分割して使用可能)
Warning

Ampere A1 ComputeインスタンスのVM.Standard.A1.Flexはどこのリージョンも不足しているようで、生成時にエラーが表示されます。何度もリトライすれば生成可能(自動リトライするスクリプトを公開している方もいる)のようですが、今回は諦めました。

ストレージ

  • 合計200GBまでの2つのブロックストレージボリューム
  • 10GBのオブジェクトストレージ
  • 10GBのアーカイブストレージ

データベース

  • Oracle Autonomous Database

ThingsBoardとは

ThingsBoardは、IoTデバイスの管理とデータの可視化を可能にするオープンソースのIoTプラットフォームです。このプラットフォームは、デバイスの接続性、データ収集、処理、そして視覚化までを一貫して提供し、IoTソリューションの開発と展開を大幅に簡素化します。
ThingsBoardの大きな魅力の一つは、Community Editionが完全に無料で利用できることです。このエディションは Apache 2.0 ライセンスの下で提供されており、個人利用だけでなく商用利用も可能です。

Warning

Community Editionは機能が限定されるため、本格的に運用するためには有料ですがCloudかProfessional Editionを利用する必要がある可能性が高いです。
ThingsBoradではデバイスごとにテレメトリアップロードAPIが異なるため、別のAPIを生成しデバイスごとのテレメトリアップロードAPIに変換する処理が必要になる場合があります。Professional EditionであればHTTPインテグレーションで対応できる可能性があります。(未確認)
今回はCommunity Editionを利用するため、別の処理で対応します。

主な特徴

  • デバイス管理: 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をクリックしダウンロード

以上の設定でインスタンスを作成します。

Warning

このシェイプはAlways Free対象ではないためコスト管理には注意してください。

予約済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

Information

証明書を以前に取得済みで、今回始めてnginxと併用する場合には、自動更新が失敗することがあります。(既にport 80を別プロセスが利用しているというような内容のエラーがでます)
その場合には、/etc/letsencrypt/renewal/ドメイン名.confファイルを編集し、認証方法をnginxに変更します。

[renewalparams]
authenticator = nginx
installer = nginx

以上の設定により、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に変換する処理を実装します。