【新機能】コスト削減にも効果あり!AWS IoT SiteWise のバッファリング & バッチ処理された測定データ取り込みを試してみた

2024.01.15

今回は、昨年の re:Invent 直前にリリースされた SiteWise の下記リリースについて試してみたので、紹介したいと思います。

どんなアップデート?

これまでは SiteWise Edge (SiteWise ゲートウェイ)を使って、設備機器のデータを SiteWise に取り込む際は、リアルタイムな取り込み方法しかサポートしていませんでした。

今回のアップデートにより、指定した時間間隔でバッチ処理としてデータを取り込むことができるようになりました。
また、課金体系もバッファリングされたデータ取り込みの場合、メッセージは 5 KB 単位または複数のデータ ストリームにわたる 60 データ ポイントで測定されるため、同じ量のデータをリアルタイムで送る場合に比べて、メッセージングコストも抑えることができるようになりました。

メッセージングコストの詳細は下記ページをご確認下さい。
具体的な計算例は「Example 9」が該当します。

仕組み

今回のアップデートの仕組みは次のとおりです。

sitewise-buffered-diagram

  1. エッジ(SiteWise ゲートウェイ)側で指定期間のデータを保持(バッファリング)
  2. 指定時間が経過後、複数データをまとめて Parquet フォーマットで S3 に保存
    • この S3 バケットはユーザーマネージドのものになります。
  3. S3 に保存されたデータは SiteWise にロードされて保存される

直接 SiteWise に取り込まれるのではなく、S3 に一旦保存されてから取り込まれるというところがポイントになります。

なお、設定次第で次のようなことも可能です。特に 2 番目の設定では、おそらく SiteWise のメッセージングコストは発生しないように思うので、従来の SiteWise 課金に比べてコスト最適化に効果が期待できそうです。
(まだ未検証なので、改めて検証して紹介したいと思います)

  • SiteWise にロード後に S3 上のデータを自動削除
  • SiteWise にロードせず S3 にだけ保存

事前準備

「バッファリングされたデータの取り込み」は IoT SiteWise Publisher という Greengrass コンポーネントのバージョン「3.1.0」にてリリースされたものになります。
そのため、このコンポーネントを最新バージョン(2024 年 1 月)の「3.1.0」に更新しておく必要があります。

該当の記述は下記ドキュメントの変更履歴をご確認下さい。

やってみる

それでは、実際に設定の手順を確認してみます。
最初に SiteWise のコンソール画面から対象のゲートウェイをクリックします。(今回は SiteWiseGateWayTest というものになります)

50-1-select-gateway

ゲートウェイの詳細画面が開いたら、画面中程に「データソース」 という項目があるので、バッチ取り込みしたいデータソースを選択して「編集」ボタンをクリックします。
今回は localhost という名前のデータソースを選択しています。(送信先が「サイトワイズリアルタイム」となっていますね)

50-select-data-source-2

編集画面の「送信先」には 3 つの選択肢がありますが、今回は真ん中の「AWS IoT SiteWise buffered using Amazon S3」を選択します。

すると、その直下に設定画面が現れます。
ここで、次の 3 点を設定します。

  • S3 バケットの場所:バッファリングしたデータを置く S3 バケットの指定
  • データアップロード頻度:S3 へのアップロード間隔を指定します。1 分〜30 日 の間で選択します。
  • SiteWise のインポートの設定:バッファリングしたデータのインポート設定

SiteWise のインポート設定は次の組み合わせパターンがあります。要件に応じて設定します。
(今回は画面ショットのとおり、S3 にも残すようにしました)

パターン 結果
「SiteWiseストレージにデータインポート」「S3 からデータ削除」の両方にチェック S3 からデータ削除されて SiteWise にのみデータ保存
「SiteWise ストレージにデータインポート」のチェックのみ S3 と SiteWise の両方にデータ保存
「S3 からデータ削除」のチェックのみ 設定不可
全てチェックしない S3 にのみデータ保存

52-set-s3-2

設定できたらデバイスへの反映に少し時間がかかるかもしれません。下記の各「設定ステータス」が「同期中」になれば OK です。

53-publisher-sync-ok-2

動作確認

設定が終わって正常に OPC UA サーバからデータを取り込めていれば、指定した S3 バケットにデータが貯まっていくことが確認できます。
なお、この OPC UA サーバでは、各データポイントがバラバラのタイミングで 10 秒間隔でデータ生成するものになります。

54-s3-objects

フォルダは「年月日時」の階層構造になっており、いくつかのまとまった単位でファイルが生成されていきます。

55-se-objetcs-parquet

5分毎にファイルが増えていくのを確認できました。

56-after-5min-s3

SiteWise Monitor のダッシュボードでどう見えるのか確認してみました。こちらも指定間隔の 5 分おきに 5 分間のデータがババッとプロットされる動作となりました。

57-after-5min-sitewise-monitor

S3 上のデータの中身を確認

ざっくり動作が確認できたので、次は S3 上の parquet ファイルの中身を見てみます。
parquet 形式のデータを見るために、Mac に parquet cli をインストールしました。

brew install parquet-cli

Windowsは下記が参考になりそうです。(未確認です)

適当なファイルをいくつかダウンロードして中身を見てみました。
いくつかのデータがまとめて 1 ファイルになっていることを確認できました。今回、対象の OPC UA サーバ上のデータは全て不定期に出力するので、S3 上のファイルに含まれるデータ数やタイムスタンプに特に規則性は無いようでした。

