【新機能】AWS IoT Analytics向けの新しいGreengrassコネクタがリリースされました!!

AWS IoT Analytics向けの新しいGreengrassコネクタを試してみました
2019.03.16

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

サーバーレス開発部@大阪の岩田です。 昨日3月15日にAWS IoT Analytics向けの新しいGreengrassコネクタがリリースされました!! AWS IoT Greengrass Adds New Connector for AWS IoT Analytics, Support for AWS CloudFormation Templates, and Integration with Fleet Indexing

このコネクタを利用することでGreengrassグループが収集したデータを簡単にAWS IoT Analyticsまで送信できます。 さっそく試してみたいと思います。

AWS IoT Analyticsの環境を準備

市田のブログで紹介されている「Quick Create」の機能を使ってAWS IoT Analyticsの環境をサクっと準備します。

AWS IoT Analyticsのシングルステップ セットアップで簡単にIoTデータの分析環境を作成できるようになりました

Greengrassグループに紐付けたIAMロールに権限追加

このコネクタはAWS IoT AnalyticsのPutBatchMessage APIを利用してデータを送信するため、Greengrassグループが利用するIAMロールにiotanalytics:BatchPutMessageの権限が必要になります。

ここでは手っ取り早くAWSIoTAnalyticsFullAccessのポリシーをアタッチしました。

データ収集用のLambdaを準備

Greengrassで実行するLambdaを準備します。 このLambdaをLong-Lived Lambdaとして実行することで、5秒に1回デバイスから温度の情報をPublishするような処理をシミュレーションします。 Python2.7で実装しました。

import greengrasssdk
from datetime import datetime
from threading import Timer
import json
import os
import random
import uuid

client = greengrasssdk.client('iot-data')

def greengrass_pub_run():

    data= {
        'id' : str(uuid.uuid4()),
        'request':{
            'message': json.dumps({
                'thingname': os.getenv('AWS_IOT_THING_NAME'),
                'datetime': str(datetime.now()),
                'temperature': round(random.uniform(0,30),2)
            })
        }
    }
    topic = 'iotanalytics/channels/myfirstproject_channel/messages/put'
    client.publish(topic=topic, payload=json.dumps(data))
    Timer(5, greengrass_pub_run).start()


greengrass_pub_run()

def handler(event, context):
    return

ポイントをいくつか説明します。

Publish先のトピック名

GreengrassからデータをPublishする先のトピック名は

  • iotanalytics/channels/+/messages/put
  • iotanalytics/channels/+/messages/binary/put

のいずれかを設定します。

binaryが付かない方のトピックにはJSONもしくはBase64形式の文字列を送信できます。 対してbinaryがつく方はその名の通りバイナリデータを送信できます。

Publishするデータの構造

Publishするデータは以下のような形式で作成します。

{
    "request": {
        "message" : ...
    },
    "id" : "req123"
}

まず最上位のキーとしてrequestが必須となっており、任意でidをセットできます。idを追加しておくと、デバッグやログの突き合わせが容易になるので、idもセットしておく方が良いでしょう。requestの中にはさらにmessageというキーを用意します。messageにセットする値はJSONもしくはBase64形式で文字列をセットします。ここでセットされた値が実際にAWS IoT Analyticsまで送信されます。

Lambdaの追加

先ほどのLambdaのバージョンをPublishし、Greengrassグループに追加しておきます。

Lambdaのライフサイクルは「存続期間が長く無制限に稼働する関数にする」として下さい。

コネクタの追加

実際にコネクタを追加していきます。

まずコネクタの選択画面でIot Analyticsを選択します。

次にパラメータの設定を行います。メモリサイズだけ必須項目なので、適当に設定してコネクタの追加を完了させます。

完成です。

サブスクリプションの設定

コネクタ周りのサブスクリプションを設定します。

Lambda -> コネクタ

まずはLambdaからコネクタへのサブスクリプションを作成します。 今回LambdaからPublishするデータは文字列にしているので、「必要なトピック構文」にはiotanalytics/channels/+/messages/putを選択します。トピックフィルターはとくに制限をかけないので+を指定します。

そのまま「次へ」をクリックして完了させます。

コネクタ -> IoT Cloud

次にコネクタからクラウドへのサブスクリプションを作成します。 とくに設定項目はないので、「次へ」をクリックしてガンガン進めます。

これで準備ができたので、Greengrassグループのデプロイを行います。

動作確認

Greengrassグループのデプロイができたら、Lambdaとコネクタの動作を確認します。 AWS IoTのマネジメントコンソールから、iotanalytics/#をサブスクライブしてみましょう。うまくLambdaとコネクタが動いていれば、コネクタがAWS IoT AnalyticsにPutしたレスポンスがiotanalytics/messages/put/statusのトピックに流れてきます。

うまくいってそうなのでAWS IoT Analyticsのデータセットを確認してみます。

ちゃんとデータが流れてきていますね!!成功です。

まとめ

このコネクタの登場により、GreengrassとAWS IoT Analyticsが連携させやすくなりました。 Greengrassを利用したIoTデータの活用がさらに加速しそうです!!