さくらのクラウド上にFIWAREサーバをカンタン構築する方法

こんにちは、さくらインターネット研究所の菊地です。

さくらインターネット研究所では、データ流通・スマートシティに注目しておりまして、関連した取り組みをここ何年か継続して進めています。例えば、過去4年間に渡ってデータ流通の実証実験などを実施してきました。

スマートシティというと、大規模な街やビルの再開発、あるいは公共サービスのシステムの開発などをイメージされるかもしれません。そのような側面・進め方ももちろんありますが、自治体や企業での情報提供(データやAPI公開など)なども、小さい形かもしれませんが、スマートシティの一つの進め方だと思います。データやAPIがさまざまな場所・機関から提供あるいは公開され、それを利用して、より便利でスマートなサービス・社会を実現していくことがスマートシティなのです。

データ・APIの提供においては、それぞれの機関が独自の実装をするのではなく、共通の方式を採用することで相互利用を容易にしていこうという意図のもと共通基盤システムが作られています。それがFIWARE(ファイウェア)です。馴染みがない方もいらっしゃるかもしれませんが、目にする機会も徐々に増えてきているのではないでしょうか。

FIWAREのサーバはWebページ公開におけるWebサーバのようなもので、データを公開するのに必須のサーバです(具体的にはコンテキストブローカーといいます)。ホームページを公開するのにレンタルサーバを利用できるように、データ公開のためにFIWAREサーバを簡単に構築できることが理想です。近年、FIWAREサーバを(簡単に)構築できる方法が徐々に増えてきています。

本記事では、さくらのクラウド上にFIWAREサーバを構築する方法をご紹介したいと思います。なお、詳細に説明しだすと大変長い記事になってしまいますので、ある程度のところで記述を省略している箇所があります。読者の皆さんで大体は補完できるのではないかと思っておりますが…。

構築に必要なもの(準備)

インターネット上にFIWAREサーバを立ち上げ、Raspberry Piなどの端末からインターネット経由でライブなデータを登録できるようにします(静的なデータ登録も可能です)。以下のようなものが必要になります。

  • 仮想サーバ(さくらのクラウドを利用)
  • ドメイン名(さくらのドメインを利用)
  • FIWARE Big Bang(FIWAREサーバ構築スクリプト、OSSとして公開されている)
  • (作業するための端末)

極めて限定的な用途として、ミニマムなFIWAREサーバを手元のWindows/Mac/Linux端末内にインストールすることも可能ですが(その場合はドメイン名なども不要)、本記事ではインターネット上に公開されたサーバを構築する方法を紹介していきます。

さくらのクラウド上に仮想マシンを構築する方法、またドメイン名を取得する方法については、各種紹介記事等を参照してください(さくナレにもあるのではないかと思います)。ここでは仮想マシンがすでに構築済みでSSHでアクセス可能であり、また何らかのドメイン名が取得できていることを前提とします。

仮想ホストを用意する(さくらのクラウドの場合)
ちょっとしたお試しなら最小構成でも大丈夫

FIWARE Big-Bang

FIWARE Big-Bangは、FIWAREサーバを構築するためのスクリプトで、FIWAREに非常に詳しい日本人の開発者により開発されている、とても便利なOSSです。本記事ではこれを利用します。

https://github.com/lets-fiware/FIWARE-Big-Bang

本記事ではここまで「FIWAREサーバ」と書いていましたが、実際には、FIWAREはさまざまな機能を実装したコンポーネントの集合体です。もっとも基本になる、データを受け取り保存しまた外部に提供するサーバをコンテキストブローカーといいます。その他、データの長期保存のためのデータベースと接続するためのコンポーネントや、データを可視化するためのコンポーネント(さまざまな種類があります)、データ一覧をカタログとして提供するコンポーネントなど、多数のコンポーネントがあります。また認証システムのコンポーネントもあります。

FIWARE Big-Bangでは、どのコンポーネントをインストール・設定するかを事前に選択することができます(しなければなりません)。フルフルに入れることも可能ですが、本記事では最小限の構成で設定するようにします。

まず、FIWARE Big-Bang自体をターゲットとするサーバにインストールします。以下のようになります。

