トラック・トラッカー: OpenShift およびその他の IBM Cloud サービスを使用した IoT パターン
IBM Cloudサービスを組み合わせて様々なインサイトを生み出す
トラック・トラッカーは、トラックが国内を移動する際にトラックからデータを受け取るサービスです。 例えば、燃料消費量、ドライバーの詳細、周囲温度など、クルージング中に計測できるものであれば何でもいい。 このポストの目的のために、トラックの ID と位置 (緯度経度の座標) になります。 トラック・トラッカーは、データをさまざまなデータ・ストアに保管し、トラックの現在位置をマップ上に表示します。
一部のアプリ・ユーザーは、分析を実行するためにこのデータを必要とします。 例えば、過去 24 時間にフリートが移動したマイル数や、フリートが消費した燃料量を調べることができます。 そのため、すべてのデータ・ポイントは、IBM Cloudant のような信頼性の高い文書ストアに保管することも、自由に検索および集約することもできます。IBM Cloudant は、高負荷のワークロード向けに最適化された、フル・マネージドの分散データベースであり、Web アプリケーションやモバイル・アプリケーションの急増に対応します。
その他のユーザーは、トラックが現在どこにあるかを知る必要がある場合があります。 このために必要なのは、各トラックの最後に確認された位置のみです。 この場合、Redis は完全なソリューションです。つまり、キーが固有のトラック ID であり、値が最後に認識された位置である、高速キー・バリュー・ストアです。
IBM Cloud® Databases for Redis は、データベース、キャッシュ、およびメッセージ・ブローカーとして使用できる、完全に管理されたメモリー内のデータ構造ストアです。
異なる方法でアクセスまたは保管する必要があるデータについては、他にも不明な使用法が存在する可能性があります。
トラックが国内を飛んでいて、データがそれらから流れ出ています。 How do you make sure everyone get the data they need? イベント発生時にイベントに対応できるスマート・アプリの作成を支援するイベント・ストリーミング・プラットフォームである IBM Event Streams を開始します。 これは、オープン・ソースの Apache の Kafka 上に構築されたフル・マネージド・サービスです。
Event Streams は、トラック (データ・プロデューサー) からデータを取り込み、それを使用するさまざまなアプリケーション (データ・コンシューマー) に提供することができます。
最後に、Truck Tracker サービスをどこかで実行する必要があります。そのために、Kubernetes クラスターでエンタープライズ・ワークロードをコンテナー化してデプロイするための迅速かつ安全な方法である Red Hat OpenShift on IBM Cloud を使用します。 Red Hat OpenShift on IBM Cloud クラスターをプロビジョンし、そのクラスターにアプリケーションをデプロイして、そのクラスターへのアクセスを必要とするデータベース・サービスで使用できるようにします。 また、地図上のトラックの位置を表示するための公開アプリケーションも作成します。 Red Hat OpenShift on IBM Cloud の詳細を読む。
作成するもの
これは私たちが構築するハイレベルなシステムです
実際のシナリオでは、データ生成プログラム (トラックの IoT デバイス) は、おそらく MQTT プロトコルを使用して、Event Streams アプリケーションと通信する方法を見つける必要があります。 国内を移動するトラックをシミュレートし、1 秒ごとにトラック・ロケーションを生成するスクリプト (producer.js) を使用してデータを送信します。これを行うには、事前定義された緯度/経度ペアの 2 つの「ロード・トリップ」(LAToDallas.jsonおよびboulderToNYC.json)
から読み取り、それを Event Streams にフィードします。
このチュートリアルを完了するには、約 1 時間かかります。 使用する一部の IBM サービスには無料枠が付属していないため、無料ではありませんが、サービスを完了した後にプロビジョン解除する場合は、数ドルを超える料金を支払う必要はありません。
必要になるもの
始める前に、必要な生産性向上ツールをいくつかインストールすることをお勧めします。
- IBM Cloud 従量課金アカウント (アカウントにログインしていることを確認してください。)
- IBM CLI - IBM API と対話するためのコマンド・ライン・インターフェース。 以下のプラグインがあることを確認する必要があります。
- OpenShift (oc)
- コンテナー・レジストリー (cr)
- Mac または Linux 端末にアクセスできることを確認します。
- Kubernetes CLI - Kubernetes クラスターに対してコマンドを実行するためのコマンド・ライン・インターフェース。
- Terraform - リソース・プロビジョニングを自動化します。
- Docker Docker を使用して、クラスター内でコードを実行するイメージを作成します。Docker アカウントにログインしていることを確認してください。
- jq - 軽量で柔軟なコマンド・ライン JSON プロセッサー
- Git - 無料のオープン・ソース分散バージョン管理システム
- Node.js および npm
ステップバイステップの説明
ステップ 1: アカウントにインフラストラクチャーをデプロイするための API キーを取得します
本書のステップに従って API キーを作成し、ステップ 2 の API キーをメモします。
ステップ 2: repo および cd を Terraform ディレクトリーに複製します
git clone https://github.com/IBM-Cloud/truck-tracker.git
cd truck-tracker/terraform
以下のフィールドを使用して、terraform.tfvarsという文書を作成します。
ibmcloud_api_key = "<YOUR_API_KEY_FROM_STEP_1>"
region = "eu-gb"
redis_password = "<MAKE_UP_A_PASSWORD>"
terraform.tfvars文書には、GitHub リポジトリーによって無視されるように、秘密にしておくことが必要な変数が含まれています。
ステップ 3: インフラストラクチャーを作成する
TL;DR - Terraform スクリプトを実行します。
terraform init
terraform apply --auto-approve
Terraform フォルダーには、いくつかの単純なスクリプトが含まれています。
main.tfは、IBM Cloud を使用するように Terraform に指示します。variables.tfには、値が terraform.tfvars から取り込まれる変数定義が含まれます。cloudant.tfは、標準 Cloudant DB と、後でそれにアクセスするために使用するいくつかの資格情報を作成します。redis.tfは、Redis インスタンスと、後でそのインスタンスにアクセスするために使用するいくつかの資格情報を作成します。eventstreams.tfは、Event Streams インスタンスと、後でそのインスタンスにアクセスするために使用するいくつかの資格情報を作成します。registry.tfは、コンテナー・イメージを保持する Container Registry を作成します。iam.tfは、Container Registry との対話に必要なアクセス・キーを作成します。vpc.tfは、OpenShift クラスターをデプロイするために必要な VPC (仮想プライベート・クラウド) インフラストラクチャーを作成します。 これには、3 つの異なるアベイラビリティー・ゾーンにある VPC、サブネット、およびパブリック・ゲートウェイが含まれます。cos.tfクラスターを管理するために OpenShift が必要とする単一の Cloud Object Storage インスタンスを作成します。openshift.tfは、アプリケーションをデプロイする VPC 内に仮想マシンのクラスターを作成します。
データベースおよびその他のリソースが作動可能になるまで数分かかりますが、コンテナー・イメージの Container Registry 名前空間だけでなく、いくつかの VPC リソース、仮想マシンのクラスター、IBM Cloud® Databases for Redis インスタンス、Cloudant データベース、および Event Streams インスタンスをアカウントに含める必要があります。 確認するには、IBM Cloud アカウントの「リソース」セクションにアクセスします。
ステップ 4: コンテナー・イメージを作成し、OpenShift にデプロイします
この時点で、すべてのインフラストラクチャーがデータを受信する準備が整います。 次に、データを生成して消費するさまざまなモジュールと、マップ上にトラックの位置を表示するアプリケーションを作成してデプロイする必要があります。
ビルド・スクリプトを実行します。ただし、実行する前に、IBM Cloud CLI および Docker にログインしていますか?
プロジェクトのルートに移動し、以下を入力します。
./build.sh
ステップ 5: トラックのトラック監視
スクリプトの終わりには、_https:// some.thing.eu-gb.appdomain.cloud_のような URL が出力されます。
生成された URL にアクセスすると、米国のマップが表示され、数秒後にトラックを表すいくつかのマーカーがマップ上に表示されます。
これらのマーカーの 1 つをズームインすると、そのマーカーが道路に沿って移動していることが分かります。 フリート・マネージャーとして、すべてのトラックがどこにあるかを知っています。
あなたがしたこと
build.sh スクリプト。
build.shスクリプトは、以下のようないくつかのことを行います。
- これにより、必要なサービスごとに Docker イメージが作成されます。 プロデューサー、コンシューマー、および Web アプリケーションは、すべて異なるフォルダーにあります。 各フォルダーには、スクリプトがコンテナー・イメージを作成するために使用する独自の単純な Dockerfile ファイルがあります。その後、このファイルは IBM Container Registry にアップロードされます。
- さまざまな IBM サービス (IBM Cloudant、Redis、および Event Streams) にアクセスするために必要なすべての資格情報を使用して、一連の kubernetes シークレットを作成します。
deployment.ymlスクリプトに含まれている手順を使用して、アプリケーション・コード (および秘密) を Red Hat OpenShift on IBM Cloud クラスターにデプロイします。
この deployment.yml スクリプトは、以下のようになります。
このスクリプトは、OpenShift クラスター内のマシンにデプロイする内容を OpenShift に指示します。 この場合は、以下のようになります。
- データ・プロデューサー (
trucktrackerproducer*)。 - データ・コンシューマー (
trucktrackerredisconsumerおよびtrucktrackercloudantconsumer) - Web アプリケーション (
trucktrackerweb)
いずれの場合も、コンテナー・レジストリーからイメージをプルし、外部サービスにアクセスするために必要な資格情報を一部の環境変数にフィードします。
トラック・トラッカー・システム
トラック・トラッカー・システムは、以下の 4 つのメイン・パッケージを使用する単純な Node.js スクリプトのセットです。
- @ibm-cloud/cloudant: IBM Cloudant に接続し、データの読み取り/書き込みを行います。
- Redis: Redis インスタンスに接続し、データの読み取り/書き込みを行います。
- kafkajs: Event Streams インスタンスに接続します。
- Express: データとの対話を可能にする単純な Web サーバーを有効にします。
以下の 5 つのメインファイルがあります。
server.js: Web サーバーを実行し、Redisと通信します。 フロントエンドから /data 経路への定期的な呼び出しが行われています。 Redis に接続し、各トラックの ID と位置を持つオブジェクトをダウンロードし、それをフロントエンドに返します。index.html: これは、フロントエンド・アプリケーションの唯一のページです。 ロードされると、素晴らしいオープン・ストリート・マップ・サービスから米国のマップが表示されます。 次に、バックエンド (server.js) に対して HTTP 要求を行い、すべてのトラックとその位置を取得し、それらをループしてマップ上に最新の位置をプロットする 5 秒間のループに入ります。 各トラックにはマップ・マーカーがあり、その緯度/経度はサイクルごとに更新されます。producer.js: これは、ロケーション・ファイルと、スクリプト呼び出しからのトラック ID を受け取り、ロケーション・ファイル内のすべてのデータ・ポイントをループします。 各データ・ポイントは、トラック ID と 緯度/経度 を含むメッセージに変換され、1 秒に 1 回 Event Streams にポストされます。 さらに楽しめるように、ルートに沿ってランダムな開始点を選択し、ロケーション・ファイルの終わりに達すると元に戻ります。cloudantConsumer.js: このスクリプトは、まだ存在していない場合は Cloudant に動かないトラッカー・データベースを作成し、さらにデータがないかどうか定期的に Event Streams をポーリングします。 データが入ってくると、Cloudant に大量のデータが書き込まれます。redisConsumer.js: このスクリプトは、定期的な間隔で Event Streams をポーリングしてデータを取得します。 データが到着すると、データは Redis の「ハッシュ」に書き込まれます。ここで、ハッシュ・キーはトラック ID、値はトラック・データ (緯度/経度) です。 このハッシュ配置により、すべてのトラック・データを server.js スクリプトによって一度にプルすることができます。 優れた点は、何らかの理由でコンシューマーの 1 人が異常終了した場合、Event Streams が各コンシューマーに提供した最後のデータ・ポイントを認識しているため、データを失うことなく、中断した場所から再開されることです。 このようにデータを消費するシステムからデータを生成するシステムを分離することは、レジリエンシーとフォールト・トレランスを向上させる優れた設計手法です。
要約
このチュートリアルでは、多数の IBM サービスを組み合わせて、現実的な IoT パターンをモデル化しました。このパターンでは、トラック上のインターネット対応デバイスが、さまざまなアプリケーションによってさまざまな目的で消費されるデータを生成します。
これらすべてのサービスの管理された性質により、お客様はアプリケーション開発者としてビジネス上の問題の解決に集中することができ、お客様の代わりにインフラストラクチャーを管理するという重い手間を省くことができます。これにより、サーバー・プロビジョニング、ソフトウェア・デプロイメント、パッチ適用、セキュリティーなどの非コア・アクティビティーの作業を数カ月節約できます。
このチュートリアルに従った場合は、料金の発生を防ぐために、必ずインフラストラクチャーをプロビジョン解除してください。 端末で、以下を行います。
cd terraform/
terraform destroy
開発者としての道程における次のステップに進むには、評価版オファーのいくつかを確認してください。