데이터 레이크의 AWS IoT SiteWise 메타데이터 속성 추출 및 쿼리 - AWS 권장 가이드

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

데이터 레이크의 AWS IoT SiteWise 메타데이터 속성 추출 및 쿼리

작성자: Ambarish Dongaonkar(AWS)

환경: 프로덕션

기술: IoT, 분석, 빅 데이터

AWS 서비스: AWS IoT SiteWise, AWS Lambda, AWS Glue

요약

AWS IoT는 자산 모델 및 계층 구조를 SiteWise 사용하여 산업 장비, 프로세스 및 시설을 나타냅니다. 각 모델 또는 자산은 환경에 특정한 여러 속성을 가질 수 있습니다. 메타데이터 속성의 예로는 자산의 부지 또는 물리적 위치, 공장 세부 정보, 장비 식별자 등이 있습니다. 이러한 속성 값은 자산 측정 데이터를 보완하여 비즈니스 가치를 극대화합니다. 기계 학습이 메타데이터에 대한 추가 통찰력을 제공하고 엔지니어링 작업을 간소화할 수 있습니다.

하지만 메타데이터 속성은 AWS IoT SiteWise 서비스에서 직접 쿼리할 수 없습니다. 속성을 쿼리할 수 있게 하려면 속성을 추출하여 데이터 레이크에 수집해야 합니다. 이 패턴은 Python 스크립트를 사용하여 모든 AWS IoT SiteWise 자산의 속성을 추출하고 이를 Amazon Simple Storage Service (Amazon S3) 버킷의 데이터 레이크에 수집합니다. 이 프로세스를 완료하면 Amazon Athena의 SQL 쿼리를 사용하여 AWS IoT SiteWise 메타데이터 속성 및 기타 데이터 세트 (예: 측정 데이터 세트) 에 액세스할 수 있습니다. 메타데이터 속성 정보는 AWS IoT SiteWise 모니터 또는 대시보드로 작업할 때도 유용합니다. S3 버킷에서 추출된 속성을 사용하여 AWS QuickSight 대시보드를 구축할 수도 있습니다.

패턴에는 참조 코드가 있으며, AWS Lambda 또는 AWS Glue와 같은 사용 사례에 가장 적합한 컴퓨팅 서비스를 사용하여 코드를 구현할 수 있습니다.

사전 조건 및 제한 사항

사전 조건 

  • 활성 상태의 AWS 계정.

  • AWS Lambda 함수 또는 AWS Glue 작업을 설정할 수 있는 권한입니다.

  • Amazon S3 버킷.

  • 자산 모델 및 계층 구조는 AWS IoT에서 설정됩니다. SiteWise 자세한 내용은 자산 모델 생성 (AWS IoT SiteWise 설명서) 을 참조하십시오.

아키텍처

Lambda 함수 또는 AWS Glue 작업을 사용하여 이 프로세스를 완료할 수 있습니다. 모델이 100개 미만이고 각 모델의 속성이 평균 15개 이하인 경우 Lambda를 사용하는 것이 좋습니다. 다른 모든 사용 사례에서는 AWS Glue를 사용하는 것이 좋습니다.

솔루션 아키텍처 및 워크플로는 다음 다이어그램에 나와 있습니다.

설명된 추출 및 쿼리 프로세스를 보여주는 아키텍처 다이어그램.
  1. 예약된 AWS Glue 작업 또는 Lambda 함수가 실행됩니다. AWS SiteWise IoT에서 자산 메타데이터 속성을 추출하여 S3 버킷으로 수집합니다.

  2. AWS Glue 크롤러는 S3 버킷에서 추출된 데이터를 크롤링하여 AWS Glue 데이터 카탈로그에 테이블을 생성합니다.

  3. Amazon Athena는 표준 SQL을 사용하여 AWS Glue 데이터 카탈로그의 테이블을 쿼리합니다.

자동화 및 규모 조정

AWS IoT 자산 구성의 업데이트 빈도에 따라 Lambda 함수 또는 AWS Glue 작업이 매일 또는 매주 실행되도록 예약할 수 있습니다. SiteWise

