AWS 기술 블로그

AWS IoT TwinMaker에서 자체 데이터 소스를 사용하는 방법

이 글은 AWS IoT Blog에 게시된 How to use your own data source in AWS IoT TwinMaker by Ali Benfattoum을 한국어로 번역 및 편집하였습니다.

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를 데이터 원본으로 사용하였지만 설명하는 내용은 다른 데이터 소스에도 동일하게 적용할 수 있습니다.

선행 조건

이 블로그에서 설명하는 각 단계를 설정하고 실행하려면 아래 사항들이 필요합니다.

  • AWS 계정이 필요합니다. 계정이 없는 경우 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 작업 공간을 만듭니다. 두 Lambda 함수를 모두 호출할 수 있는 권한을 작업 공간 역할에 추가해야 합니다.
  5. TwinMaker 구성 요소를 만듭니다.
  6. 구성 요소를 테스트합니다. 구성 요소를 테스트하기 전에 TwinMaker 엔터티를 작성하고 구성 요소를 엔터티에 부착합니다.

1단계: DynamoDB  테이블 만들기

이 게시물의 목적을 위해 파티션 키로 String 유형의 키 thingName과 정렬 키로 Number 유형의 키 timestamp를 포함하는 TwinMakerTable이라는 이름의 DynamoDB 테이블을 만듭니다. 자세한 내용은 DynamoDB 테이블 생성 방법을 참조하십시오.

생성한 테이블에는 센서의 공기질 측정 값이 저장되며 각 센서들은 이름으로 식별 가능합니다. (센서 이름은 파티션 키 thingName으로 저장됨). 센서 이름 외에도 각 측정에는 Number:timestamp 유형의 다음 속성이 있습니다. (측정 시간이 밀리초 단위의 Unix 타임스탬프로 정렬 키인 timestamp로 저장됨) 정렬키 속성 외에 측정값을 저장하기 위한 temperature, humidity, co2와 같은 속성이 있습니다.

airTwin이라는 센서의 5가지 측정 값에 해당하는 항목을 테이블에 생성해 보겠습니다. 타임스탬프의 경우 이 웹사이트에서 밀리초 단위로 현재 타임스탬프를 받은 다음 측정 값 당 10000을 빼서 5개의 타임스탬프를 파생 할 수 있습니다. 그런 다음 temperature, humidity, co2 속성에 임의의 값을 입력할 수 있습니다. 자세한 내용은 콘솔을 사용하여 테이블에 데이터 쓰기를 참조하십시오.

이제 테이블과 데이터를 생성했으므로 두 개의 Lambda 함수를 생성합니다. 첫 번째는 스키마 초기화 커넥터용이고 두 번째는 DataReader 커넥터용입니다.

2단계: 스키마 초기화 커넥터 만들기

스키마 초기화 커넥터는 기본 데이터 원본에서 구성 요소 유형 또는 구성 요소 속성을 가져오기 위해 구성 요소 유형 또는 엔터티 수명 주기에서 사용되는 Lambda 함수입니다. TwinMakerTable의 스키마를 반환할 Lambda 함수를 생성합니다.

Lambda 콘솔을 사용하여 Node.js Lambda 함수를 생성합니다.

  • 함수 페이지를 엽니다.
  • Lambda 콘솔에서 함수 생성을 선택합니다.
  • 기본 정보에서 다음을 수행합니다.
    • 함수 이름에 TwinMakerDynamoSchemaInit를 입력합니다.
    • 런타임Node.js 16.x가 선택되었는지 확인합니다.
  • 함수 생성을 선택합니다.
  • 코드 소스 아래의 인라인 코드 편집기에서 다음 코드를 복사/붙여넣기 후 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 콘솔에서 함수 생성을 선택합니다.
  • 기본 정보에서 다음을 수행합니다.
    • 함수 이름에 TwinMakerDynamoDataReader를 입력합니다.
    • 런타임Node.js 16.x가 선택되었는지 확인합니다.
  • 함수 생성을 선택합니다.
  • 코드 소스 아래의 인라인 코드 편집기에서 다음 코드를 복사/붙여넣기 후 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 테이블에서 데이터를 가져옵니다. 이 구성 요소는 커넥터가 이 시간 범위의 데이터만 가져오기 위해 사용하는 두 가지 속성 startTime 및 endTime(ISO-8601 타임스탬프 형식)을 요청에 제공합니다. 설명서의 데이터 커넥터 섹션에서 요청 및 응답 인터페이스를 확인할 수 있습니다.

다음 단계로 이동하기 전에 함수에 테이블에 대한 액세스 권한을 부여해야 합니다. 자세한 내용은 Lambda 함수가 Amazon DynamoDB 테이블에 액세스하도록 허용을 참조하십시오.

이제 AWS IoT TwinMaker에서 작업 공간을 생성하는 단계로 이동할 수 있습니다

