DX(デジタルトランスフォーメーション)の進展で存在感を増すGoogle Cloud。これを採用した、クラウドネイティブなアーキテクチャーのシステム構築とはどのようなものか。前回に続き、架空のドライブレコーダー専業メーカーC社が運転動画・運転特性の分析システムを構築するシナリオに沿って、Google Cloudを使ったIoT(インターネット・オブ・シングズ)・機械学習システムの構築方法を示す。
C社の運転動画・運転特性の分析システムは(1)機械学習を用いた分析、(2)ドライブレコーダーからのデータアップロード、(3)サムネイル生成などのイベントトリガー(イベント駆動)処理、(4)ウェブアプリケーションという大きく4つの機能で構成されている。前々回と前回で(1)機械学習を用いた分析、(2)ドライブレコーダーからのデータアップロードについて解説した。
今回は(3)サムネイル生成などのイベントトリガー処理、(4)ウェブアプリケーションを順に設計する。
開発するイベントトリガー処理には署名付きURLの発行のほかに、サムネイル画像の生成処理がある。動画がアップロードされたことをトリガーに処理を開始し、ウェブアプリケーションで表示するためのサムネイル画像を作成、ストレージへ保存、動画とサムネイル画像に関する情報をデータベースに書き込むまでの一連の処理を行う。
交通事故発生時などはウェブアプリケーションから動画データを迅速に確認する必要があるため、動画のアップロードが完了してから数分以内でサムネイル画像を生成し、ウェブアプリケーション上に表示する必要がある。
イベントトリガー処理のサービス選定のポイント
イベントトリガー処理に利用できるGoogle Cloudのサーバーレスサービスには、コンテナ化されたアプリケーションのサーバーレス実行環境であるCloud Runと、イベント駆動型コード実行サービスのCloud Functionsがある。処理ごとに利用するサービスを分けると学習コストが高くなるだけでなく、サービスごとに新機能や仕様変更の確認・取り込み対応といった運用負荷も高くなるため、利用するサービスは極力統一すべきだと考えた。
今回はCloud RunとCloud Functionsの2つのサービスが候補となったが、(a)トリガーとして利用可能なイベントソースの充実度、(b)トリガー連携部分の実装および運用負荷の低さの2点をポイントにサービスを選定した。
(a)のイベントソースの充実度は今後の拡張性や追加要件への対応のしやすさを考慮した観点である。Cloud FunctionsがHTTP、Cloud Storage(オブジェクトストレージ)、Cloud Pub/Sub(メッセージングサービス)、Cloud Firestore(NoSQLデータベース)、Firebase(モバイル・バックエンド・アズ・ア・サービス)のイベントをサポートするのに対して、Cloud RunはGoogle Cloudのイベント連携サービスであるEventarcと組み合わせることでCloud Audit Logs(監査ログサービス)ベースのイベントトリガーが可能となるため、実質ほぼ全てのGoogle Cloudサービスのイベントをサポートできる。
(b)の実装負荷についてはどちらのサービスも簡単に実装可能であるが、Cloud Functionsはトリガーとなるイベント情報をCloud Functions自身が保持するため、イベントと処理が密結合となり汎用性が低い。それに対してCloud Runはトリガーとなるイベント情報をCloud Run自身は保持せず、Eventarc側に設定を集約できるため、イベントと処理が疎結合になり汎用性が高いというメリットがある。これらのポイントを考慮し、イベントトリガー処理にはCloud Runを採用することとした。
署名付きURLの発行処理は、Cloud IoT Core(IoTデバイスの管理やデータの送受信に特化したサービス)で受け取ったイベント情報をCloud Pub/Subを介してEventarcに連携し、EventarcがCloud Storageの署名付きURLを発行するCloud Runをトリガーする構成とした。Cloud Runは署名付きURLを発行し、Cloud IoT Coreに対してURL情報を連携する。
サムネイル生成処理はCloud StorageにファイルがアップロードされたことをCloud Audit Logsが検知し、イベント情報をEventarcに連携する構成とした(図1)。Eventarcはサムネイル作成用のCloud Runをトリガーし、サムネイル画像の生成、生成されたサムネイル画像をCloud Storageに格納、Firestore(Datastoreモード)に対して動画とサムネイル画像に関する情報の書き込みを行う。