AWS IoT Analytics の設定

この演習を実施するかどうかは任意です。ワークショップを進める上で必須ではありません。

AWS IoT Analytics を容易に設定するために、AWS ではクイック作成ウィザードを提供しており、クリックするだけでパイプライン、チャネル、データストアを作成することができます。

AWS IoT Analytics リソースの作成方法

AWS IoT Analytics コンソール へ移動します。

  1. AWS IoT Analytics の使用を開始する
    • リソースプレフィックス: sitewise_workshop と入力
    • MQTT トピック - オプション: 空白のまま
  2. リソースを作成 をクリック

AWS IoT Analytics の使用を開始する の下で、以下のリソースが作成済みになるのを待ちます。

  • sitewise_workshop_channel
  • sitewise_workshop_datastore
  • sitewise_workshop_pipeline
  • sitewise_workshop_dataset

左側のペインで、AWS IoT Analytics の下の チャネルパイプラインデータストアデータセット をクリックし、IoT Analytics のリソースが作成されたことを確認してください。

Lambda 関数の作成

JSON オブジェクトを平坦化するために、AWS Cloud9 IDE で Lambda 関数を作成します。

Cloud9 IDE へ移動し、左側ペインで以下を行います。

  1. FILE SYSTEM の下のフォルダを SiteWiseWorkshop -> IoTAFlattenSiteWiseData の順に展開
  2. lambda_function.py を右クリックして Open を選択
  3. 既存のコードを以下のコードで上書き
import json
import logging
import sys
import time

# Configure logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)
streamHandler = logging.StreamHandler(stream=sys.stdout)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
streamHandler.setFormatter(formatter)
logger.addHandler(streamHandler)


def lambda_handler(event, context):
    logger.info("event: {}".format(event))
    print(json.dumps(event, indent=2))
    transformed = []

    for e in event:
        logger.info("e: {}".format(json.dumps(e, indent=2)))
        swtype=e['type']
        asset_id = e['payload']['assetId']
        property_id = e['payload']['propertyId']
        logger.info("type: {} asset_id: {} property_id: {}".format(swtype, asset_id, property_id))
        row = {"type": swtype, "asset_id": asset_id, "property_id": property_id}
        for v in e['payload']['values']:
            logger.info("v: {}".format(v))

            time_in_seconds = int(time.time())
            if 'timestamp' in v and 'timeInSeconds' in v['timestamp']:
                logger.debug("timeInSeconds in payload")
                time_in_seconds = v['timestamp']['timeInSeconds']

            value = ""
            valuetype = ""
            if 'doubleValue' in v['value']:
                logger.debug("doubleValue in payload")
                value = v['value']['doubleValue']
                valuetype= "double"
            if 'integerValue' in v['value']:
                logger.debug("integerValue in payload")
                value = v['value']['integerValue']
                valuetype= "integer"
            if 'booleanValue' in v['value']:
                logger.debug("booleanValue in payload")
                value = v['value']['booleanValue']
                valuetype= "boolean"
            if 'stringValue' in v['value']:
                logger.debug("stringValue in payload")
                value = v['value']['stringValue']
                valuetype= "string"

            quality = ""
            if 'quality' in v:
                logger.debug("quality in payload")
                quality = v['quality']

            row['timestamp'] = time_in_seconds
            row['quality'] = quality
            row['value'] = value
            row['valuetype'] = valuetype
            logger.debug("row: {}".format(row))
            transformed.append(row)

    logger.info("transformed: {}\n".format(json.dumps(transformed, indent=2)))

    return transformed
  1. メニューバーの File をクリックして Save を選択
  2. 左端にある aws アイコンをクリック
    • AWS: Explorer の下に、利用中の AWS リージョンが表示されます。
    • 上記が表示されず Connect to AWS… と表示されている場合、Connect to AWS… をクリックし、profile:default をクリックします。
  3. リージョンの左の > をクリックして展開
  4. Lambda を右クリックして Deploy SAM Application を選択
  5. Step 1 of 4 の下の IoTAFlattenSiteWiseData/template.yaml を選択
  6. Step 2 of 4 の下の sitewiseworkshop-miscresources で始まる S3 バケット名を選択
  7. Step 4 of 4 の下に IoTFlattenSiteWiseData と入力して Enter キーを押す

デプロイが開始され、AWS Toolkit という名前の新しいターミナルが開いて Lambda 関数のデプロイの進捗に関するメッセージが表示されます。

デプロイが完了すると、以下のようなメッセージが表示されます。

...
2021-08-09 14:30:16 [INFO]:
Successfully created/updated stack - IoTFlattenSiteWiseData in eu-west-1


2021-08-09 14:30:16 [INFO]:

2021-08-09 14:30:16 [INFO]: Successfully deployed SAM Application to CloudFormation Stack: IoTFlattenSiteWiseData

Lambda が作成されたことを確認

AWS Explorer を使用して、Lambda 関数が作成されたことを確認します。

Lambda の左側の > をクリックして展開し、IoTFlattenSiteWiseData-IoTAFlattenSiteWiseData-UNIQUE_STRING のような名前の Lambda 関数があることを確認してください。

