低予算で今すぐ始めるデータ連携基盤 ~構築ハンズオン

本記事では、低予算かつ最も簡単に利用が開始できるVMとDockerを用いた検証運用環境の構築方法を紹介します。データ連携基盤に必要な各種モジュールはいずれもVM上でコンテナ稼働させるため、将来の本番運用を見据えたシステム改修においても無理なくクラウドベンダーが提供するコンテナサービスなどへのマイグレーションが検討可能であると予想されます。

VMインスタンスの選択

FIWARE OrionとKong Gatewayはいずれもデータ保存用のデータベースを併用します。FIWARE OrionはMongoDBを、Kong GatewayはPostgreSQLをそれぞれ利用するため、VM上ではこれら4つのコンテナを稼働させます。稼働に必要なマシンスペックはデータ量や利用規模に応じて大きく変化するため一概に示すことはできませんが、検証用途であれば、CPU/メモリ/ストレージは目安2 vCPU/4 GiB Memory/8 GB Storageが用意できれば十分動作確認することが可能です。このスペックサイズはKong Gatewayのガイドラインの内容や、FIWARE OrionのOSSコミュニティに掲載されたマニュアルの一部記載と比較しても乖離がないサイズ感です。

例えば、AWSの東京リージョンにてEC2を利用する場合であれば、開発向けのインスタンスとしてよく利用されるt3.medium(2 vCPU/4 GiB Memory)が候補になり、AzureのJapan EastリージョンでVMを利用する場合であれば、B2s(2 vCPU/4 GiB Memory)を採用することで、1ヶ月24時間フル稼働の前提でもおよそ40ドルで利用することが可能です。クラウドサービスではマシンスペックを後から変更することが可能であることに加え、夜間停止による稼働時間削減、もしくはリソースを長期で利用する前提であれば予約割引を併用してさらにコストを抑えることも可能です。

なお、安定稼働を想定した本番運用では、構成要素ごとにインスタンスを独立化させ、ほとんどの要素を冗長化させるシステム構成を採用することが一般的です。例えばマネージドデータベースサービスを採用するデータベース機能をシステム上で疎結合化できる上に各種保守運用の負担軽減も見込めますが、相応にランニングコストは高くなります。

VMのセットアップ

ここではベースOSとしてUbuntuを採用した場合のセットアップ手順(1〜4)を簡単に紹介します。

1.Dockerのインストール

今回事前準備が必要なライブラリは、コンテナを利用するためのDockerのみですので、Dockerの公式マニュアルに記載に準じてコマンドを実行します。Dockerは、Webアプリケーションとその実行に必要な環境資材(ライブラリや設定ファイルなど)を「コンテナ」という単位でまとめて管理・配布できる技術であり、再現性の高い開発・検証環境の構築に適しています。

VMリソースのコンソールに接続して、次のコマンドを実行します。


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
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
  

公式ドキュメントの内容を都度参照してください。

2.docker-composeマニフェストの用意

Docker Composeは複数のDockerコンテナを一括で定義、管理するための補助ツールです。今回利用するKong Gateway、PostgreSQL、FIWARE Orion、MongoDBの起動条件と宣言したマニフェスト(compose.yaml)を作成します。

compose.yaml


services:
  orion:
    image: telefonicaiot/fiware-orion:4.1.0
    ports:
      - 1026:1026
    depends_on:
      - mongo
    command: -dbURI mongodb://mongo -logLevel WARN

  mongo:
    image: mongo:8.0
    restart: unless-stopped
    command: ["mongod", "--quiet"]
    volumes:
      - ./mongodb_data:/data/db

  kong:
    image: kong:3.9.0
    restart: always
    environment:
      KONG_DATABASE: postgres
      KONG_PG_HOST: kong-db
      KONG_PG_USER: adminuser
      KONG_PG_PASSWORD: Passw0rd
      KONG_ADMIN_LISTEN: 0.0.0.0:8001
      KONG_PROXY_LISTEN: 0.0.0.0:8000
    ports:
      - 8000:8000
      - 8001:8001
      - 8002:8002
    depends_on:
      - kong-db

  kong-db:
    restart: always
    image: postgres:17.4
    environment:
      TZ: Asia/Tokyo
      POSTGRES_DB: kong
      POSTGRES_USER: adminuser
      POSTGRES_PASSWORD: Passw0rd
    volumes:
      - ./kongdb_data:/var/lib/postgresql/data

3.Dockerコンテナの起動

Kong Gatewayの初回起動時には、事前にPostgreSQLデータベースの作成と初期設定が必要です。初回起動時には次のdockerコマンドを順番に実行する必要があります。


docker compose pull
docker compose up -d kong-db
docker compose run kong kong migrations bootstrap
docker compose up -d

再起動など2回目以降の実行では、次のコマンドのみで4つのコンテナが起動します。

docker compose up -d

VMインスタンス上でOrionおよびKongコンテナにHTTPリクエストを発行すると、それぞれレスポンスが返ってきます。


$ curl localhost:1026/v2
{"entities_url":"/v2/entities","types_url":"/v2/types","subscriptions_url":"/v2/subscriptions","registrations_url":"/v2/registrations"}
$ curl localhost:8000
{
  "message":"no Route matched with those values",
  "request_id":"a1aee41ace14f023b7354e7bf0e00105"
}

4.APIの公開設定

Kong Gatewayの管理用APIを用いて、外部公開するAPIを設定します。Kongには設定用のGUIがあり、Webブラウザでポート8002にアクセスできる場合は画面操作による編集が可能です。もしくはポート8001に対してコマンドを実行することでも設定が可能です。

例えば、特定のFIWARE Serviceコレクションの参照だけを許可するルーティング設定をする場合は、Kongのポート8001に対して次のコマンドを実行します。


$ curl -i -X POST http://localhost:8001/services \
  --data name=orion \
  --data host=orion \
  --data port=1026

$ curl -i -X POST http://localhost:8001/services/orion/routes \
  --data name=entity \
  --data paths[]=/v2/entities \
  --data methods[]=GET \
  --data strip_path=false \
  --data headers.Fiware-Service[]=smartcity

同一のdocker-compose.yamlマニフェスト内で宣言されたコンテナ間は、マニフェストで設定したコンテナ名で名前解決が実行可能です。Kongからリクエスト通知先であるService設定にはOrionコンテナを、リクエスト受信条件であるRoute設定には、パス、Service ID、メソッド、ヘッダーをそれぞれ指定します。この設定により、指定したAPIのみをインターネット公開することが可能になります。


$ curl -H "Fiware-Service: smartcity" localhost:8000/v2/entities
[{"id":"Room101","type":"Room","humidity":{"type":"Integer","value":55,"metadata":{}},"temperature":{"type":"Float","value":26.5,"metadata":{}}}]

今回の設定例では、Fiware-Serviceヘッダーを明示しないとKong Gatewayに設定したルーティングルールとはマッチしないためOrionにはリクエスト転送されずKongがNo Routeメッセージを返却します。


$ curl localhost:8000/v2/entities
{
  "message":"no Route matched with those values",
  "request_id":"a7c3953dd702e2642bb44b43723bd805"
}

最後に、クラウドサービス側の設定で、Kong Gatewayのポート8000だけをインターネット公開すれば、FIWARE Orionの特定の参照系APIだけをインターネット公開させることが可能です。まずはサーバー内部で動作確認から始め、状況に応じて公開範囲を検討してください。

 

エリア・データ連携基盤や推奨モジュールに関する質問は以下までお問合せください。
お問合せフォーム