シナリオ: オブジェクト・ストレージからのバッチ・データの取込み
OCI Object Storageから順次CSVオブジェクトをダウンロードし、Node-REDの各バッチ・レコードを変換してOCI IoTに取り込みます。
このシナリオを使用して、オブジェクト・ストレージから順次CSVオブジェクトをダウンロードし、オフラインまたは履歴の読取りをOCI IoTにリプレイして、デジタル・ツイン履歴を完全な状態に保ちます。Node-REDフローはInject -> Prepare Filename -> Object Storage Download -> Increment Index -> CSV -> Transform -> MQTT-OUTです。
このシナリオでは、各CSVファイルはフローがオンデマンドでダウンロードおよび処理する個別のオブジェクトであるため、オブジェクト・ストレージを使用します。フローで、マウントされたファイル・システム・パスを介して使用可能な共有ファイルが必要な場合は、File Storageを使用します。ファイル・ストレージまたはオブジェクト・ストレージの選択を参照してください。
開始する前に、一般的なシナリオ設定を完了してください。
タスク
前提条件
バッチCSVオブジェクトのオブジェクト・ストレージ・バケットを作成します。オブジェクト・ストレージ・ネームスペースおよびバケット名を記録します。フロー・ランタイム動的グループを作成し、オブジェクト・ストレージ・ノードで使用されるリソース・プリンシパル構成に、バケットからオブジェクトをダウンロードするために必要なオブジェクト・ストレージ読取りポリシーがあることを確認します。
フロー・ランタイムは、オブジェクト・ストレージおよびOCI IoTデバイス・ホストに到達できる必要があります。
ステップ1: IoTフロー・ランタイムの作成
ステップ2: バッチCSVオブジェクトのアップロード
インポートまたは手動構成パスの選択
このシナリオを手動ですでに作成している場合は、JSONをインポートする必要はありません。インポートしたコピーと手動で作成したコピーの両方をデプロイしないでください。重複した読取りを取り込むことができます。
ステップ3: このシナリオのJSONフロー・ファイルのインポート
OCIコンソールから開いた管理対象ノード-REDエディタには、この例に必要なOCIノードが含まれます。
インポートにより、オブジェクト・ストレージからバッチ・データを取り込むというフロー・タブとその構成ノードが作成されます。前述のステップおよび共通設定で必要なバケット、アクセス・ポリシーまたはデジタル・ツイン・リソースは作成されません。MQTT資格証明は、エクスポートされたJSONに含まれません。
ステップ4: ノード-REDフローの確認および構成
例をインポートした場合は、次のステップを使用して既存のノードをレビューおよび調整します。フローを手動で構築する場合は、ノードを追加および接続してから構成してください。
エクスポートされた完全フローJSONファイルの操作
ダウンロード可能なシナリオをインポートするには、ステップ3: このシナリオのJSONフロー・ファイルのインポートを使用します。エクスポートされた別のフロー・ドキュメントの場合は、次のエディタ・ステップを使用します。CLIおよびAPIメソッドは、ランタイムの完全なフロー・ドキュメントを置き換えます。
- フロー・ランタイム・エディタを開きます。エディタの検索に関するヘルプが必要な場合は、IoTフロー・ランタイムの詳細の取得を参照してください。
- ノード-REDエディタで、メイン・メニューを開き、「インポート」を選択します。詳細は、Node-REDのインポートのドキュメントを参照してください。
- エクスポートしたフロー・ドキュメントを貼り付けるか、そのファイルを選択して、「インポート」を選択します。
- インポートされたノードと接続を確認し、「デプロイ」を選択します。
完全なフロー・ドキュメントを置換するには、
oci iot flow-runtime update-flowsコマンドを使用します。oci iot flow-runtime update-flows \ --iot-flow-runtime-id <flow-runtime-ocid> \ --flows-document file://<path-to-flows-json>ノート
このコマンドは、完全なフロー・ドキュメントを置き換えます。バックアップが必要な場合は、最初に現在のドキュメントを取得して保存します。詳細は、IoTフロー・ランタイムのフローの更新を参照してください。
完全なフロー・ドキュメントを置き換えるには、UpdateIotFlowRuntimeFlows操作を実行します。
PUT /20250531/iotFlowRuntimes/{iotFlowRuntimeId}/flows <complete-Node-RED-flows-document>エクスポートされた完全なNode-REDフロー・ドキュメントをリクエスト本文として渡します。同期操作ではフロー・ドキュメントが返され、作業リクエストは作成されません。
ノート
この操作により、完全なフロー・ドキュメントが置換されます。バックアップが必要な場合は、最初に現在のドキュメントを取得して保存します。
ステップ5: フローのデプロイと実行
ステップ6: バッチ・データ収集の検証
トラブルシューティング
- オブジェクト・ストレージ・ネームスペース、バケット名、シーケンシャル・オブジェクト名およびリソース・プリンシパル構成を確認します。
- オブジェクト・ストレージ・ノードで、「出力のダウンロード」 = 「テキスト」および「エンコーディング」 =
UTF-8が使用されていることを確認します。CSVノードはテキストを直接受信します。 - 「デバッグ」サイドバーの「OSノード・エラー・キャッチ」でオブジェクト・ストレージのエラーを確認し、「MQTT入力」でメッセージを変換します。検証後に無効化した場合は、デバッグ・ノードを再度有効にします。
- 次のポーリングの前に
iot-data-<counter>.csvが存在することを確認します。カウンタは、ダウンロードが成功した後にのみ進みます。 - CSVデリミタおよび1行目の列名がサンプルと一致することを確認します。
- 各行に、サポートされている
deviceType、一致する外部キーおよび数値のソース・タイムスタンプが含まれていることを確認します。 - MQTTデバイス・ホスト接続、ゲートウェイ資格証明、アダプタ・マッピングおよびターゲット・デジタル・ツイン・ライフサイクルの状態を確認します。
詳細は、「IoTフロー・ランタイムのトラブルシューティング」を参照してください。
FAQ
- CSVオブジェクト名でカウンタを使用するのはなぜですか。
- フローは、
iot-data-1.csvやiot-data-2.csvなどの予測可能な順序を処理します。カウンタは、正常にダウンロードされた後にのみ進行するため、オブジェクトは順番に処理されます。 - Object Storageノードがリソース・プリンシパルを使用するのはなぜですか。
- フロー・ランタイムは、フローにユーザー資格証明を格納せずに、承認済バケットにアクセスできます。動的グループおよびポリシーは、必要な読取りアクセス権を付与する必要があります。
- 次の順次オブジェクトが存在しない場合はどうなりますか。
- ダウンロードに失敗し、カウンタは変更されません。フローを再度トリガーする前に、予期されるオブジェクトをアップロードするか、ネームスペース、バケット、接頭辞およびカウンタを修正してください。
- Object Storageノードがオブジェクトをテキストとしてダウンロードする理由
- CSVノードにはテキスト入力が必要です。UTF-8エンコーディングでダウンロード出力をテキストに設定すると、その入力が直接提供されます。index-increment関数はカウンタを先に進め、処理されたオブジェクト名を記録するだけです。
- 最初のCSVオブジェクトからテストを再開するにはどうすればよいですか。
- インジェクト・ノードの繰返し間隔を無効にしてから、
flow.set("iotFileIndex", 1); return msg;を含む同じフロー・タブに一時関数ノードを追加します。手動でトリガーされた別のインジェクト・ノードをそのファンクション・ノードにのみ接続します。カウンタをリセットするために1回デプロイおよびトリガーしてから、両方の一時ノードを削除し、再度デプロイします。シナリオのInjectノードをトリガーして、iot-data-1.csvを再度処理します。これにより、すでに取り込まれた検針がリプレイされます。テストを繰り返す場合にのみ使用してください。