Amazon Web Services ブログ

ServiceNow OT アセットワークスペースと AWS IoT SiteWise アセットモデルの統合

現在のデジタル企業環境において、組織はますます資産管理ソリューションに依存して業務を合理化しています。企業は、複数の IT システムや運用技術 (OT) システムで同じ物理資産を管理する必要に直面することがよくあります。IT チームが企業の IT 資産を追跡・管理するのに役立つサービスの 1 つが ServiceNow です。このサービスは、ハードウェアやソフトウェアの在庫管理、サービス要求、ライセンスコンプライアンス、テクノロジーリソースの完全なライフサイクルを一元的に扱います。一方、OT 向けの AWS IoT SiteWise は、企業が産業機器のデータを大規模に収集、体系化、分析できる管理サービスです。このサービスでは、ライブおよび過去の運用データを統合リポジトリにまとめることができるため、組織は生産効率の向上と資産保守の最適化に役立つデータ駆動型の意思決定ができます。

ServiceNow と AWS IoT SiteWise を一緒に使う際に組織が直面する一般的な課題は、システム間で資産情報を一貫して維持することです。ServiceNow で資産階層が更新されると、運用チームは AWS IoT SiteWise でこれらの変更を手動で複製する必要があり、重複した作業や整合性が損なわれる可能性があります。このプロセスは時間がかかり、エラーが発生しやすく、両環境で同じ資産を管理する無駄が生じます。このブログ記事では、ServiceNow と AWS IoT SiteWise 間で資産データを同期する手法を紹介します。この統合パターンを実装することで、手動による更新を排除し、エラーを減らし、IT と OT プラットフォームで資産階層を一貫して維持できます。

ソリューション概要

このソリューションでは、AWS のサービスを使用して、ServiceNow と AWS IoT SiteWise の間の自動統合を実現しています。 ServiceNow の資産管理システムで変更があった場合、自動的に AWS IoT SiteWise に反映されるため、両システムの同期が維持されます。

Architecture

図 1: アーキテクチャ

図 1 は 2 フェーズのデータフローを示しています。最初のフェーズ (Ingest) では、データが ServiceNow から Amazon AppFlow を経由して Amazon Simple Storage Service (Amazon S3) に移動します。2 番目のフェーズ (Import) では、データは AWS Glue を経由し、AWS IoT SiteWise に到達する前に Amazon S3 に戻ります。 両方のフェーズでは異なる目的がサービスされています。

インジェストフェーズ

  • Amazon AppFlow は、ServiceNow のテーブル (Operations Technology (OT)、OT Entity、OT Entity Type) からアセットデータを取得します。
  • そのデータは、その後 Amazon S3 に parquet 形式で格納されます。

インポートフェーズ

  • AWS Glue は、Parquet ファイルを AWS IoT SiteWise がインポートできる JSON 形式 に変換します。
  • 変換された JSON ファイルは、Amazon S3 に保存されます。
  • AWS IoT SiteWise は、アセット情報をインポートしてアセットモデルと階層を作成または更新します。

実装の概要

この投稿では、この統合を実装するための以下の段階を提示しています:

  • Amazon AppFlow で ServiceNow コネクタを構成し、アセットデータを Amazon S3 に取り込みます。
  • AWS Glue ジョブを作成し、データを parquet 形式から JSON 形式に変換して、AWS IoT SiteWise インポートの必須フォーマットに一致させます。
  • Amazon S3 から AWS IoT SiteWise へのアセットインポートを設定します。

前提条件

このソリューションを実装する前に、次のものが必要です。

  • アセットテーブルへのアクセス権を持つ ServiceNow インスタンス。この例では、次のものを使用します。
    • Operations Technology (OT) (cmdb_ci_ot): ServiceNow からのOTデバイスレコード。これらのレコードには、名前、シリアル番号、モデル番号、メーカー、および場所情報などの基本的な属性が含まれます。
    • OT Entity (cmdb_ot_entity): OT エンティティインスタンスとそれらの関係を定義したレコードが含まれています。また、運用階層でデバイスがどのように接続されているかを表しています。
    • OT Entity Type (cmdb_ot_entity_type): OT エンティティ (Area、Process Cell、Unit、Equipment Module など) のタイプまたはカテゴリを定義したレコードが含まれています。また、運用階層内で許可される親子関係も定義します。
  • 3 つのテーブルがそれぞれの役割を連携して、OT アセットの全体像を提供します。
    • cmdb_ci_otは物理デバイス情報 (構成項目) を処理します。
    • cmdb_ot_entityはこれらのデバイスのインスタンスと関係性を管理します。
    • cmdb_ot_entity_typeは階層構造のルールとカテゴリを定義します。
  • Amazon AppFlow、Amazon S3、AWS Glue、AWS IoT SiteWise を使用するための権限を持つ AWS アカウント。
  • アセットテーブルの読み取り権限を持つ system-only user の ServiceNow 認証情報。

