データレイク内の AWS IoT SiteWise メタデータ属性の抽出とクエリ - AWS 規範ガイダンス

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

データレイク内の AWS IoT SiteWise メタデータ属性の抽出とクエリ

作成者: Ambarish Dongaonkar (AWS)

環境:本稼働

テクノロジー: IoT、分析、ビッグデータ

AWS サービス: AWS IoT SiteWiseAWSLambdaAWS、Glue

[概要]

AWS IoT SiteWise は、アセットモデルと階層を使用して、産業機器、プロセス、施設を表します。各モデルまたはアセットには、環境固有の複数の属性が含まれる場合があります。メタデータ属性の例には、アセットの設置場所または物理的な場所、プラントの詳細、機器識別子などがあります。これらの属性値は資産測定データを補完し、ビジネス価値を最大化します。機械学習 (ML) は、このメタデータをさらに詳しく把握し、エンジニアリングタスクを効率化します。

ただし、メタデータ属性を AWS IoT SiteWise サービスから直接クエリすることはできません。属性をクエリ可能にするには、属性を抽出してデータレイクに取り込む必要があります。このパターンは、Python スクリプトを使用してすべての AWS IoT SiteWise アセットの属性を抽出し、Amazon Simple Storage Service (Amazon S3) バケットのデータレイクに取り込みます。このプロセスが完了したら、Amazon Athena のSQLクエリを使用してAWSIoT SiteWise メタデータ属性や、測定データセットなどの他のデータセットにアクセスできます。メタデータ属性情報は、AWSIoT SiteWise モニターまたはダッシュボードを操作する場合にも役立ちます。S3 バケットで抽出された属性を使用してAWS QuickSight ダッシュボードを構築することもできます。

パターンにはリファレンスコードがあり、AWSLambda や AWS Glue などのユースケースに最適なコンピューティングサービスを使用してコードを実装できます。

前提条件と制限

前提条件

  • アクティブ AWS アカウント。

  • AWS Lambda 関数または Glue AWS ジョブを設定するアクセス許可。

  • Amazon S3 バケット。

  • アセットモデルと階層は AWS IoT SiteWise で設定されます。詳細については、「アセットモデルの作成AWS」 (IoT SiteWise ドキュメント) を参照してください。

アーキテクチャ

Lambda 関数または AWS Glue ジョブを使用して、このプロセスを完了できます。モデル数が 100 未満で、各モデルの属性が平均 15 個以下の場合は、Lambda を使用することをお勧めします。他のすべてのユースケースでは、Glue AWS を使用することをお勧めします。

以下の図で、ソリューションアーキテクチャとワークフローを示します。

アーキテクチャ図は、ここで説明されている抽出とクエリのプロセスを表しています。
  1. スケジュールされた AWS Glue ジョブまたは Lambda 関数が実行されます。AWS IoT SiteWise からアセットメタデータ属性を抽出し、S3 バケットに取り込みます。

  2. AWS Glue クローラーは、抽出されたデータを S3 バケットにクロールし、AWSGlue データカタログにテーブルを作成します。

  3. 標準の を使用してSQL、Amazon Athena は AWS Glue データカタログのテーブルをクエリします。

自動化とスケール

AWS IoT SiteWise アセット設定の更新頻度に応じて、Lambda 関数または AWS 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 関数または AWS Glue ジョブが引き受けるIAMロールに、以下を実行するアクセス許可を付与します。

  • AWS IoT SiteWise サービスからの読み取り

  • S3 バケットに書き込む

詳細については、AWS「 サービスのロールの作成」 (IAM ドキュメント) を参照してください。

全般 AWS

Lambda 関数または Glue AWS ジョブを作成します。

Lambda を使用している場合は、新しい Lambda 関数を作成します。[Runtime] (ランタイム) では、[Python] を選択します。詳細については、「Python を使用した Lambda 関数のビルド」(Lambda ドキュメント) を参照してください。

AWS Glue を使用している場合は、Glue AWS コンソールで新しい Python シェルジョブを作成します。詳細については、Python シェルジョブの追加 (AWS Glue ドキュメント) を参照してください。 

全般 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 ドキュメント) を参照してください。これにより、AWSIoT SiteWise 階層内のアセットとモデルのメタデータ属性が抽出され、指定された S3 バケットに保存されます。

全般 AWS

AWS Glue クローラをセットアップします。

CSV形式のファイルに必要な形式分類子を使用して AWS Glue クローラを設定します。Lambda 関数または Glue ジョブで使用される S3 AWS バケットとプレフィックスの詳細を使用します。詳細については、「クローラーの定義」 (AWS Glue ドキュメント) を参照してください。

全般 AWS

AWS Glue クローラを実行します。

クローラを実行して、Lambda 関数または Glue AWS ジョブによって作成されたデータファイルを処理します。クローラは、指定された AWS Glue データカタログにテーブルを作成します。詳細については、「」または「トリガーを使用したクローラの開始」 (AWS Glue ドキュメント) を参照してください。

全般 AWS

メタデータ属性をクエリします。

Amazon Athena を使用して、 標準 を使用して、ユースケースに応じて Glue Data Catalog AWS をSQLクエリします。メタデータ属性テーブルは、他のデータベースやテーブルと結合できます。詳細については、「開始方法」(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()