샘플 코드가 처리할 수 있는 AWS IoT SiteWise 자산 수에는 제한이 없지만, 자산 수가 많으면 프로세스를 완료하는 데 필요한 시간이 늘어날 수 있습니다.

도구

  • Amazon Athena는 표준 SQL을 사용하여 Amazon Simple Storage Service(S3)에 있는 데이터를 직접 간편하게 분석할 수 있는 대화형 쿼리 서비스입니다.

  • AWS Glue는 완전관리형 추출, 전환, 적재(ETL) 서비스입니다. 이를 통해 데이터 스토어와 데이터 스트림 간에 데이터를 안정적으로 분류, 정리, 보강하고 이동할 수 있습니다.

  • AWS Identity and Access Management(IAM)를 사용하면 사용자에 대해 인증 및 권한 부여를 제어함으로써 AWS 리소스에 대한 액세스를 안전하게 관리할 수 있습니다.

  • AWS IoT를 SiteWise 사용하면 산업용 장비로부터 대규모로 데이터를 수집, 모델링, 분석 및 시각화할 수 있습니다.

  • AWS Lambda는 서버를 프로비저닝하거나 관리할 필요 없이 코드를 실행하는 데 도움이 되는 컴퓨팅 서비스입니다. 필요할 때만 코드를 실행하며 자동으로 확장이 가능하므로 사용한 컴퓨팅 시간만큼만 비용을 지불합니다.

  • Amazon Simple Storage Service(Amazon S3)는 원하는 양의 데이터를 저장, 보호 및 검색하는 데 도움이 되는 클라우드 기반 객체 스토리지 서비스입니다.

  • AWS SDK for Python(Boto3)는 Python 애플리케이션, 라이브러리 또는 스크립트를 AWS 서비스와 통합하는 데 도움이 되는 소프트웨어 개발 키트입니다.

에픽

작업설명필요한 기술

IAM에서 권한을 구성합니다.

IAM 콘솔에서 Lambda 함수 또는 AWS Glue 작업이 위임한 IAM 역할에 권한을 부여하여 다음 작업을 수행할 수 있습니다.

  • AWS IoT SiteWise 서비스에서 읽어보기

  • S3 버킷에 쓰기

자세한 내용은 AWS 서비스의 역할 생성(IAM 설명서)을 참조하십시오.

일반 AWS

Lambda 함수 또는 AWS Glue 작업을 생성합니다.

Lambda를 사용하는 경우 새 Lambda 함수를 생성하십시오. 런타임에서 Python을 선택합니다. 자세한 내용은 Python을 사용하여 Lambda 함수 빌드(Lambda 설명서)를 참조하십시오.

AWS Glue를 사용하는 경우, AWS Glue 콘솔에서 새 Python 쉘 작업을 생성하십시오. 자세한 내용은 Python 쉘 작업 추가(AWS Glue 설명서)를 참조하십시오. 

일반 AWS

Lambda 함수 또는 AWS Glue 작업을 업데이트합니다.

새 Lambda 함수 또는 AWS Glue 작업을 수정하고 추가 정보 섹션에 코드 샘플을 입력합니다. 사용 사례에 맞게 코드를 수정합니다. 자세한 내용은 콘솔 편집기를 사용한 코드 편집(Lambda 설명서) 및 스크립트 작업(AWS Glue 설명서)을 참조하십시오.

일반 AWS
작업설명필요한 기술

Lambda 함수 또는 AWS Glue 작업을 실행합니다.

Lambda 함수 또는 AWS Glue 작업을 실행합니다. 자세한 내용은 Lambda 함수 간접 호출(Lambda 설명서) 또는 트리거를 사용하여 작업 시작하기(AWS Glue 설명서)를 참조하십시오. 이는 AWS IoT SiteWise 계층 구조에서 자산 및 모델의 메타데이터 속성을 추출하여 지정된 S3 버킷에 저장합니다.

일반 AWS

AWS Glue 크롤러를 설정합니다.