実装

ServiceNow コネクタの構成

このセクションでは、Amazon AppFlow を設定して ServiceNow からデータを取り込み、AWS Glue でデータをカタログ化します。

Amazon AppFlow で ServiceNow コネクタを作成する

  1. Amazon AppFlow コンソールに移動します。
  2. 左側のメニューから、Connections の下の ServiceNow をコネクタのドロップダウンから選択します。
  3. Create connection を選択します。
  4. Connect to ServiceNow のポップアップで、図 2 を参照し、次の情報を入力します。
    1. 必要に応じて Basic Auth または OAuth2 を選択します。
    2. ユーザーガイド に従って必要な情報を入力します。
      1. OAuth2 を選択した場合は、ServiceNow インスタンスの Client ID、Client secret、Instance URL を入力します。
      2. Basic Auth を選択した場合は、ServiceNow インスタンスの Username、Password、Instance URL を入力します。
    3. すべての情報を入力したら、connect をクリックします。

Connect to ServiceNow

図 2: ServiceNow に接続する

各テーブルごとにフローを作成します

  1. Amazon AppFlow コンソールに移動します。
  2. 左側のメニューで、Flows の下にある Create flow を選択します。
  3. Flow Name (例: cmdb_ci_ot) を入力し、図 3 を参照の上、Next を選択します。

Create flow

図 3: フローを作成する

  1. 「ソース詳細」ダイアログボックスで (図 4 参照)、次の内容を入力します:
    1. 「ソース名」では、ServiceNow を選択します。
    2. 「前に作成した接続が ServiceNow コネクタの下で選択されていることを確認してください。参照名は、お使いの ServiceNow インスタンス名になります。この例では “dev287617” を使用しています。
    3. ServiceNow オブジェクトでは、Operational Technology (OT) を選択します。
  2. 宛先詳細ダイアログボックス (図 4 参照) に移動し、次の内容を入力します:
    1. 宛先名では、Amazon S3 を選択します。
    2. バケット詳細の下で、宛先のバケットを選択するか、新しく作成 (Amazon S3 コンソールから)します。この例ではバケットプレフィックス cmdb_ci_ot を使用しています。
  3. Next を選択します。

Flow source and destination

図 4: フローのソースと送信先

  1. ソース から 宛先 へのフィールド マッピング ダイアログボックスで (図 5 参照)、以下の作業を行います。
    1. ソース フィールド名の下で、すべてのフィールドを直接マップするを選択します。
    2. Next を選択し、続けて Next を選択します。
    3. 最後に フローを実行 を選択して完了します。

Run flow

図 5: 実行フロー

すべてのテーブルに対してフローを作成する “Create flows for each table” の手順を繰り返し、他の ServiceNow オブジェクトとの接続を作成してください:

  1. フロー名と Amazon S3 プレフィックス: cmdb_ot_entity、ServiceNow オブジェクト: OT Asset。
  2. フロー名と Amazon S3 プレフィックス: cmdb_ot_entity_type、ServiceNow オブジェクト: OT Asset Type。

AWS Glue Crawler をセットアップし、スキーマを特定するために実行

  1. AWS Glue コンソールに移動します。
  2. 左のメニューから Data Catalog の下にある Crawlers を選択します。
  3. Crawlers ダイアログボックス (図 6 参照) で、Create crawler を選択します。

AWS Glue crawlers

図 6: AWS Glue Crawlers

  1. Crawler 名には ServiceNow Crawler を使い、Next を選択してください。

Crawler properties

図 7: Crawler の properties

  1. Add an S3 data source を選択します。
  2. Add an S3 data source ダイアログボックスで (図 8 を参照)、以下の手順に従います。
    1. データソースとして S3 を選びます。
    2. S3 pathとして <your_bucket_name>を入力します。
    3. Add an S3 data source を選択します。

Crawler data source
図 8: Crawler data source

  1. Next を選択します。
  2. IAM ロールの項目で、Create new IAM role を選択してください (図 9 を参照)。

