Amazon Web Services ブログ

AWS IoT TwinMaker で独自のデータソースを使用する方法

このブログは、Ali によって書かれた How to use your own data source in AWS IoT TwinMaker を翻訳したものです。

イントロダクション

AWS IoT TwinMaker を使用すると、開発者は、建物や工場などの実世界のシステムのデジタルツインを簡単に作成でき、複数のソースから既存のデータを使用することができます。

AWS IoT TwinMaker は、データを再取り込みしたり別の場所に移動したりすることなく、独自のデータソースから AWS IoT TwinMaker にデータを接続できるコネクタベースのアーキテクチャを使用します。AWS IoT TwinMaker は、AWS IoT SiteWiseAmazon Kinesis Video Streams などの AWS サービス用の組み込みデータコネクタを提供します。Amazon Timestream、Amazon DynamoDB、Snowflake、Siemens Mindsphere など、他の AWS またはサードパーティのデータソースで使用するカスタムデータコネクタを作成することもできます。

このブログでは、AWS IoT TwinMaker データコネクタインターフェイスを使用して、AWS IoT TwinMaker で独自のデータソースを使用する方法を学びます。

概要

データソースと AWS IoT TwinMaker の間の接続については、コンポーネントで説明されています。コンポーネントは、Lambda コネクタを使用して外部データソースにアクセスします。Lambda コネクタは、コンポーネント定義で指定する Lambda 関数です。

以下は、スキーマ初期化コネクタを使用して基盤となるデータソースからプロパティをフェッチし、DataReader コネクタを使用してこれらのプロパティの時系列値を取得する Amazon DynamoDB 用のデータコネクタを作成する手順です。データコネクタが作成されると、このデータコネクタのコンポーネントを作成してエンティティに接続する方法についての説明が表示されます。

この記事では Amazon DynamoDB をデータソースとして使用していますが、説明されている概念は他のデータソースにも適用できます。

前提条件

このブログの手順をセットアップして実行するには、以下が必要です。:

  • AAWS アカウント。お持ちでない場合は、AWS アカウントのセットアップを参照してください。
  • ブログに記載されているリソースを作成する権限を持つ AWS IAM Identity Center (AWS Single Sign-On の後継) ユーザー。
  • AWS IoT TwinMaker の主要な概念を理解するため「What is AWS IoT TwinMaker? 」をお読みください。

ウォークスルー

このウォークスルーでは、Amazon DynamoDB データソースを AWS IoT TwinMaker に接続するために 6 つのステップを実行します。:

  1. DynamoDB テーブルを作成します。このテーブルは、本ブログ用に作っています。既存のデータベースを使用するように手順を簡単に変更可能です。
  2. スキーマ初期化コネクタ用の Lambda 関数を作成します。
  3. DataReader の Lambda 関数を作成します。関数の実行ロールに、テーブルから読み取る権限を付与する必要があります。
  4. TwinMaker ワースペースを作成します。両方の関数を呼び出すためのアクセス許可をワークスペースロールに追加する必要があります。
  5. TwinMaker コンポーネントを作成します。
  6. コンポーネントをテストします。コンポーネントをテストする前に、TwinMaker エンティティを作成し、コンポーネントをエンティティに添付します。

ステップ 1: DynamoDB テーブルを作成する

この投稿の目的のために、TwinMakerTable という名前の DynamoDB テーブルを作成します。このテーブルには、String 型のキー thingName がパーティションキーとして含まれ、Number 型のキー timestamp がソートキーとして含まれます。詳細については、DynamoDB テーブルの作成方法を参照してください。

Dynamodb table creation

作成したテーブルには、センサーからの大気質測定値が格納されます。この記事では簡略化のため、センサーの名前 (パーティションキーの thingName として保存されます) で識別されるセンサーからの測定値に対応するテーブルにアイテムを作成します。センサーの名前に加えて、各測定値には Number 型の次のプロパティ: timestamp (測定のミリ秒単位の Unix タイムスタンプであるソートキー timestamp として保存されます)、temperaturehumidityco2

airTwin という名前のセンサーの 5 つの測定値に対応する 5 つの項目をテーブルに作成しましょう。タイムスタンプについては、この Web サイトから現在のタイムスタンプをミリ秒単位で受け取り、測定ごとに 10000 を引いて 5 つのタイムスタンプを導き出すことができます。その後、プロパティにランダムな値を入力できます:temperaturehumidityco2 。詳細については、コンソールを使用してテーブルにデータを書き込むを参照してください。

Item creation in DynamoDB

データを含むテーブルが作成されたので、2 つの Lambda 関数を作成します。1 つ目はスキーマ初期化コネクタ用で、2 つ目は DataReader コネクタ用です。

ステップ 2: スキーマ初期化子コネクタを作成する

スキーマ初期化コネクタは、コンポーネントタイプまたはエンティティのライフサイクルで使用される Lambda 関数であり、基盤となるデータソースからコンポーネントタイプまたはコンポーネントプロパティをフェッチします。TwinMakerTable のスキーマを返す Lambda 関数を作成します。