CSV 형식 파일에 필요한 형식 분류기를 사용하여 AWS Glue 크롤러를 설정합니다. Lambda 함수 또는 AWS Glue 작업에 사용된 S3 버킷 및 접두사 세부 정보를 사용하십시오. 자세한 내용은 크롤러 정의(AWS Glue 설명서)를 참조하십시오.

일반 AWS

AWS Glue 크롤러를 실행합니다.

크롤러를 실행하여 Lambda 함수 또는 AWS Glue 작업에서 생성된 데이터 파일을 처리합니다. 크롤러는 지정된 AWS Glue 데이터 카탈로그에서 테이블을 생성합니다. 자세한 내용은 트리거를 사용하여 크롤러 시작하기(AWS Glue 설명서)를 참조하십시오.

일반 AWS

메타데이터 속성을 쿼리합니다.

Amazon Athena를 사용하면 사용 사례에 따라 표준 SQL을 사용하여 AWS Glue 데이터 카탈로그를 쿼리할 수 있습니다. 메타데이터 속성 테이블을 다른 데이터베이스 및 테이블과 조인할 수 있습니다. 자세한 내용은 시작하기(Amazon Athena 설명서)를 참조하십시오.

일반 AWS

관련 리소스

추가 정보

코드

제공된 샘플 코드는 참조용이며 사용 사례에 따라 이 코드를 사용자 지정할 수 있습니다.

# Following code can be used in an AWS Lambda function or in an AWS Glue Python shell job.  # IAM roles used for this job need read access to the AWS IoT SiteWise service and write access to the S3 bucket. sw_client = boto3.client('iotsitewise') s3_client = boto3.client('s3') output = io.StringIO()   attribute_list=[] bucket = '{3_bucket name}' prefix = '{s3_bucket prefix}' output.write("model_id,model_name,asset_id,asset_name,attribuet_id,attribute_name,attribute_value\n")       m_resp = sw_client.list_asset_models() for m_rec in m_resp['assetModelSummaries']:      model_id = m_rec['id']      model_name = m_rec['name']        attribute_list.clear()      dam_response = sw_client.describe_asset_model(assetModelId=model_id)      for rec in dam_response['assetModelProperties']:          if 'attribute' in rec['type']:             attribute_list.append(rec['name'])            response = sw_client.list_assets(assetModelId=model_id, filter='ALL')      for asset in response['assetSummaries']:          asset_id = asset['id']          asset_name = asset['name']          resp = sw_client.describe_asset(assetId=asset_id)          for rec in resp['assetProperties']:             if rec['name'] in attribute_list:                 p_resp = sw_client.get_asset_property_value(assetId=asset_id, propertyId=rec['id'])                 if 'propertyValue' in p_resp:                     if p_resp['propertyValue']['value']:                         if 'stringValue' in p_resp['propertyValue']['value']:                              output.write(model_id + "," + model_name + "," + asset_id + "," + asset_name + "," + rec['id'] + "," + rec['name'] + "," + str(p_resp['propertyValue']['value']['stringValue']) + "\n")                                                      if 'doubleValue' in p_resp['propertyValue']['value']:                              output.write(model_id + "," + model_name + "," + asset_id + "," + asset_name + "," + rec['id'] + "," + rec['name'] + "," + str(p_resp['propertyValue']['value']['doubleValue']) + "\n")                         if 'integerValue' in p_resp['propertyValue']['value']:                              output.write(model_id + "," + model_name + "," + asset_id + "," + asset_name + "," + rec['id'] + "," + rec['name'] + "," + str(p_resp['propertyValue']['value']['integerValue']) + "\n")                          if 'booleanValue' in p_resp['propertyValue']['value']:                              output.write(model_id + "," + model_name + "," + asset_id + "," + asset_name + "," + rec['id'] + "," + rec['name'] + "," + str(p_resp['propertyValue']['value']['booleanValue']) + "\n")   output.seek(0) s3_client.put_object(Bucket=bucket, Key= prefix + '/data.csv', Body=output.getvalue()) output.close()