AWS IoT Analyticsのパイプライン再実行における注意点

# AWS IoT Analyticsとは

## 本記事の内容

* AWS IoT Analyticsを使ってデータパイプラインの再実行を行う際には、場合によって最大59分の空白が発生することを理解しましょう。
* 対策として、2回目の再実行を行うことで空白を埋めることができます。

## AWS IoT Analyticsの概要

[AWS IoT Analytics](https://aws.amazon.com/jp/iot-analytics/)とは、AWSが提供するIoT関連サービスの中で最も水準の高い完全マネージドサービスです。IoTサービスの実現に必要な多くの要素、即ち

1. 生データの確実な保存および寿命管理
1. 処理済みデータの自動生成および履歴管理
1. 蓄積された生データに対する柔軟な再処理
1. パイプライン処理による自由度の高いデータ処理
1. [可視化基盤（Amazon QuickSight）](https://aws.amazon.com/jp/quicksight/)との統合
1. [機械学習基盤（Amazon SageMaker）](https://aws.amazon.com/jp/quicksight/)との緊密な連携

などを備えており、実用的なIoTシステムをごく短時間で構築することを可能にしています。

## AWS IoT Analyticsの概念図

AWS IoT Analyticsは概ね下記のような概念で表現することができます。

![AWS IoT Analytics 概念図](https://greennote-file-sharing.s3.ap-northeast-1.amazonaws.com/2022-10-08/2022100801.png "AWS IoT Analytics 概念図")

処理の流れとしては、単純化すると

1. 生データがAWS IoT Coreからルール経由でIoT Analyticsに投入される
1. 生データはいったん「チャンネル」により全件保存される
1. 保存されたデータは「パイプライン」に投入される
1. パイプラインに投入されたデータは、「アクティビティ」と呼ばれる処理を順番に施され、「データストア」に蓄積される
1. データストアはSQLライクな検索文によって検索することができ、結果は「データセット」として保存される

ということになります。それぞれ詳細な設定項目がありますが、ここでは言及しません。

## パイプラインの再実行とは何か

冒頭で述べたとおり、IoT Analyticsのパイプラインはいつでも再実行することが可能です。また、複数のパイプラインを並行して動作させることも可能で、同一の生データ群から多面的な処理結果が得られるようになっています。

![パイプライン再実行の概念図](https://greennote-file-sharing.s3.ap-northeast-1.amazonaws.com/2022-10-08/2022100802.png "パイプライン再実行の概念図")

このような構成を取ることにより、処理の誤りや不足に対して修正を加えた上で、（ユーザが削除していない限り）全ての生データに対して処理を再実行することが可能になっています。IoTの現場では、特に初期段階においてデータの解釈に誤りがあったり、記述に揺れがあったり、あるいは仕様そのものに不具合があるなどの理由で処理が失敗することが多々あります。そのような場合でも、問題の処理を拡張し、様々な問題を吸収できるようにすることで、生データを無駄なく最大限に活用することができるようになります。

### パイプライン再実行の実際

ここでは既にIoT Analyticsを用いたシステムが稼働しているものとします。パイプライン処理を再実行するには、IoT Analytics コンソールから「パイプライン」→ 再実行の対象となるパイプライン　を選択し、右上の「アクション」メニューから「メッセージの再処理」を選択します。

![パイプライン再実行](https://greennote-file-sharing.s3.ap-northeast-1.amazonaws.com/2022-10-08/2022100803.png "パイプライン再実行")

すると次のような画面が出現し、処理再実行の対象となる時間帯の選択に入ります。しかし、ここで大きな問題が発生します。

![パイプライン処理再実行範囲の設定](https://greennote-file-sharing.s3.ap-northeast-1.amazonaws.com/2022-10-08/2022100804.png "パイプライン処理再実行範囲の設定")

このスナップショットを撮影した時間は10月8日の22時前ですが、選択できる範囲は最大でも**当日の21時まで**となってしまっています。果たして21時から、処理を再実行した22時前までのデータはどうなってしまうのでしょうか。

### 問題発生！

結論から言うと、「21時から処理を再実行した時点までのデータは処理されず、空白期間となる」という動作になります。

![処理再実行による空白](https://greennote-file-sharing.s3.ap-northeast-1.amazonaws.com/2022-10-08/2022100805.png "処理再実行による空白")

### 対策

この現象自体は困った仕様なのですが、幸いにも比較的容易なワークアラウンドが存在します。それは空白期間について改めてパイプライン処理の再実行を行うことです。再実行の結果は上書きとなりますので、再実行の対象となる時間帯は正確に指定する必要はなく、大雑把に指定しても全く問題ありません。欠落部分を含む0分〜次の0分を指定すれば良いでしょう。

![上書きによるリカバリー](https://greennote-file-sharing.s3.ap-northeast-1.amazonaws.com/2022-10-08/2022100806.png "上書きによるリカバリー")

問題は2回目の処理再実行をいつ、どのように行うか、なのですが、多くの場合パイプライン処理の再実行は非定常処理になると思いますので、頻度を考えると

1. なるべく毎時0分より少し前に、初回の処理再実行を実施
1. 次の0分を過ぎたら、前の0分からの1時間を指定して2回目の処理再実行を実施

のようにすればよろしいのではないかと思っています。

## まとめ

* AWS IoT Analyticsを使ってパイプラインの再実行を行う際には、最大59分の空白が発生することがあります。
* 2回目の再実行を行ってデータの上書きを行うことで、問題なく空白を埋めることができます。

## 参考資料

<iframe src="//www.slideshare.net/slideshow/embed_code/key/4BZgOBEObJUlkC" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/ssuser72acd5/jawsug-iot-iot-analytics" title="JAWS-UG IoT専門支部 講演資料 IoT Analyticsによる構築事例説明" target="_blank">JAWS-UG IoT専門支部 講演資料 IoT Analyticsによる構築事例説明</a> </strong> from <strong><a href="//www.slideshare.net/ssuser72acd5" target="_blank">Akira Tateishi</a></strong> </div>