Lambda コンソールを使用して Node.js Lambda 関数を作成します。

  • 関数ページを開きます。
  • Lambda コンソールで、Create function を選択します。
  • Basic information で、次の操作を行います。:
    • Function nameTwinMakerDynamoDataReader と入力します。
    • Runtime で、Node.js 16.x が選択されていることを確認します。
  • Create function を選択します。
  • Function codeのインラインコードエディターで、次のコードをコピーして貼り付け、Deploy を選択します:
exports.handler = async (event) => {
    let result = {
          properties: {
                temperature: {
                  definition: {
                      dataType: {
                          type: "DOUBLE"
                      },
                      isTimeSeries: true
                  }
                },
                humidity: {
                  definition: {
                      dataType: {
                          type: "DOUBLE"
                      },
                      isTimeSeries: true
                  }
                },
                co2: {
                  definition: {
                      dataType: {
                          type: "DOUBLE"
                      },
                      isTimeSeries: true
                  }
                },
              
          }
        }
    
    return result
}

この関数は、テーブルの各プロパティの定義を送信し、型を指定します。この場合、すべてのプロパティは「DOUBLE」タイプで、時系列データです。ドキュメントで有効なタイプを確認できます。

注: ここでは、プロパティは関数にハードコードされています。たとえば、アイテムからプロパティとそのタイプを自動的に取得する関数を設計できます。

それでは、DataReader コネクタを作成しましょう。

ステップ 3: DataReader コネクタを作成する

DataReader は、単一コンポーネント内のプロパティの時系列値を取得するために使用されるデータプレーンコネクタです。

Lambda コンソールを使用して Node.js Lambda 関数を作成します。

  • 関数ページを開きます。
  • Lambda コンソールで、Create function を選択します。
  • Basic information で、次の操作を行います:
    • Function nameTwinMakerDynamoDataReader と入力します。
    • Runtime で、Node.js 16.x が選択されていることを確認します。
  • Create function を選択します。
  • Function code のインラインコードエディターで、次のコードをコピーして貼り付け、Deploy を選択します:
const TABLE = 'TwinMakerTable'
const aws = require('aws-sdk')
const dynamo = new aws.DynamoDB.DocumentClient()


exports.handler = async (event) => {
    try {
 
        let {workspaceId, entityId, componentName, selectedProperties, startTime, endTime } = event
        
        
        // QUERY THE DATABASE WITH THE SELECTED PROPERTIES
        const {Items} = await dynamo.query({
            TableName: TABLE,
            ProjectionExpression: `${selectedProperties}, #tmsp`,
            KeyConditionExpression: `thingName = :hashKey AND #tmsp BETWEEN :startTime AND :endTime`,
            ExpressionAttributeNames: {
                '#tmsp': 'timestamp'
            },
            ExpressionAttributeValues: {
                ':hashKey': entityId,
                ':startTime': (new Date(startTime)).getTime(), 
                ':endTime': (new Date(endTime)).getTime() 
            }
        }).promise()

        let results = { propertyValues: [] }
        let res = []
        Items.forEach(item => {
    
            selectedProperties.forEach(prop => {
                if(!res[prop]){
                    res[prop] = {
                        entityPropertyReference:{
                            propertyName: prop,
                            componentName,
                                   entityId: event.entityId

                        },
                        values: []
                    }
                }
                res[prop].values.push({
                    time: (new Date(item['timestamp'])).toISOString(),
                    value: {doubleValue: item[prop]}
                })
            })
    
        })
    
        for (let key in res){
            results.propertyValues.push(res[key])
        }
    
        console.log(results)
        return results
    } catch (e) {
        console.log(e)
    }

}

TwinMaker コンポーネントは、この DataReader コネクタを使用して、DynamoDB テーブルからデータをフェッチします。コンポーネントは、この時間範囲内のデータのみを取得するためにコネクタによって使用される 2 つのプロパティ startTime および endTime (ISO-8601 タイムスタンプ形式) をリクエストで提供します。ドキュメントの DataConnectors セクションで、リクエストとレスポンスのインターフェイスを確認できます。

次のステップに進む前に、関数にテーブルへのアクセスを許可する必要があります。詳細については、Lambda 関数が Amazon DynamoDB テーブルにアクセスできるようにするを参照してください。

Adding permissions to the Lambda function to access the table

これで、AWS IoT TwinMaker でワークスペースを作成するステップに進むことができます。

ステップ 4: AWS IoT TwinMaker でワークスペースを作成する

AWS IoT TwinMaker コンソールで、AirWorkspace という名前のワークスペースを作成します。AWS IoT TwinMaker ドキュメントの Create a workspace セクションの指示に従うことができます。

ワークスペースが作成されたら、Amazon Simple Storage Service (Amazon S3) バケットを作成する必要があります。AWS IoT TwinMaker は、このバケットを使用して、ワークスペースに関連する情報とリソースを保存します。

IAM Identity Center ロールも作成する必要があります。このロールにより、ワークスペースは他のリソースにアクセスできます。

