Amazon Web Services ブログ

AWS IoT Device Management フリートインデックスを使用してデバイスの集約情報を取得する

AWS IoT Device Management のフリートインデックスは、機器の集約情報を取得するために、GetStatistics、 GetPercentilesGetCardinality の3つのAPIを提供開始しました。これらのAPIを使用すると、次のような質問にすばやく回答できます。AWSIoTに接続しているデバイスの割合はどのくらいですか?デバイスのバッテリーレベルの最大値、最小値、平均値はいくつですか?OSバージョンは現在何種類ありますか?

この投稿では、データセンターの温度監視シミュレーションについて説明し、フリートインデックス APIを使用してデバイスの集約情報を取得する方法を理解します。データセンターには、サーバーの温度を監視する多くのセンサーがあります。GetStatistics によって最小/最大/平均温度を取得する方法を学習します。GetPercentiles を使って温度の90パーセンタイルを取得します。また、GetCardinality を使って異常な温度のサーバーラックの数を取得します。

セットアップ

AWS IoTに接続された10個の温度センサーが、6つのサーバーラックに搭載されたデータセンターを運用していると仮定します。一部のセンサーは異常な温度を報告しています。以下のスクリプトを使用して、センサーを表す10個のモノを作成しましょう。各モノには3つの属性があります。

  • temperature:数値型 – 華氏の温度値
  • rackId:文字列型 – センサーが属するサーバーラックのID。Rack1からRack6。
  • stateNormal:ブール型 – 温度値が正常範囲内: [60〜80] にあるかどうかを示します。Rack5とRack6は異常な状態です。
# Bash script. If in other shells, type `bash` before running

Temperatures=(70 71 72 73 74 75 47 97 98 99)
Racks=(Rack1 Rack1 Rack2 Rack2 Rack3 Rack4 Rack5 Rack6 Rack6 Rack6)
IsNormal=(true true true true true true false false false false)

for ((i=0; i<10 ; i++))
do
  thing=$(aws iot create-thing --thing-name "TempSensor$i" --attribute-payload attributes="{temperature=${Temperatures[i]},rackId=${Racks[i]},stateNormal=${IsNormal[i]}}")

  aws iot describe-thing --thing-name "TempSensor$i"
done

これらのセンサーの集約情報を取得するには、フリートインデックス作成を有効にし、 UpdateIndexingConfigurationAPI で集約するフィールドを定義する必要があります。以下のサンプルコードの、thing-indexing-configuration によってモノのインデックス方法を定義します。

  • thingIndexingMode: “OFF”|”REGISTRY”|”REGISTRY_AND_SHADOW” のいずれか。ここでREGISTRYとは、フリートインデックスがモノのレジストリデータのみをインデックスすることを意味します。
  • customFields:フィールド名と型のペアのリスト。フィールドに対して集計クエリを実行するには、インデックス設定を設定するときにフィールド名と型を含める必要があります。しかし、これは thingNamethingIdregistry.version のようなAWS IoTが管理するフィールドには適用されません。AWS IoT が管理するフィールドは、デフォルトで集計クエリをサポートしています。
aws iot update-indexing-configuration --thing-indexing-configuration "thingIndexingMode=REGISTRY,customFields=[{name=attributes.temperature,type=Number},{name=attributes.rackId,type=String},{name=attributes.stateNormal,type=Boolean}]"

インデックス作成を有効にすると、フリートインデックスは AWS_Things と呼ばれるインデックスを作成します。インデックスは最初に BUILDING もしくは REBUILDING の状態になります。既存のモノのインデックスが作成されると、インデックスの状態が ACTIVE に変化し、クエリの準備が整います。10 個のモノがある場合、数秒から1分程度でインデックスは ACTIVE になります。次のコマンドでインデックスの状態を確認できます。

aws iot describe-index --index-name "AWS_Things"

Result:
{
    "indexName": "AWS_Things",
    "indexStatus": "ACTIVE",
    "schema": "REGISTRY"
}

集計クエリを実行する

インデックスが ACTIVE になると、GetStatisticsAPI を使用してすべての温度センサーの統計を監視できます。

  • aggregation-field は集約するフィールドを指定します。集約できるのは UpdateIndexingConfiguration で定義されたカスタムフィールドか AWS IoT の管理するフィールドのみです。
  • query-string でクエリ条件に一致するものにフィルターを定義します。
aws iot get-statistics --aggregation-field "attributes.temperature" --query-string "thingName:TempSensor*"

Result:
{
    "statistics": {
        "count": 10,
        "average": 77.6,
        "sum": 776.0,
        "minimum": 47.0,
        "maximum": 99.0,
        "sumOfSquares": 62578.0,
        "variance": 236.04000000000013,
        "stdDeviation": 15.36359332968691
    }
}

最高温度と最低温度は 99 と 47 です。これは、一部のセンサーが異常を読み取っていることを示しています。分布をよりよく理解するために、GetPercentiles を活用できます。この機能は、確率と非超過フィールドの値のペアのリストを返します。たとえば、次の結果には {percent:90.0, value:98.1} という値が含まれます。これは、温度値の 90% が 98.1 未満であることを意味します。percents という引数で、返すパーセンタイルのリストを定義します。GetPercentiles は近似結果が返すことにご注意ください。より大きな集計セットを使うことで、より正確な推定値を得ることができます。