Crawler IAM Role

図 9: Crawler IAM Role

  1. ロールの名前を決めます。この例では AWSGlueServiceRole-ServiceNowCrawlerを使用します。
  2. Next を選択します。
  3. ターゲットデータベースの下で、AWS Glue データベースを選択します。この例ではデフォルトのデータベースを使用しています。

AWS Glue Database

図 10: AWS Glue データベースの選択

  1. Next を選択します。
  2. Createを選択します。
  3. クロールを実行します。完了するのに約 2 分かかります。

ServiceNow の Parquet データは、Amazon S3 にインポートされました。

JSON ファイルの変換

このセクションでは、AWS Glue ジョブを設定して parquet ファイルを AWS IoT SiteWise に適した JSON 形式に変換し、データを AWS IoT SiteWise にインポートします

AWS Glue ジョブを作成

  1. AWS Glue コンソールに移動します。
  2. 左側のメニューから、ETL Jobs の下にある Visual ETL を選択します。
  3. Create Jobで、 Visual ETL を選択します。

AWS Glue studio

図 11: AWS Glue Studio

  1. Source ノードを作成します。青い プラス (+) ボタンを選択し (図 12 参照)、Amazon S3 を選択してください。

Visual ETL

図 12: Visual ETL

  1. Name では、図 13 のようにノードの名前を任意につけてください。ここでは cmdb_ot_entity とします。
  2. S3 source type では、 Data Catalog table を選択してください。
  3. Database では、前に AWS Glue Crawler のセットアップ時に選択したターゲットデータベースを選んでください。
  4. Table では、最初の表cmbd_ot_entityを選択してください。この手順を cmdb_ci_otcmdb_ot_entity_typeの各テーブルについて繰り返してください

Adding source node

 図 13: ソースノードの追加

アセットを AWS IoT SiteWise のインポート形式にマップする

  1. 図 12 に示されている青い「+」ボタンを選択して、新しい Source ノードを作成してください。
  2. Transform ノードを追加し、SQL Query を選択してください。
  3. Name には「assets」を使用してください。
  4. Node parents には、ソースノード cmdb_ot_entitycmdb_ci_ot を選択してください。。
  5. Input sources と SQL Aliases には、図 14 に示すように、それぞれ cmdb_ot_entitycmdb_ci_ot を選択してください。

assets transform

図 14: アセットの変換

  1. SQL Query に次のクエリをコピー & ペーストしてください。
SELECT DISTINCT
    parent.sys_id as assetExternalId,
    parent.name as assetName,
    parent.ot_asset_type as assetModelExternalId,
    COLLECT_LIST(
        CASE 
            WHEN child.sys_id IS NOT NULL THEN 
                STRUCT(
                    array_join(array(parent.ot_asset_type, child.ot_asset_type), '-') as externalId,
                    child.sys_id as childAssetExternalId
                )
        END
    ) as assetHierarchies,
    (
        CASE 
            WHEN ot.sys_id IS NOT NULL THEN 
                array(
                    STRUCT('name' as externalId, ot.name as attributeValue),
                    STRUCT('serial_number' as externalId, ot.serial_number as attributeValue),
                    STRUCT('manufacturer' as externalId, ot.manufacturer as attributeValue),
                    STRUCT('model_number' as externalId, ot.model_number as attributeValue),
                    STRUCT('firmware_version' as externalId, ot.firmware_version as attributeValue),
                    STRUCT('hardware_version' as externalId, ot.hardware_version as attributeValue),
                    STRUCT('asset_tag' as externalId, ot.asset_tag as attributeValue),
                    STRUCT('category' as externalId, ot.category as attributeValue),
                    STRUCT('environment' as externalId, ot.environment as attributeValue),
                    STRUCT('short_description' as externalId, ot.short_description as attributeValue)
                )
            ELSE array()
        END
    ) as assetProperties
FROM cmdb_ot_entity as parent
LEFT JOIN cmdb_ci_ot as ot
    ON parent.ot_asset = ot.sys_id
LEFT JOIN cmdb_ot_entity as child
    ON parent.sys_id = child.parent
GROUP BY parent.sys_id, parent.name, parent.ot_asset_type, ot.sys_id, ot.name, ot.serial_number, ot.manufacturer, ot.model_number, ot.firmware_version, ot.hardware_version, ot.asset_tag, ot.category, ot.environment, ot.short_description

