フリートインデックス

フリートインデックスはレジストリやシャドウ、接続状況をインデックスし、検索できるようにするためのマネージドサービスです。フリートインデックスが設定されると、全てのレジストリとシャドウの更新が管理されるようになります。バックエンドでは有名なオープンソースの検索エンジンである Apache Lucene が使われていて、これらのデータを簡単なクエリで検索することができます。

ここでは、レジストリを検索し、デバイスに関する多くの情報がシンプルな1つのクエリで取得できることを確認できます。

Exercise 1 - レジストリとシャドウ

3-1. Bulk Device Provisioning で作成したディレクトリへ移動します。

# YYYY-mm-dd_H-M-S部分はTabで補完して、対象のディレクトリに移動してください
cd bulky-$NAME-YYYY-mm-dd_H-M-S

例えば、あなたは各部屋に温度センサが設置されたビルの管理者であると仮定しましょう。あなたは、空調がよく効いていない部屋を見つけるために、室温が20度以上の部屋の一覧を取得したいです。

ここでは、先ほどバルクで作成したデバイス群に対して、温度センサーの情報をデバイスシャドウに追加し、部屋番号をデバイスの属性に紐付けます。

なお、レジストリのインデックスは前の手順ですでに有効化しています。

以下のスクリプトを実行すると、温度センサーの情報がデバイスシャドウに、ビル名と部屋番号がデバイスの属性に追加されます。スクリプトの引数に、先ほど作ったデバイス名の接頭辞(bulky-$NAME)を指定しています。

# 環境変数の値を確認
echo "bulky-$NAME"

# シャドウと属性を設定
fleet-indexing.py -b bulky-$NAME

変更がうまくいったかを確認しましょう。バルクでプロビジョニングした全デバイスが building, room_number という属性を持ち、温度情報(temperature)がシャドウに格納されていることを確認します。

aws iot search-index --query-string "thingName:bulky-$NAME*"

属性に部屋番号がされており、温度が20度を超えるのデバイスを検索するには、以下のクエリを実行します。

aws iot search-index \
--query-string "shadow.reported.temperature>20 AND attributes.room_number:* AND thingName:bulky-$NAME*"

AWS IoT Core コンソール(https://console.aws.amazon.com/iot/) からもシャドウドキュメントを確認できます。

  1. AWS IoT Core コンソールへアクセス
  2. 管理 -> モノ
  3. モノをクリック
  4. シャドウ -> シャドウステータスから確認

Exercise 2 - 接続状況のインデックス

デバイスの接続状況を知りたい場合は、接続状況のインデックスを利用します。前の手順で接続状況のインデックスはすでに有効化しています。

バルクで作成したデバイスのうち、1つのデバイスでMQTTのメッセージを発行しましょう。 mosquitto_pub コマンドを利用すると AWS IoT に接続し、メッセージを発行後に切断します。

まずはデバイスをレジストリから参照してみましょう。

# 作成されたデバイスから1つの名前を選びましょう
THING_NAME=bulky-$NAME-PoC-1

aws iot search-index --index-name "AWS_Things" --query-string "thingName:$THING_NAME"

デバイスが未接続の場合は、things.connectivity.connected の値が false になっているはずです。

それでは、サブスクライバーとしてデバイスを AWS IoT へ接続しましょう

mosquitto_sub --cafile ~/root.ca.bundle.pem \
  --cert $THING_NAME.crt --key $THING_NAME.key \
  -h $IOT_ENDPOINT -p 8883 -q 0 -t iot/ws \
  -i $THING_NAME --tls-version tlsv1.2  -d

Cloud9 で別のターミナルを開き、NAME, THING_NAME の環境変数を再度設定します。

image

NAME=[YOUR_NAME]  # 例: NAME=watanabe
THING_NAME=bulky-$NAME-PoC-1

以下のコマンドを実行し、再度デバイスの情報を参照すると、things.connectivity.connected の値が true に変わっていることが確認できます。 なお、接続状況が更新されるまでには、少し時間がかかります。

aws iot search-index --index-name "AWS_Things" --query-string "thingName:$THING_NAME"

また connectivity には timestamp の値も含まれていますので、いつ connected の値が設定されたかを確認してみましょう。

date -d @$(([YOUR_TIMESTAMP] / 1000)) のコマンドでタイムスタンプを日時に変換することができます。例えば 1570149211827 に対してコマンドを実行すると以下のようになります。

date -d @$((1570149211827/1000))
Fri Oct  4 00:33:31 UTC 2019

また、以下のコマンドも試してみましょう。

接続中の全てのデバイスを検索。

aws iot search-index --index-name "AWS_Things" --query-string "connectivity.connected:true"

切断中の全てのデバイスを検索。

aws iot search-index --index-name "AWS_Things" --query-string "connectivity.connected:false"

Exercise 3 - フリートの統計情報を取得

GetStatistics API を利用すれば、 検索結果の総数と、平均、最大、最小、分散などの統計情報を調べることができます。

例えば以下のコマンドを実行してみましょう。

接続中のデバイスの台数を取得。

aws iot get-statistics --query-string "connectivity.connected:true"

以下のような結果が表示され、statistics.count に接続中のデバイス台数が表示されます。

{
    "statistics": {
        "count": 1,
        "average": 3.0,
        "sum": 3.0,
        "minimum": 3.0,
        "maximum": 3.0,
        "sumOfSquares": 9.0,
        "variance": 0.0,
        "stdDeviation": 0.0
    }
}

続いて、デバイスの温度の最大値、最小値、平均値などの統計情報を表示します。

事前準備として、 Shadow の temperature の値を Number 型として、スキーマのカスタムフィールドに設定しておきます。

aws iot update-indexing-configuration \
--thing-indexing-configuration "thingIndexingMode=REGISTRY_AND_SHADOW,thingConnectivityIndexingMode=STATUS,customFields=[{name=shadow.reported.temperature,type=Number}]"

以下のコマンドを実行して、温度が25度以下のデバイスの総数と、それらのデバイスの温度の最大値、最小値、平均値などの統計情報を表示します。

aws iot get-statistics --aggregation-field "shadow.reported.temperature" --query-string "shadow.reported.temperature<=25"

以下のような結果が表示され、クエリに合致したデバイスの温度の平均値 average、最大値 maximum、最小値 minimum、標準偏差 stdDeviation などを確認することができます。

{
    "statistics": {
        "count": 4,
        "average": 16.75,
        "sum": 67.0,
        "minimum": 15.0,
        "maximum": 18.0,
        "sumOfSquares": 1127.0,
        "variance": 1.1875,
        "stdDeviation": 1.0897247358851685
    }
}

最後に mosquitto_sub を実行しているターミナルに戻って Ctrl + C を実行し、サブスクライバーを停止しましょう。