ubuntu@localhost:~$ curl -sL https://github.com/lets-fiware/FIWARE-Big-Bang/archive/refs/tags/v0.18.0.tar.gz | tar zxf -

次に、作成されたFIWARE-Big-Bang-0.18.0ディレクトリ配下で、設定ファイルのconfig.shを編集し、インストールしたいコンポーネントを選択します。本当に最小限必要なコンポーネントであるkeyrockとorionについてはデフォルトで設定されています(下記)。追加でインストールしたいコンポーネントがある場合には、当該の行でホスト名を設定します。

(config.sh冒頭部分)
#!/bin/bash

#
# Keyrock
#
# Set a sub-domain name of Keyrock
KEYROCK=keyrock
(config.sh 45行目付近)
#
# Orion
#
# Set a sub-domain name of Orion
ORION=orion

このホスト名は、実際に構築作業(スクリプトの実行)を始める前に、名前解決可能な状態にしておく必要があります。

ubuntu@localhost:~/FIWARE-Big-Bang-0.18.0$ dig orion.fiwaretestxxxx.org

; <<>> DiG 9.18.1-1ubuntu1.2-Ubuntu <<>> orion.fiwaretestxxxx.org
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 50906
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;orion.fiwaretestxxxx.org.		IN	A

;; ANSWER SECTION:
orion.fiwaretestxxxx.org.	693	IN	A	xxx.yyy.zzz.xxx

;; Query time: 8 msec
;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP)
;; WHEN: Wed Dec 21 21:45:03 JST 2022
;; MSG SIZE  rcvd: 66

具体的なDNS設定は以下のようになります。どのドメインサービスを利用しているかによって設定方法の詳細は異なります。以下はさくらのドメインの場合です。

ホスト名の設定(さくらのドメインの場合)
具体的なホスト名とIPアドレスは隠しています

実際の構築作業

事前準備が終了したら、実際の構築に入ります。

作業は簡単で、スクリプトを実行するだけです。引数に、取得しているドメイン名と、ホストのIPアドレスを指定します。

ubuntu@localhost:~/FIWARE-Big-Bang-0.18.0$ ./lets-fiware.sh fiwaretestxxxx.org xxx.yyy.zzz.xxx

(省略)

Wait for https://keyrock.fiwaretestxxxx.org/ to be ready (300 sec)
setup: https://keyrock.fiwaretestxxxx.org/ is ready.
setup: clean_up
setup: setup_complete
*** Setup has been completed ***
IDM: https://keyrock.fiwaretestxxxx.org
User: admin@fiwaretestxxxx.org
Password: zzzzzzzzzzzzzzzz
docs: https://fi-bb.letsfiware.jp/
Please see the .env file for details.

実行には少々時間がかかります(5分弱)。

内部動作はスクリプトを見ていただければと思いますが、Docker環境を構築し、その中でコンテナとして各種のFIWAREコンポーネントをインストールしています。またリバースプロキシも設定され、各コンポーネントに対して認証系を経由してシームレスにアクセスできるように設定されます。

簡単な動作確認

おことわり(おわび):本記事公開時点(2022年12月23日)では、FIWARE-Big-Bang内で呼び出してインストールしているFIWAREサービス部品の一つであるpep-proxy:8.1.0にバグが有り、そのままでは構築した環境が正常に動作しません。暫定的な対応ですが、以下のようにconfig.shを書き換えることで回避が可能です。いずれ正式に修正されると思われますので、その際は本記事内で修正内容について加筆する予定です。

(config.sh30行目)
IMAGE_KEYROCK=fiware/idm:8.1.0

IMAGE_KEYROCK=letsfiware/idm:8.1.0

(config.sh39行目)
IMAGE_WILMA=fiware/pep-proxy:8.1.0

IMAGE_WILMA=letsfiware/pep-proxy:8.1.0

さて、スクリプトの実行が完了したら早速試してみましょう。

FIWAREサーバ(コンテキストブローカー)にアクセスするには複数の方法がありますが、ここではコマンドラインベースのFIWARE便利ツールであるNGSI Goを利用します。NGSI GoはFIWARE Big-Bangを使用して環境を構築した場合には自動でインストールされており、初期設定等をすることなく使い始めることができます。ngsiコマンドはNGSI Goの実体です。