asset model をマッピングする

  1. 図 12 に示されている青い「+」ボタンを選択して、新しい Source ノードを作成します。
  2. 新しい Transform ノードを追加し、SQL Query を選択します。
  3. Name には「assetModels」を使用します。
  4. Node Parents では、ソースノード cmdb_ot_entity_type を選択します。
  5. Input sources と SQL Aliases では、図 15 に示されているように、それぞれ cmdb_ot_entity_type を使用します。

assetModel transform

図 15: assetModel 変換

  1. SQL Query に次のクエリをコピー & ペーストしてください。
SELECT DISTINCT
    parent.sys_id as assetModelExternalId,
    parent.label as assetModelName,
    (
        CASE 
            WHEN parent.ot_table IS NOT NULL THEN 
                from_json(
                '[{"dataType":"STRING","externalId":"name","name":"Name","type":{"attribute":{"defaultValue":"-"}},"unit":"-"},{"dataType":"STRING","externalId":"serial_number","name":"Serial Number","type":{"attribute":{"defaultValue":"-"}},"unit":"-"},{"dataType":"STRING","externalId":"manufacturer","name":"Manufacturer","type":{"attribute":{"defaultValue":"-"}},"unit":"-"},{"dataType":"STRING","externalId":"model_number","name":"Model Number","type":{"attribute":{"defaultValue":"-"}},"unit":"-"},{"dataType":"STRING","externalId":"firmware_version","name":"Firmware Version","type":{"attribute":{"defaultValue":"-"}},"unit":"-"},{"dataType":"STRING","externalId":"hardware_version","name":"Hardware Version","type":{"attribute":{"defaultValue":"-"}},"unit":"-"},{"dataType":"STRING","externalId":"asset_tag","name":"Asset Tag","type":{"attribute":{"defaultValue":"-"}},"unit":"-"},{"dataType":"STRING","externalId":"category","name":"Category","type":{"attribute":{"defaultValue":"-"}},"unit":"-"},{"dataType":"STRING","externalId":"environment","name":"Environment","type":{"attribute":{"defaultValue":"-"}},"unit":"-"},{"dataType":"STRING","externalId":"short_description","name":"Short Description","type":{"attribute":{"defaultValue":"-"}},"unit":"-"}]',
                    'array&amp;lt;struct&amp;lt;dataType:string,externalId:string,name:string,type:struct&amp;lt;attribute:struct&amp;lt;defaultValue:string&amp;gt;&amp;gt;,unit:string&amp;gt;&amp;gt;'
                )
            ELSE array()
        END
    ) as assetModelProperties,
    COLLECT_LIST(
        CASE 
            WHEN child.sys_id IS NOT NULL THEN 
                STRUCT(
                    array_join(array(parent.sys_id, child.sys_id), '-') as externalId,
                    child.name as name,
                    child.sys_id as childAssetModelExternalId
                )
        END
    ) as assetModelHierarchies
FROM cmdb_ot_entity_type as parent
LEFT JOIN cmdb_ot_entity_type as child
    ON parent.sys_id = child.parent_type
GROUP BY parent.sys_id, parent.name, parent.label, parent.ot_table

assetsと asset model を組み合わせる

  1. 図 12 に示されているように、青色の 「+」 ボタンを選択して新しい Source ノードを作成します。
  2. 新しい Transform ノードを追加し、SQL Query を選択します。
  3. Name には 「assetModelHierarchy」 を使用します。
  4. Node parents には、Source ノード assetsassetModels を選択します。
  5. Input sources と SQL aliases には、図 16 のように assets assetModels を使用します。

assetModelHierarchy transform

図 16: assetModelHierarchy 変換

  1. SQL Query に次のクエリをコピー & ペーストしてください。
SELECT (
    SELECT COLLECT_LIST(STRUCT(assetModels.*)) as assetModels
    FROM assetModels
) as assetModels,
(
    SELECT COLLECT_LIST(STRUCT(assets.*)) as assets
    FROM assets
) as assets

AWS Glue ジョブ の結果を AWS IoT SiteWise にインポートするために使用するよう、変換のターゲットを追加しましょう。

変換のターゲットを追加する

  1. 図 12 に示されている青い 「+」 ボタンを選択して、新しいソースノードを作成します。
  2. 新しいノード Transform を追加し、ターゲットから Amazon S3 を選択します。
  3. Name は何でも構いません。この例では Amazon S3 を使用しています。
  4. Node Parents は、ソースノード assetModelHierarchy を選択します。
  5. Format は JSON を選択します。
  6. Compression TypeNone を選択します。
  7. S3 Target Location は <your_destination_bucket> を選択します。

