ISID テックブログ

ISIDが運営する技術ブログ

スマートシティを実現するFIWAREとは

これは電通国際情報サービス アドベントカレンダー20日目の記事です。

こんにちは、電通国際情報サービス(ISID)の上羽優貴です。 ISIDは今年に新しくスマートシティや自治体DX、脱炭素化などの社会課題対応型ビジネスの推進を目的としたスマートソサエティセンターという新組織を立ち上げました。私はここに所属し、スマートシティ関連のビジネスを推進しています。本記事では、スマートシティを実現するための基盤ソフトウェアであるFIWARE(ファイウェア)について解説します。

スマートシティと都市OS

近年、日本におけるスマートシティへの取り組みが盛んになっています。トヨタが推進するウーブンシティは有名ですね。スマートシティを実現するうえで欠かせないのがICTやデータの活用です。その活用の分野は防災や安全、モビリティ、教育・医療など多岐にわたります。今現在も様々な都市においてICTやデータを活用した住民サービスの提供がなされています。 しかし、日本でのスマートシティの実現に向けては、これまで大きく3つの課題がありました。

1. サービスの再利用・横展開

分野や組織ごとに個別にシステムを構築することが多く、他の地域での再利用や横展開が困難

2. 分野間データ利活用

分野や組織ごとにデータが独立し、分野や組織を横断してデータを活用することが困難

3. 拡張性の低さ

個別にシステムが構築されるため独自の仕様を持ち、機能拡張にかかるコストが大きく 、サービスを拡張させることが困難

そこで、近年注目を集めているのが都市OSというソフトウェア基盤です。都市OSは以下のような特徴を持ち、これまで課題だったサービスの再利用や、分野間のデータ利活用を促進する効果を期待されています。

1. 相互運用(つながる)

共通の機能や標準的なインタフェース(API)を具備して外部に公開する仕組みを持ち、分野や組織をまたがるサービス連携や横展開を可能にします。

2. データ流通(ながれる)

スマートシティに利用するデータを仲介する機能を持ち、分野や組織を超えたデータ活用を可能にします。

3. 拡張容易(つづけられる)

機能間の疎結合なシステム構成を持ち、システムの拡張を容易にします。

都市OSを構築するためのソフトウェアの1つとして、この記事で紹介するFIWAREが挙げられます。

スマートシティガイドブック(本文)第2章1 p.33より引用

FIWAREとは

FIWAREとはFI(Future Internet)WARE(SOFTWARE)の略で、自治体や企業などの業種を超えたデータ利活用やサービス連携を促すために開発されたソフトウェア群です。ソフトウェア群と表現した通り、FIWAREは1つのソフトウェアのことではなく、いくつかのソフトウェアの総称です。OSSとしてGitHubに公開されています。

FIWAREは欧州のFI-PPPという官民連携プログラムで開発されました(FI-PPPについてはこちらを参照ください)。その後、FIWAREを民間主導で推進するためのFIWARE Foundationが設立されました。現在はTelefonica(GitHubリポジトリでFIWAREのコンポーネントを公開)やNEC加古川市高松市にFIWAREを導入)などが中心メンバーとなって推進しています。

FIWAREは都市OSを構築するために利用されます。都市OSとして利用されるのは、前述の都市OSの特徴を持つためです。具体的には以下のとおりです。

1. 相互運用(つながる)

NGSI(Next Generation Service Interfaces)と呼ばれるAPI標準規格を採用しています。標準規格のAPIにより、分野や組織間のサービス連携やデータの利活用を可能にします。NGSIについては後述します。

2. データ流通(ながれる) FIWAREのコアコンポーネントであるFIWARE Orionがデータを分散管理したり、データを中継したり機能を持ちます。

3. 拡張容易(つづけられる)

下図の通り、FIWAREを構成するコンポーネントはそれぞれが独立して動作する「マイクロサービスアーキテクチャ」を採用しています。必要な機能を持つコンポーネントを取捨選択することにより、システムの拡張を容易にします。