作成した関数が見つからない場合は、AWS: Explorer の右にあるアイコンをクリックし、Refresh Explorer を選択してリフレッシュしてください。

権限の追加

IoT Analytics が関数を呼び出すことができるように、Lambda 関数に権限を追加します。権限はコマンドラインで追加します。権限を追加するためには、Lambda 関数の正確な名前が必要です。

Lambda 関数の名前を取得するため、Cloud9 ターミナルで以下のコマンドを実行します。

aws lambda list-functions --query 'Functions[?starts_with(FunctionName, `IoTFlattenSiteWiseData-IoTAFlattenSiteWiseData`) == `true`].FunctionName' --output text

コマンドの出力は IoTFlattenSiteWiseData-IoTAFlattenSiteWiseData-UNIQUE_STRING のような形式で、これが Lambda 関数の名前です。

以下のコマンドを、[YOUR_LAMBDA_FUNCTION_NAME] の部分を上記の Lambda 関数名に置き換えて実行してください。

aws lambda add-permission --statement-id $(date '+%Y%m%d%H%M%S') \
    --principal iotanalytics.amazonaws.com --action lambda:InvokeFunction \
    --function-name [YOUR_LAMBDA_FUNCTION_NAME]

以下のような結果が出力されます。

{
    "Statement": "{\"Sid\":\"20210809144349\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"iotanalytics.amazonaws.com\"},\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws:lambda:AWS_REGION:AWS_ACCOUNT_ID:function:IoTFlattenSiteWiseData-IoTAFlattenSiteWiseData-UNIQUE_STRING\"}"
}

パイプラインのアクティビティに Lambda 関数を追加

パイプラインアクティビティ を使うことで、受信したデータを、データストアに保存される前に変更することができます。

AWS IoT Analytics コンソール へ移動します。

  1. パイプライン をクリックし、sitewise_workshop_pipeline を選択
  2. アクティビティ タブを選択し、その下の アクティビティ の右側の 編集 をクリック
  3. 次へ をクリック
  4. パイプラインアクティビティを追加 の下で Lambda 関数でメッセージを変換 を選択 し、追加 をクリック
    • Lambda 関数: IoTFlattenSiteWiseData-IoTAFlattenSiteWiseData で始まる名前の Lambda 関数を選択
    • バッチサイズ: 10 を入力
  5. 次へ をクリックし、次の画面で 更新 をクリック

パイプラインにアクティビティが追加されたことを確認するには、パイプライン をクリックして sitewise_workshop_pipeline を選択し、アクティビティ タブを選択して AWS Lambda 関数を実行 があることを確認します。

IoT トピックルールの作成

IoT トピックルールを作成し、AWS IoT SiteWise から AWS IoT Analytics へメッセージを転送します。

AWS IoT Core コンソール へ移動します。

  1. ACT の下の ルール をクリック
  2. 作成 をクリック
  3. 名前: SiteWiseToIoTARule を入力
  4. SQL バージョンの使用: 2016-03-23 を選択
  5. ルールクエリステートメント: SELECT * FROM '$aws/sitewise/asset-models/+/assets/+/properties/+' を入力
  6. 1 つ以上のアクションを設定する: アクションの追加 をクリック
  7. アクションを選択してください: IoT Analytics にメッセージを送る を選択
  8. アクションの設定: IoT Analytics のチャンネルとロールを手動で選択する を選択
  9. チャネル名: sitewise_workshop_channel を選択
  10. ロール: SiteWiseWorkshop-MiscResources-UNIQUE_STRING-IoTServiceRole-UNIQUE_STRING を選択
  11. アクションの追加 をクリック
  12. ルールの作成 をクリック

AWS IoT Analytics でデータを確認

IoT Analytics がデータを受信するまで、数分かかります。

チャネルモニターを使って、IoT Analytics にデータが取り込まれていることを確認する

AWS IoT Analytics コンソール へ移動します。

  1. チャネル をクリックし、sitewise_workshop_channel を選択
  2. モニタリング の下の 1時間 を選択

IncomingMessages グラフをリフレッシュすると、受信したメッセージ量がグラフで表示されます。

データフォーマットの確認

データセットを作成してプレビューを表示し、データが正しく保存されていることを確認する

AWS IoT Analytics コンソール へ移動します。

  1. データセット をクリックし、sitewise_workshop_dataset を選択
  2. 今すぐ実行 をクリック

データセットが作成されると、コンテンツ の下の データセットのコンテンツ に表示されます。

  1. 名前 の下の UUID 形式 (48eec233-72bd-47cf-a2ed-25aeaf3f9b02 のような形式) のリンクをクリック

以下のような結果のプレビューが表示されます。

iota_result_preview.png

トラブルシューティング

IoT Analytics でデータが取得できない場合、IoT トピックルールのエラーや、データを平坦化する Lambda 関数のエラーなど、いくつかの原因が考えられます。

まず、Amazon CloudWatch でエラーを確認してみましょう。

Amazon CloudWatch コンソール へ移動し、ログ の下の ロググループ をクリックします。

  • IoT のログは AWSIoTLogs または AWSIoTLogsV2 で確認できます。
  • Lambda のログは /aws/lambda/[YOUR_LAMBDA_FUNCTION_NAME] で確認できます。