Adding target node

図 17: ターゲットノードの追加

完了すると、図 18 に示すような ETL を確認できるはずです。Save を選択してください。 それから Run を選択し、完了するまで待ちます。
Asset hierarchy

図 18: アセットの階層

AWS IoT SiteWise への取り込み

このセクションでは、Amazon S3 内の JSON ファイルの作成を確認し、AWS IoT SiteWise に ServiceNow のアセットをインポートします。

  1. まず、次の操作を行って JSON ファイルが作成されたことを確認します。
    1.  Amazon S3 コンソールを開きます。
    2. <your_destination_bucket>を選択します。
    3. run-<timestamp>-part-r-00000 ファイルを選択後、アクションをクリック。
    4. オブジェクトの名前変更を選択し、sitewise-import.json に変更する。AWS IoT SiteWise にインポートするためには、ファイル名に .json の拡張子を付ける必要があります。
  2. AWS IoT SiteWise にインポートするには、AWS IoT SiteWise コンソールを開きます。
    1. ナビゲーションペインで Bulk Operations を選択します。
    2. New Import を選択します。AWS IoT SiteWise bulk operations
      図 19: AWS IoT SiteWise bulk operations
    3. Import metadata からS3 URI に <your_destination_bucket> を選択し sitewise-import.json ファイルを指定します。S3 import
      図 20: S3 import
    4. Import を選択し、インポートが完了するまで待ちます。

作業の検証

図 21 に示されているように、さまざまなモデルとモデルプロパティを表示できるようになりました。また、図 22、23、24 に示されているように、さまざまなアセットとアセットプロパティも表示できます。あなたの ServiceNow 階層が AWS IoT SiteWise に正常に複製されました。

AWS IoT SiteWise models

図 21: AWS IoT SiteWise モデル

AWS IoT SiteWise model properties

図 22: AWS IoT SiteWise のモデルプロパティ

AWS IoT SiteWise assets

図 23: AWS IoT SiteWise アセット

AWS IoT SiteWise asset properties

図 24: AWS IoT SiteWise のアセットプロパティ

クリーンアップ

このブログで説明した作業をクリーンアップするには、Amazon AppFlow コンソールに移動し、フローと ServiceNow コネクタを削除します。ServiceNow で作成したユーザーとユーザー認証情報を削除します。AWS Glue では、Crawler 、ジョブ、AWS Glue データカタログからテーブルを削除します。AWS IoT SiteWise からアセットとアセットモデルを削除します。最後に、Amazon S3 バケットからParquetと JSON 形式のファイルの両方を削除します。

まとめ

このブログでは、ServiceNow のアセットデータと AWS IoT SiteWise を統合するプロセスを紹介しました。 このプラクティスにより、組織は IT と OT のアセット管理ソリューション間で一貫したアセット情報を保持できます。 この統合を完全に自動化するには、Amazon AppFlow のフローに定期的に実行するようにスケジューリングし、AWS Glue ジョブにスケジュールのトリガーを設定します。 AWS Glue ジョブを設定する際、ETL スクリプト経由で出力ファイルに ‘.json’ 拡張子を付与することもできます。 これらの 2 つのソリューションにより、手動でのデータ入力を排除し、IT システムと OT システム間の整合性が保たれます。

AWS IoT SiteWise の詳細を知りたい場合は、AWS IoT SiteWise Developer Guide をご覧ください。

この記事は Mariaと Brent によって書かれた Integrating ServiceNow OT Asset Workspaces with AWS IoT SiteWise Asset Models の日本語訳です。この記事はソリューションアーキテクトの服部が翻訳しました。


About the authors


Maria El Khoury : AWS のソリューションアーキテクト。製造業のデジタルトランスフォーメーションを支援し、IoT やコンピュータビジョンの経験を活かし、産業用 IoT やサプライチェーン分野への AWS 適用に注力。


Brent Van Wynsberge : AWS のソリューションアーキテクト。エンタープライズ顧客のクラウド導入を支援し、 IoT や DevOps 、データ分析、コンテナ技術にも関心を持つ。


Kazunari Hattori 自動車業界担当のソリューションアーキテクト。CCoE 立ち上げや工場 IoT の導入、クラウド活用の推進に注力。AWS の IoT の技術コミュニティに所属。 第二種電気工事士。今春キャンピングカーをレンタルして秩父にキャンプに行きました。