$ parquet head parquet-data-2024-01-12-10-15.1705054508112.parquet | jq .
{
  "timestamp": 1705054500,
  "alias": "/Factory/1/turbin/2/RPM",
  "offsetInNanos": 793000000,
  "integerValue": null,
  "booleanValue": null,
  "stringValue": null,
  "doubleValue": 1325922839,
  "quality": "GOOD",
  "assetId": null,
  "propertyId": null
}
{
  "timestamp": 1705054500,
  "alias": "/Factory/1/turbin/1/RPM",
  "offsetInNanos": 791000000,
  "integerValue": null,
  "booleanValue": null,
  "stringValue": null,
  "doubleValue": 1019534805,
  "quality": "GOOD",
  "assetId": null,
  "propertyId": null
}
{
  "timestamp": 1705054500,
  "alias": "/Factory/1/turbin/1/Temperature",
  "offsetInNanos": 796000000,
  "integerValue": null,
  "booleanValue": null,
  "stringValue": null,
  "doubleValue": 30.36,
  "quality": "GOOD",
  "assetId": null,
  "propertyId": null
}
{
  "timestamp": 1705054500,
  "alias": "/Factory/1/turbin/2/Temperature",
  "offsetInNanos": 796000000,
  "integerValue": null,
  "booleanValue": null,
  "stringValue": null,
  "doubleValue": 40.51,
  "quality": "GOOD",
  "assetId": null,
  "propertyId": null
}
{
  "timestamp": 1705054500,
  "alias": "/Factory/1/turbin/1/Count",
  "offsetInNanos": 788000000,
  "integerValue": null,
  "booleanValue": null,
  "stringValue": null,
  "doubleValue": 0,
  "quality": "GOOD",
  "assetId": null,
  "propertyId": null
}
{
  "timestamp": 1705054510,
  "alias": "/Factory/1/turbin/2/Count",
  "offsetInNanos": 805000000,
  "integerValue": null,
  "booleanValue": null,
  "stringValue": null,
  "doubleValue": 19,
  "quality": "GOOD",
  "assetId": null,
  "propertyId": null
}
{
  "timestamp": 1705054510,
  "alias": "/Factory/1/turbin/1/Count",
  "offsetInNanos": 804000000,
  "integerValue": null,
  "booleanValue": null,
  "stringValue": null,
  "doubleValue": 2.0619429740964907,
  "quality": "GOOD",
  "assetId": null,
  "propertyId": null
}
{
  "timestamp": 1705054520,
  "alias": "/Factory/1/turbin/2/RPM",
  "offsetInNanos": 816000000,
  "integerValue": null,
  "booleanValue": null,
  "stringValue": null,
  "doubleValue": 1382381130,
  "quality": "GOOD",
  "assetId": null,
  "propertyId": null
}
{
  "timestamp": 1705054520,
  "alias": "/Factory/1/turbin/1/RPM",
  "offsetInNanos": 815000000,
  "integerValue": null,
  "booleanValue": null,
  "stringValue": null,
  "doubleValue": 671184236,
  "quality": "GOOD",
  "assetId": null,
  "propertyId": null
}
{
  "timestamp": 1705054520,
  "alias": "/Factory/1/turbin/1/Temperature",
  "offsetInNanos": 819000000,
  "integerValue": null,
  "booleanValue": null,
  "stringValue": null,
  "doubleValue": 71.33,
  "quality": "GOOD",
  "assetId": null,
  "propertyId": null
}

SiteWise 設定時にエラーが出る場合

今回の作業は SiteWise のマネジメントコンソール上で行ったのですが、S3 の設定を行う時に何度か次のようなエラーが表示されました。
下記のようにバケットの一覧を検索して設定できるようですが、この画面ではエラーが表示されて設定できなかったので、直接バケットの場所を記入しました。

200-ng-a3-list-denied

また、設定を保存しても画面上部に「Access Denied」と何度か表示されることがありました。
作業している IAM 権限的には問題ないはずだったので、コンソールからの API コールに何らかの権限が不足しているようですが詳細は不明です。

60-sitewise-gateway-update-ng

もし設定が反映されていなければ、エラーの表示を気にせず再度、設定し直してみてください。(私の場合は、それで設定できました)

SiteWise Monitor のグラフが崩れる場合

今回、データ表示の確認に SiteWise Monitor を利用しましたが、ダッシュボードをそのまま表示し続けていると、バッファリングしていたデータの表示がおかしくなることがあります。

58-sw-monitor-error

下記のように、5分間のデータのうち最初と最後のデータだけが表示されて、その間のデータが正常にグラフに反映されませんでした。

59-0705-0710

グラフ自体は指定間隔で更新(右から左に流れていく)されますが、バッファリングされたデータ表示はうまく反映されないようです。この場合はブラウザ自体をリロード(F5 キーなどでリフレッシュ)すれば正常にプロットされた状態で表示できました。

IAM設定

今回のバッファリング設定では、S3 バケットを利用しますが、特に権限追加などの作業は行う必要はありません。SiteWise の画面で S3 の設定を行うと自動的に、SiteWise デバイス用の IAM Role に権限が付与される為です。

下記は、該当の IAM Role で使われている IAM Policy の内容です。新しいバージョン(ここではバージョン12)が作成されて、該当バケットへの PutObject を許可するルールが追加されています。

09-2-policy-version

SiteWise の画面で別の S3 バケットに設定を変えても自動で追従されるので、ユーザーは IAM のことを気にしなくても構いません。

最後に

データ取り込みのフィルタリングなどと組み合わせることで、SiteWise の利用シーンが増えそうなアップデートであることが分かりました。
まだ気になる点がいくつかあるので、あらためてご紹介できれば思います。

以上です。