GitHubより引用

FIWAREのコンポーネント

FIWAREは多くのコンポーネントを持ち、それぞれを組み合わせて利用します。FIWAREを構成するコンポーネントはGeneric Enablers(GE)と呼ばれます。ここではGEのうち、代表的なものを挙げて簡単に説明します。

FIWAREのコア(必須)となるコンポーネントです。コンテキストブローカーとしてデータを保管・管理するための機能を持ち、NGSIでデータを公開できます。MongoDBがデータストアとして利用されます。Orionに保管されるデータのライフサイクルは基本的に短く、最新のデータにより上書き更新されます。例えばビルの電力データをOrionで管理することを考えたときに、Orionに保管されるのは現在のビルの電力のみで、その履歴は保管されません。

Orionに登録されたデータを蓄積するためのコンポーネントです。データストアとしてPostgreSQL、ElasticSearch、AWSのDynamoDBなど幅広く対応しています。 Orionに登録されたデータの変更をNGSIで受け取り、その変更履歴をデータストアに登録します。

名前の通り、IoTのデータ収集にかかわるコンポ―ネントです。RabbitMQなどのMQTTブローカーに集められたデータを収集してNGSIに変換し、Orionに登録する機能を持ちます。

データを可視化するためのコンポーネントです。OrionからNGSIでデータを受け取り、地図やグラフなどを活用したダッシュボードを通じてデータを閲覧できます。

  • 開発ツール

DockerイメージHelmチャートが公開されています。AWSやAzureといったパブリッククラウドのコンテナプラットフォームを利用してFIWAREをホストすることが可能になります。

実際にFIWAREを使ってみる

ここからは実際にFIWAREを使ったデータ登録、データ取得といった手順を試してみます。この手順で利用するFIWAREのコンポーネントはOrionのみです。Orionを利用するにあたり、事前にNGSIの説明します。

NGSIとは

NGSIは、NECを中心にOMA(Open Mobile Alliance)によって標準化されたAPIの規格です。アップデートが継続的に行われ、NGSI-LD(Linked Data)と呼ばれる規格が最新です。ただし、FIWAREに実装されているNGSIのバージョンはNGSIv2(NGSI-LDの以前のバージョン)であり、NGSI-LDは開発中になります。そのため、ここではNGSIv2に関して説明します。

まずはNGSIv2のデータモデルについて、以下のjsonを例に説明します。これはNGSIv2の規格に則り表現されたjsonです。

{
   "id":"urn:ngsi-ld:Vehicle:A4567",
   "type":"Vehicle",
   "brandName":{
      "type":"Property",
      "value":"Mercedes"
   },
   "isParked":{
      "type":"Relationship",
      "value":"urn:ngsi-ld:OffStreetParking:Downtown1",
      "metadata":{
         "observedAt":{
            "value":"2017-07-29T12:00:04",
            "type":"DateTime"
         },
         "providedBy":{
            "type":"Relationship",
            "value":"urn:ngsi-ld:Person:Bob"
         }
      }
   }
}

このjsonVehicleという車のオブジェクトを表しています。NGSIv2において、このオブジェクトのことをエンティティ(Entity)と呼びます。このEntityは、どのブランドであるかを示すbrandNameと、どこに駐車されているかを示すisParkedという属性を持ちます。これら属性のことを、アトリビュート(Attribute)と呼びます。さらにisParked属性はmetadataと呼ばれるその属性に付随する情報を持ちます。observedAtというそのデータが変更された時間や、providedByというそのデータが誰によって変更された、といったような情報です。この情報のことをメタデータ(Metadata)

このようにNGSIv2でのデータモデルはEntity・Attribute・Metadataの3つにより構成される下図のようなモデルです。

こちらより引用

NGSIではAPI Specificationも定められています。

Orionでのデータ管理を試す

こちらで公開されている手順を参考に、Orionでのデータ管理を試してみます。実行にあたり、DockerDocker Composeが必要になりますので事前にインストールお願いします。なお、コマンドの実行環境はbashになります。