ubuntu@localhost:~/FIWARE-Big-Bang-0.18.0$ ngsi version --host orion.fiwaretestxxx.org
{
"orion" : {
  "version" : "3.7.0",
  "uptime" : "0 d, 0 h, 2 m, 13 s",
  "git_hash" : "8b19705a8ec645ba1452cb97847a5615f0b2d3ca",
  "compile_time" : "Thu May 26 11:45:49 UTC 2022",
  "compiled_by" : "root",
  "compiled_in" : "025d96e1419a",
  "release_date" : "Thu May 26 11:45:49 UTC 2022",
  "machine" : "x86_64",
  "doc" : "https://fiware-orion.rtfd.io/en/3.7.0/",
  "libversions": {
     "boost": "1_74",
     "libcurl": "libcurl/7.74.0 OpenSSL/1.1.1n zlib/1.2.11 brotli/1.0.9 libidn2/2.3.0 libpsl/0.21.0 (+libidn2/2.3.0) libssh2/1.9.0 nghttp2/1.43.0 librtmp/2.3",
     "libmosquitto": "2.0.12",
     "libmicrohttpd": "0.9.70",
     "openssl": "1.1",
     "rapidjson": "1.1.0",
     "mongoc": "1.17.4",
     "bson": "1.17.4"
  }
}

version取得リクエストに対して、バージョン情報が返されているのがわかります。

データの登録

FIWARE(正確にはFIWAREが採用する通信プロトコルであるNGSI(Next Generation Service Interfaces))では、データは先に登録して、その後必要があれば更新する、という動作モデルを採用しています。ですので、まずはデータを登録する必要があります。

データの登録方法にも複数のやりかたがありますが、上記同様ngsiコマンドを使います。

ubuntu@localhost:~/FIWARE-Big-Bang-0.18.0$ ngsi create entity --data \
'{\
  "id":"urn:ngsi-ld:Product:010",\
  "type":"Product", \
  "name":{"type":"Text", "value":"Lemonade"},\
  "size":{"type":"Text", "value":"S"}, \
  "price":{"type":"Integer", "value":99}\
}'

この時点で、登録したデータを参照することもできます。が、ここではさらに値を更新してみます。

ubuntu@localhost:~/FIWARE-Big-Bang-0.18.0$ ngsi update attr --id urn:ngsi-ld:Product:010 --attr price --data 100

できました。priceの値が99から100になっているはずです。
このように一度登録した後は、特定の項目の値だけ更新できます。

データの参照(取得)

登録されているデータを参照するには次のようにします。

ubuntu@localhost:~/FIWARE-Big-Bang-0.18.0$ ngsi get entity --id urn:ngsi-ld:Product:010 --type Product
{"id":"urn:ngsi-ld:Product:010","type":"Product","name":{"type":"Text","value":"Lemonade","metadata":{}},"price":{"type":"Integer","value":100,"metadata":{}},"size":{"type":"Text","value":"S","metadata":{}}}

priceが100になったデータを取得できました。
この例ではデータID(urn:ngsi-ld:Product:010)を指定して値を取得していますが、条件で検索する事もできます。NGSIでのデータアクセスの書式についての詳細は、NGSIのチュートリアル 等を参照してください。

ところで、上記の例を見てFIWAREでのデータの形式やデータの扱い方がさっぱりわからない、と感じた方もいらっしゃったのではないでしょうか? そういう方は、FIWAREではデータというものをどのように定義して扱うのか、というところを少し知っておいたほうが良いでしょう。例えばこちらのサイトではFIWAREチュートリアルを非常に丁寧に解説してくれていますので、一読すると良いでしょう(というにはかなりのボリュームですが)。

より本格的なシステムを構築していくために(今後の展開)

上記の例ではコマンドラインからデータを登録したり参照したりしましたが、実際にはあるシステムからデータを更新したり、センサを接続したRaspberry Piなどのノードからデータを定期送信したりすることになると思います。

一つの例として、Raspberry Piに温湿度センサ(BME280)を接続しその値をFIWAREサーバに送信するプログラムを作成してありますのでご紹介します。

https://github.com/sakura-internet/fiware-ngsi

FIWAREアクセスのサンプルコード

senddata_for_bme280.pyを実行するとデータをFIWAREサーバに送信することができます。内部でBME280にアクセスしてセンシングデータを取得するプログラムを呼び出しています。コード冒頭のサーバアドレスやデータIDなどの情報は適切に書き換える必要があります。

このGithubレポジトリでは、SwitchBotセンサからのデータを取得して同様にFIWAREサーバに送信するコードもあります。FIWAREサーバを立てて、これら複数のデータソースからデータを集めれば、データ利用側では特に意識することなく統一的にデータを扱うことができます。これがFIWAREの魅力です。

さて、登録されたデータを利用する方については、例えばデータの可視化ツールとしてFIWAREコンポーネントの一つであるWirecloudというツールがあります(cloudと名前がついていますがクラウド型サービスではなく、サーバにインストールして実行させるスタンドアローンタイプのソフトウェアです)。Wirecloud内でWidgetという部品を組み合わせてデータを加工したり地図やグラフで表示させることができます。これも上でご説明したFIWARE Big-Bangでインストールして使えます。

https://github.com/wirecloud-fiware

Wirecloudによる可視化の例(温湿度情報の表示)
Wirecloudの例(Widgetを配線して可視化画面を構築する)

Wirecloudは少々使い始めるのが難しいツールではあります。試行錯誤が必要かもしれません。Widgetのソースコード(Javascriptで記述されています)を読むのも有効です。これについてはまた別途ご紹介していきたいと考えています。(日本語での解説ドキュメントが少ないのも問題です…)

Wirecloud以外にも可視化ツールはあります。Node-REDなどでもFIWAREのデータを扱うことができます。既存の他のツールにinputするための変換ソフトウェアなどもあるようです。

既存ツールを使う他に、もちろん、自分でNGSIでFIWAREサーバにアクセスするコードを書き、アプリを作成することも可能です。NGSIの内容はHTTPのRESTですので、挙動を理解できればコードを書くことは難しいことではありません(実際に上記のRaspberry Piでのセンサデータ送信プログラムはそうやって書いています)。

まとめ

本記事ではFIWAREのサーバのインストール方法と、簡単な動作確認方法をご紹介しました。

OSSで公開されている構築スクリプトのFIWARE Big-Bangを利用すれば、さくらのクラウドなど(AWS環境などでも)簡単に環境を構築することが可能です。FIWAREでのデータの扱い方など、ぜひ試してもらえればと思います。

FIWAREの習熟という点からは、FIWARE Big-Bangを利用する他に、ローカルマシンに素のコンテキストブローカーをインストールすることも簡単です。今回は紹介していませんがお手軽簡単ですので、そちらを試していただいてもいいでしょう。

使ってみればFIWAREは大して難しくないということがわかってくるのではないかと思います。むしろサーバの構築やアクセス方法ではなく、FIWAREサーバを立ててどのようなデータを扱うのかどのように便利なサービスを構築していくのか、といったデータ流通やスマートシティの実現に向けた中身の議論こそが本題であると認識されることでしょう。

残念ながら、データをどう利用・活用するのか、スマートシティをどう実現するのかといったユースケースについての議論、また手段としてのFIWAREの使いこなしツールやノウハウ情報(特に日本語)は、まだたくさんある状況ではありません。ですので、興味関心のある皆さん、開発者の皆さんと一緒に情報交換したりできればいいなと考えています。今回の記事がその一助になることを願っています。またさくらインターネットでは、FIWAREに関連したコミュニティ活動も充実化させていきたいと考えております。それらについてもまたご紹介したいと考えています。

最後に一つご紹介です。来る2022年12月23日に「さくらの聖夜」イベントを開催します。ここでは今回ご紹介したようなFIWARE関連も含めて、さくらインターネット研究所での取り組みなどについてご紹介するコーナーもあります(他にもいろいろなセッションを予定しています)。ご興味ある方はぜひ参加を検討ください。もちろん無料です。

それでは。