4단계: AWS IoT TwinMaker에서 작업 공간 생성

AWS IoT TwinMaker 콘솔에서 AirWorkspace라는 Workspace(작업 공간)을 생성합니다. AWS IoT TwinMaker 설명서의 작업 공간 생성 섹션의 지침을 따를 수 있습니다.

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 구성 요소 생성

생성한 작업 공간을 선택합니다. Workspace(작업 공간)에서 Component Types(구성 요소 유형)을 선택한 다음 Create Component Type(구성 요소 유형 생성)을 선택합니다.

요청 섹션에서 다음 JSON 문서를 복사하고 DataReader 및 스키마 초기화 함수의 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"
                               }
            }
       }
  }
}

구성 요소 유형 생성을 선택합니다. 이제 구성 요소가 생성되었으므로 엔터티를 생성하여 구성 요소를 테스트할 수 있습니다.

6단계: 엔터티 생성 및 구성 요소 테스트

이제 엔터티를 생성하고 생성한 구성 요소를 연결합니다.

  • Workspace(작업 공간) 페이지에서 작업 공간을 선택한 다음 왼쪽 창에서 Entity(엔터티)를 선택합니다.
  • Entity(엔터티) 페이지에서 생성을 선택한 다음 Create entity(엔터티 생성)을 선택합니다.
  • Create entity(엔터티 생성) 창에서 엔터티 이름과 엔터티의 Unique entity ID(엔터티 ID)로 airTwin을 입력합니다.
  • Create entity(엔터티 생성)을 선택합니다.

  • Entity(엔터티) 페이지에서 방금 생성한 엔터티를 선택한 다음 구성 요소 추가(Add component)를 선택합니다.
  • 구성 요소의 Name(이름)을 입력합니다. 여기서는 dynamoAirComponent를 입력해보겠습니다.
  • Type(유형)에서 이전에 생성한 구성 요소인 dynamodb.airQuality를 선택합니다.
  • Add component(구성 요소 추가)를 선택합니다.

구성요소는 ID가 airTwin인 엔티티에 연결됩니다. 이제 남은 단계는 구성 요소를 테스트하는 것입니다. 구성 요소를 테스트할 때(또는 GetPropertyValueHistory API 작업을 호출할 때) 구성 요소는 엔터티에 대한 ID가 포함된 요청을 DataReader Lambda 커넥터에 보냅니다. Lambda 커넥터는 ID를 사용하여 ID에 해당하는 이름으로 센서의 측정값을 쿼리합니다. 이 경우 airTwin 센서의 측정값이 됩니다.

  • Entity(엔터티) 페이지에서 엔티티 airTwin을 선택한 다음 dynamodb.airQuality 구성 요소를 선택합니다.
  • 그런 다음 Actions(작업)View component details(구성 요소 세부 정보 보기)를 선택합니다.
  • Test(테스트) 탭에서 검색할 속성과 시간 범위를 선택합니다. 선택한 시간 범위에 측정값의 타임스탬프가 포함되어 있는지 확인하십시오.
  • 마지막으로 Run test(테스트 실행)을 선택하여 구성 요소를 테스트합니다.

Time-series result(시계열 결과) 섹션에서 센서 측정값을 확인합니다.

이제 GetPropertyValueHistory API 작업을 호출하여 DynamoDB 테이블에 저장된 센서에서 측정값을 검색할 수 있습니다.

정리하기

향후 요금이 발생하지 않도록 하려면 이 실습 중에 생성된 리소스를 삭제하십시오.

결론

AWS IoT TwinMaker는 디지털 트윈의 소스 데이터를 읽고 쓸 수 있는 통합 데이터 액세스 API를 제공합니다. 데이터를 이동할 필요 없이 기존 데이터 원본을 사용할 수 있습니다.

이 블로그에서는 Amazon DynamoDB 테이블을 AWS IoT TwinMaker에 연결하는 방법을 배웠습니다. 설명된 개념은 다른 데이터 원본에 적용할 수 있습니다. 또한 여러 데이터 소스를 결합하여 디지털 트윈 애플리케이션을 강화할 수 있습니다.

AWS IoT TwinMaker 및 Amazon S3를 데이터 소스로 사용하는 솔루션의 예를 보려면 Youtube에서 Smart Territory Framework 및 AWS IoT TwinMaker를 사용하여 디지털 트윈 구축 비디오를 시청하십시오. 관련 GitHub 리포지토리를 방문하여 코드를 확인할 수도 있습니다.

Junghwan Rhee

Junghwan Rhee

이정환 Partner Solutions Architect, IoT는 AWS 파트너의 IoT 서비스 담당 SA로서 다양한 산업군 워크로드에 적합한 IoT 서비스를 소개하고 최적의 아키텍쳐를 구성하도록 기술적인 도움을 제공해드리고 있습니다.