まずはチュートリアル用のリポジトリからファイルを取得し、環境変数を設定してます。環境変数を設定後、コンテナを起動します。

# リポジトリのクローン
git clone https://github.com/FIWARE/tutorials.Getting-Started.git
cd tutorials.Getting-Started
git checkout NGSI-v2

# 環境変数の設定
export $(cat .env | grep "#" -v)
# コンテナを起動
docker compose -p fiware up -d

docker-compose.ymlの中を確認すると、Orionのコンテナと、MongoDBのコンテナを起動することが確認できます。前述の通り、MongoDBはOrionのデータストアとして利用されるためです。これがFIWAREを始めるにあたっての最小構成となります。

次に、起動したOrionへ以下のリクエストを投げてみてください。curlではなくても、PostmanなどのGUIソフトウェアを利用しても構いません。

curl -iX POST \
  'http://localhost:1026/v2/entities' \
  -H 'Content-Type: application/json' \
  -d '
{
    "id": "urn:ngsi-ld:Store:001",
    "type": "Store",
    "address": {
        "type": "PostalAddress",
        "value": {
            "streetAddress": "Bornholmer Straße 65",
            "addressRegion": "Berlin",
            "addressLocality": "Prenzlauer Berg",
            "postalCode": "10439"
        },
        "metadata": {
            "verified": {
                "value": true,
                "type": "Boolean"
            }
        }
    },
    "location": {
        "type": "geo:json",
        "value": {
             "type": "Point",
             "coordinates": [13.3986, 52.5547]
        }
    },
    "name": {
        "type": "Text",
        "value": "Bösebrücke Einkauf"
    }
}'

NGSIv2のEntityを作成するAPI/v2/entities)に対してリクエストを送信していることがわかります。このリクエストにより、OrionにはStore Entityが作成されます。 次に登録したEntityを取得するAPIを実行してみます。以下のコマンドを実行してください。

curl -G -X GET \
   'http://localhost:1026/v2/entities/urn:ngsi-ld:Store:001' \
   -d 'options=keyValues'

NGSIv2のEntityを取得するAPI/v2entities/<Entity ID>)に対してリクエストを送信していることがわかります。このリクエストにより、Orionに登録されたEntityを取得します。なお、options=keyValuesというクエリが指定されていますが、これはAttributeのtypemetadataを省略した形でレスポンスを得るためのオプションです。レスポンスとして、登録したEntityを取得できていることが確認できます。

{
    "id": "urn:ngsi-ld:Store:001",
    "type": "Store",
    "address": {
        "streetAddress": "Bornholmer Straße 65",
        "addressRegion": "Berlin",
        "addressLocality": "Prenzlauer Berg",
        "postalCode": "10439"
    },
    "location": {
        "type": "Point",
        "coordinates": [13.3986, 52.5547]
    },
    "name": "Bösebrücke Einkauf"
}

このように基本的なCRUD操作のほか、都市OSの特徴である「データ流通(ながれる)」を実現するための機能を持ちます。Orionのデータが変更されたときにPush型で情報を通知するSubscriptionと呼ばれる機能や、外部のデータを仲介するRegistrationと呼ばれる機能などがそれに該当します。本記事では割愛しますが、リンク先で手順が公開されていますのでぜひ試してください。

おわりに

本記事ではスマートシティを実現する都市OSについて、また都市OSを構築するためのFIWAREについて紹介しました。

日本におけるFIWAREの状況として、NEC中心にコミュニティが形成され、日本語の記事も増えてきています。またいくつかの自治体にも導入され、今後ますます認知度も高まり、発展していくことが予想されます。そんな中、ISIDとしても個人としても、日本のスマートシティの分野に貢献できるよう情報発信を続けていきたいなと考えています。 最後までお読みいただきありがとうございました。

参考文献

執筆:@ueba.yuki、レビュー:@sato.taichiShodoで執筆されました