コンポーネントを作成する前に、(前の手順で作成した) 両方のLambda関数をワークスペースロールに呼び出すためのアクセス許可を提供する必要があります。サービスロールに Lambda 関数を使用するアクセス許可を付与する例については、外部データソースへのコネクタのアクセス許可を参照してください。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": [
                "arn:aws:lambda:{{AWS_REGION}}:{{ACCOUNT_ID}}:function:TwinMakerDynamoDataReader",
                "arn:aws:lambda:{{AWS_REGION}}:{{ACCOUNT_ID}}:function:TwinMakerDynamoSchemaInit"
            ]
        }
    ]
}

これで、コンポーネントを作成できます。

ステップ 5: AWS IoT TwinMaker コンポーネントを作成する

作成したワークスペースを選択します。ワークスペースで、Component types を選択し、Create component type を選択します。

Twinmaker component types

次の JSON ドキュメントを Request セクションにコピーし、DataReader および Schema 初期化関数の ARN をそれぞれ前に作成したものに置き換えます:

{
  "componentTypeId": "com.dynamodb.airQuality",
  "description": "Connector for DynamoDB – Use case Air Quality",
  "propertyDefinitions":{
   },
  "functions": {
      "dataReader": { 
            "implementedBy": {
                             "lambda": {
                                    "arn": "arn:aws:lambda:{{AWS_REGION}}:{{ACCOUNT_ID}}:function:TwinMakerDynamoDataReader"
                              }
             }
      },
      "schemaInitializer": {
            "implementedBy": {
                             "lambda": { 
                                   "arn": "arn:aws:lambda:{{AWS_REGION}}:{{ACCOUNT_ID}}:function:TwinMakerDynamoSchemaInit"
                               }
            }
       }
  }
}

Create component type を選択します。コンポーネントが作成されたので、エンティティを作成してコンポーネントをテストできます。

ステップ 6: エンティティを作成してコンポーネントをテストする

エンティティを作成し、作成したコンポーネントをエンティティにアタッチします。

  • Workspaces ページでワークスペースを選択し、左側のペインで Entities を選択します。
  • Entities ページで、Create を選択してから、Create entity を選択します。
  • Create an entity ウィンドウで、エンティティ名とエンティティの entity ID にも同様に airTwin と入力します。
  • Create entity を選択します。

Create entity in TwinMaker

  • Entities ページで、作成したエンティティを選択し、Add component を選択します。
  • コンポーネントの名前を入力します。 dynamoAirComponent と呼ぶことができます。
  • Type で、前に作成したコンポーネント com.dynamodb.airQuality を選択します。
  • Add component を選択します。

Add a component in TwinMaker

コンポーネントは、ID airTwin を持つエンティティに添付されます。残っている唯一のステップは、コンポーネントをテストすることです。コンポーネントをテストするとき (または GetPropertyValueHistory API アクションを呼び出すとき)、コンポーネントはエンティティの ID を含むリクエストを DataReader Lambda コネクタに送信します。Lambda コネクタは ID を使用して、ID に対応する名前を持つセンサーの測定値をクエリします。この場合、airTwin センサーからの測定値になります。

  • Entities ページで、エンティティ airTwin を選択してから、コンポーネント com.dynamodb.airQuality を選択します。
  • 次に、ActionsView component details を選択します。
  • Test タブで、取得するプロパティと時間範囲を選択します。選択した時間範囲に測定のタイムスタンプが含まれていることを確認してください。
  • 最後に、Run test を選択してコンポーネントをテストします。

Time-series result セクションにセンサーの測定値が表示されます。

Time-series result in TwinMaker

GetPropertyValueHistory API アクションを呼び出して、DynamoDB テーブルに保存されているセンサーから測定値を取得できるようになりました。

クリーンアップ

今後料金が発生しないようにするには、このチュートリアルで作成したリソースを削除してください。

まとめ

AWS IoT TwinMaker は、デジタルツインのソースデータを読み書きするための統合データアクセス API を提供します。データを移動する必要なく、既存のデータソースを使用できます。

このブログでは、Amazon DynamoDB テーブルを AWS IoT TwinMaker に接続する方法を学びました。説明されている概念は、他のデータソースにも適用できます。複数のデータソースを組み合わせて、デジタルツインアプリケーションを強化することもできます。

AWS IoT TwinMaker と Amazon S3 をデータソースとして使用するソリューションの例を見たい場合は、Youtube で Build a Digital Twin using the Smart Territory Framework and AWS IoT TwinMaker の動画をご覧ください。関連する GitHub リポジトリにアクセスして、コードを確認することもできます。

著者について

Ali は、アマゾンウェブサービスの IoT およびスマート シティのテクノロジーエバンジェリストです。IoT とスマートシティで 12 年以上の経験を持つ Ali は、技術的な専門知識を活用して、AWS のパートナーと顧客が IoT とスマートシティのプロジェクトを加速できるようにします。Ali はエグゼクティブ MBA も保持しており、ズームアウトして顧客やパートナーを戦略的レベルで支援する能力を備えています。

このブログは、ソリューションアーキテクトの戸塚智哉が翻訳しました。