擷取和查詢資料湖中的 AWS IoT SiteWise 中繼資料屬性 - AWS 方案指引

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

擷取和查詢資料湖中的 AWS IoT SiteWise 中繼資料屬性

由 Ambarish Dongaonkar 建立 (AWS)

環境:生產

技術:IoT;分析;大數據

AWS 服務:AWSIoT SiteWiseAWSLambda、AWSGlue

Summary

AWS IoT SiteWise 使用資產模型和階層來代表您的工業設備、程序和設施。每個模型或資產都可以有多個專屬於您環境的屬性。中繼資料屬性範例包括資產的網站或實體位置、工廠詳細資訊和設備識別符。這些屬性值補充資產測量資料,以最大化商業值。機器學習 (ML) 可以提供此中繼資料的其他洞見,並簡化工程任務。

不過,中繼資料屬性無法直接從 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 函數或 Glue AWS 任務的許可。

  • Amazon S3 儲存貯體。

  • 資產模型和階層是在 AWS IoT SiteWise中設定。如需詳細資訊,請參閱建立資產模型 (AWS IoT SiteWise 文件)。

架構

您可以使用 Lambda 函數或 Glue AWS 任務來完成此程序。如果您的模型少於 100 個,且每個模型的平均屬性都不超過 15 個,建議您使用 Lambda。對於所有其他使用案例,我們建議您使用 AWS Glue。

解決方案架構和工作流程如下圖所示。

顯示所述擷取和查詢程序的架構圖表。
  1. 排程的 AWS Glue 任務或 Lambda 函數會執行。它從 AWS IoT SiteWise 擷取資產中繼資料屬性,並將其擷取到 S3 儲存貯體。

  2. Glue AWS 爬蟲程式會爬取 S3 儲存貯體中的擷取資料,並在 Glue Data Catalog AWS 中建立資料表。

  3. Amazon Athena SQL使用標準 查詢 Glue Data Catalog AWS 中的資料表。

自動化和擴展

您可以根據 AWS IoT SiteWise AWS 資產組態的更新頻率,將 Lambda 函數或 Glue 任務排程為每天或每週執行。

範例程式碼可處理的 AWS IoT SiteWise 資產數量沒有限制,但大量資產可能會增加完成程序所需的時間。

工具

  • Amazon Athena 是一種互動式查詢服務,可協助您使用標準 直接在 Amazon Simple Storage Service (Amazon S3) 中分析資料SQL。

  • 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 函數或 Glue AWS 任務所擔任IAM角色的許可,以執行下列動作:

  • 從 AWS IoT SiteWise 服務讀取

  • 寫入 S3 儲存貯體

如需詳細資訊,請參閱建立AWS服務的角色 (IAM 文件)。

一般 AWS

建立 Lambda 函數或 Glue AWS 任務。

如果您使用 Lambda,請建立新的 Lambda 函數。針對執行期 ,選擇 Python 。如需詳細資訊,請參閱使用 Python 建置 Lambda 函數 (Lambda 文件)。

如果您使用的是 AWS Glue,請在 Glue 主控台中建立新的 Python shell AWS 任務。如需詳細資訊,請參閱新增 Python shell 任務 (AWSGlue 文件)。 

一般 AWS

更新 Lambda 函數或 Glue AWS 任務。

修改新的 Lambda 函數或 AWS Glue 任務,然後在其他資訊區段中輸入程式碼範例。視需要修改使用案例的程式碼。如需詳細資訊,請參閱使用主控台編輯器 (Lambda 文件) 和使用指令碼 (Glue 文件) 編輯程式碼https://docs.aws.amazon.com/glue/latest/dg/console-edit-script.html AWS

一般 AWS
任務描述所需的技能

執行 Lambda 函數或 Glue AWS 任務。

執行 Lambda 函數或 Glue AWS 任務。如需詳細資訊,請參閱叫用 Lambda 函數 (Lambda 文件) 或使用觸發程序啟動任務 (AWSGlue 文件)。這會擷取 AWS IoT SiteWise 階層中資產和模型的中繼資料屬性,並將其存放在指定的 S3 儲存貯體中。

一般 AWS

設定 AWS Glue 爬蟲程式。

使用 CSV格式化檔案的必要格式分類器來設定 AWS Glue 爬蟲程式。使用 Lambda 函數或 Glue 任務中使用的 S3 AWS 儲存貯體和字首詳細資訊。如需詳細資訊,請參閱定義爬蟲程式 (AWS Glue 文件)。

一般 AWS

執行 AWS Glue 爬蟲程式。

執行爬蟲程式來處理 Lambda 函數或 Glue AWS 任務建立的資料檔案。爬蟲程式會在指定的 Glue Data Catalog AWS 中建立資料表。如需詳細資訊,請參閱 或 使用觸發程序啟動爬蟲程式 (AWS Glue 文件)。

一般 AWS

查詢中繼資料屬性。

使用 Amazon Athena ,視需要使用 標準SQL來查詢 AWS Glue Data Catalog。您可以將中繼資料屬性資料表與其他資料庫和資料表聯結。如需詳細資訊,請參閱入門 (Amazon Athena 文件)。

一般 AWS

相關資源

其他資訊

Code

提供的範例程式碼僅供參考,您可以視需要針對使用案例自訂此程式碼。

# 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()