aws iot get-percentiles --aggregation-field "attributes.temperature" --query-string "thingName:TempSensor*" --percents 10 25 50 75 90

Result:
{
    "percentiles": [
        {
            "percent": 10.0,
            "value": 67.7
        },
        {
            "percent": 25.0,
            "value": 71.25
        },
        {
            "percent": 50.0,
            "value": 73.5
        },
        {
            "percent": 75.0,
            "value": 91.75
        },
        {
            "percent": 90.0,
            "value": 98.1
        }
    ]
}

上記の2つの結果を組み合わせて、いくつかのセンサーが異常を検出していると結論付けることができます。その中で、ほとんどが高温を報告しています。GetCardinality を使用すると、温度の問題が1つの場所(1つまたは2つのラック内)で発生しているか、データセンター全体(すべてのラック)で発生しているかをすばやく確認できます。GetPercentiles と同様に結果は推定値であり、データ規模が大きくなるとで精度が向上します。以下の結果は、2つのラックのみが異常な温度になっていることを意味します。

aws iot get-cardinality --aggregation-field "attributes.rackId" --query-string "thingName:TempSensor* AND attributes.stateNormal:false"

Result:
{
    "cardinality": 2
}

すべてのラックの中で、Rack6 には他のラックよりも多くのサーバーがあることを知っていると仮定しましょう。GetStatistics を使用して、Rack6のステータスをすばやく確認できます。以下の結果から、平均温度が 98.0 であるため、Rack6 の温度が高すぎることを確認できます。

aws iot get-statistics --aggregation-field "attributes.temperature" --query-string "thingName:TempSensor* AND attributes.rackId:Rack6"

Result:
{
    "statistics": {
        "count": 3,
        "average": 98.0,
        "sum": 294.0,
        "minimum": 97.0,
        "maximum": 99.0,
        "sumOfSquares": 28814.0,
        "variance": 0.6666666666666666,
        "stdDeviation": 0.816496580927726
    }
}

問題に対応した後、47 という低い温度値を SearchIndex という別のフリートインデックス API で調査できます。このAPIは、クエリ文字列を満たすすべてのモノを返します。以下の結果に基づいて、低い値はTempSensor6からのものであり、Rack5でアクションが必要であることがわかります。

aws iot search-index --query-string "thingName:TempSensor* AND attributes.temperature<60"

Result:
{
    "things": [
        {
            "thingName": "TempSensor6",
            "thingId": "45b45d4e-ad95-495f-828e-47df5454ab7c",
            "attributes": {
                "rackId": "Rack5",
                "stateNormal": "false",
                "temperature": "47"
            }
        }
    ]
}

クリーンアップ

作成したリソースが不要になった場合、次のスクリプトを使用してすべてのモノを削除できます。

for ((i=0; i<10; i++))
do
  aws iot delete-thing --thing-name "TempSensor$i"
done

デバイスが常にクエリで検索できるように、フリートインデックスを有効にしておくことをお勧めします。必要に応じて、次のコマンドを使用してモノのインデックス作成をオフにできます。

aws iot update-indexing-configuration --thing-indexing-configuration thingIndexingMode=OFF

まとめ

AWS IoT Device Management のフリートインデックス API を使用して、デバイスで集約クエリを実行する方法を説明しました。これらの API は、モノグループの集約でも機能します。前提条件は、フリートインデックス作成を有効にし、UpdateIndexingConfigurationAPI で集約するフィールドを定義することです。

集計クエリの実行時に、以下の引数を使用します。

  • query-string でクエリ条件に一致するものをフィルタリングします。
  • aggregation-field で集計するフィールドを指定します。集約できるのは UpdateIndexingConfiguration で定義されたカスタムフィールドか AWS IoT の管理するフィールドのみです。

クエリとフィールドを以下の API に渡します。

  • GetStatistics はフィールド値の基本統計(count / avg / sum / min / maxなど)を返します。
  • GetPercentiles はパーセンタイルとフィールドの値のペアの推定リストを返します。各ペアは、モノのフィールドの値が指定されたフィールドの値を超えないパーセンタイル確率を示します。
  • GetCardinality は値がユニークなフィールド数の推定値を返します。

もっと詳しく知る

フリートインデックスは、AWS IoT Device Management 内の機能です。集約データのクエリとは別に、AWS IoT Device Management は、接続されたデバイスを大規模に登録、整理、監視、およびリモート管理するためにはるかに多くの機能を提供します。

AWS IoT フリートインデックス Documentation
https://docs.aws.amazon.com/iot/latest/developerguide/iot-indexing

AWS IoT Device Management
https://aws.amazon.com/iot-device-management

AWS IoT Device Management の機能
https://aws.amazon.com/iot-device-management/features

 

原文はこちら
翻訳はソリューションアーキテクト 三平が担当しました。