relationship-mapping について
relationship-mappingは、ServiceNow CMDBでCI間の関係をモデル化し、依存データを管理するスキルです。関係の作成と検証、依存チェーンの分析、孤立CIの検出、関係の健全性確認を扱います。
主な機能
- 01関係タイプと意味の確認
- 02既存のCI関係の検索
- 03関係の作成と検証
- 04依存チェーンの分析
- 05孤立CIの検出
- 06関係の健全性監査
活用シーン
- 01サービスとインフラ間の依存関係のモデル化
- 02変更前の影響範囲の評価
- 03CMDB監査で孤立CIを特定
- 04サービス停止時の依存関係の調査
MCP 対応
SN-Query-Table、SN-Create-Record、SN-Execute-Background-ScriptなどのServiceNow MCPツールで、CMDBの関係を確認、作成、検証、分析します。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ happy-technologies-llc/ happy-platform-skills --skill relationship-mappingインストール後、Claude Code で/relationship-mappingを入力して読み込まれたか確認します。
詳細
CI の関係マッピング
概要
CI 間の関係は、CMDB の価値を支える基盤です。関係がなければ、CI は孤立したデータの島になってしまいます。このスキルでは、以下について説明します。
- 関係タイプとその意味を理解する
- CI 間の関係を作成して検証する
- 影響評価のために依存関係チェーンを分析する
- 関係を持たない孤立した CI を検出する
- 関係の健全性を継続的に維持する
使用する場面: サービスの依存関係をモデル化するとき、変更影響分析の準備をするとき、CMDB の完全性を監査するとき、またはサービス停止のトラブルシューティングを行うときです。
価値提案: 適切にマッピングされた関係により、正確な影響分析が可能になり、変更の失敗を最大 50%削減し、インシデント発生時の MTTR を短縮できます。
前提条件
- ロール:
cmdb_adminまたは CMDB 書き込みアクセス権を持つitil - アクセス: cmdb_rel_ci、cmdb_rel_type、cmdb_ci テーブル
- 知識: CI クラス階層、依存関係モデリングの概念
- 関連スキル: 先に
cmdb/ci-discoveryを完了してください
手順
ステップ 1:関係タイプを理解する
ServiceNow では、cmdb_rel_type に関係タイプが用意されています。各関係には以下があります。
- 親の記述子: 親が子とどのように関係するか
- 子の記述子: 子が親とどのように関係するか
一般的な関係タイプ:
| 関係 | 親の記述子 | 子の記述子 | 使用例 |
|---|---|---|---|
| 実行する | 実行する | ホストする | サーバー上のアプリケーション |
| 依存する | 依存する | 使用される | サービスの依存関係 |
| 含む | 含む | 含まれる | 物理的な包含 |
| 接続する | 接続する | 接続される | ネットワーク接続 |
| データを送信する | データを送信する | データを受信する | データフロー |
| クラスターの | クラスターの | クラスターのメンバー | クラスター |
| 使用する | 使用する | 使用される | 一般的な依存関係 |
利用可能な関係タイプを照会する:
Tool: SN-Query-Table
Parameters:
table_name: cmdb_rel_type
query: active=true
fields: sys_id,name,parent_descriptor,child_descriptor
limit: 100
REST API:
GET /api/now/table/cmdb_rel_type?sysparm_query=active=true&sysparm_fields=sys_id,name,parent_descriptor,child_descriptor&sysparm_limit=100
ステップ 2:既存の関係を照会する
関係を作成する前に、既存の関係を把握します。
CI のすべての関係を検索する:
Tool: SN-Query-Table
Parameters:
table_name: cmdb_rel_ci
query: parent=[ci_sys_id]^ORchild=[ci_sys_id]
fields: parent,child,type,sys_created_on
limit: 50
下流の依存関係を検索する(この CI に依存するもの):
Tool: SN-Query-Table
Parameters:
table_name: cmdb_rel_ci
query: child=[ci_sys_id]^type.parent_descriptorLIKEDepends
fields: parent,parent.name,type,type.parent_descriptor
上流の依存関係を検索する(この CI が依存するもの):
Tool: SN-Query-Table
Parameters:
table_name: cmdb_rel_ci
query: parent=[ci_sys_id]^type.parent_descriptorLIKEDepends
fields: child,child.name,type,type.child_descriptor
ステップ 3:関係を作成する
まず、正しい関係タイプを特定します。
判断マトリックス:
| 親 CI タイプ | 子 CI タイプ | 推奨される関係 |
|---|---|---|
| アプリケーション | サーバー | 実行する |
| ビジネスサービス | アプリケーション | 依存する |
| サーバー | ラック | 含まれる |
| サーバー | サーバー | 接続する(ネットワークの場合) |
| データベース | サーバー | 実行する |
| ロードバランサー | サーバープール | 含む |
関係タイプの sys_id を検索する:
Tool: SN-Query-Table
Parameters:
table_name: cmdb_rel_type
query: nameLIKERuns on::Runs on
fields: sys_id,name,parent_descriptor,child_descriptor
関係を作成する:
Tool: SN-Create-Record
Parameters:
table_name: cmdb_rel_ci
data:
parent: [parent_ci_sys_id]
child: [child_ci_sys_id]
type: [relationship_type_sys_id]
例 - アプリケーションがサーバー上で実行される場合:
Tool: SN-Create-Record
Parameters:
table_name: cmdb_rel_ci
data:
parent: "abc123..." # Application CI sys_id
child: "def456..." # Server CI sys_id
type: "55c95bf6c0a8010e0118ec7056e1c57d" # Runs on::Hosts
ステップ 4:関係を検証する
無効な関係を確認する:
CI が見つからない関係を検索する:
Tool: SN-Execute-Background-Script
Parameters:
description: Find invalid relationships with missing CIs
script: |
var gr = new GlideRecord('cmdb_rel_ci');
gr.addQuery('parent.sys_idISEMPTY^ORchild.sys_idISEMPTY');
gr.query();
gs.info('Invalid relationships found: ' + gr.getRowCount());
while (gr.next()) {
gs.info('Invalid rel: ' + gr.sys_id + ' parent=' + gr.parent + ' child=' + gr.child);
}
重複した関係を検索する:
Tool: SN-Execute-Background-Script
Parameters:
description: Detect duplicate relationships
script: |
var duplicates = new GlideAggregate('cmdb_rel_ci');
duplicates.addAggregate('COUNT');
duplicates.groupBy('parent');
duplicates.groupBy('child');
duplicates.groupBy('type');
duplicates.addHaving('COUNT', '>', 1);
duplicates.query();
gs.info('Duplicate relationship combinations found: ' + duplicates.getRowCount());
while (duplicates.next()) {
gs.info('Duplicate: parent=' + duplicates.parent + ' child=' + duplicates.child + ' type=' + duplicates.type + ' count=' + duplicates.getAggregate('COUNT'));
}
関係タイプの適切性を検証する:
一部の関係タイプは、特定の CI クラスでのみ有効です。値が設定されている場合は、関係タイプの parent_ci_class フィールドと child_ci_class フィールドを確認してください。
ステップ 5:依存関係チェーンを分析する
影響分析には、依存関係チェーン全体を理解することが重要です。
依存関係ツリー全体を取得する(再帰的):
Tool: SN-Execute-Background-Script
Parameters:
description: Build dependency tree for CI
script: |
var ciSysId = 'YOUR_CI_SYS_ID';
var maxDepth = 5;
var visited = {};
var tree = [];
function getDependencies(parentId, depth, direction) {
if (depth > maxDepth || visited[parentId]) return;
visited[parentId] = true;
var gr = new GlideRecord('cmdb_rel_ci');
if (direction === 'down') {
gr.addQuery('child', parentId);
gr.addQuery('type.parent_descriptor', 'CONTAINS', 'Depends');
} else {
gr.addQuery('parent', parentId);
gr.addQuery('type.parent_descriptor', 'CONTAINS', 'Depends');
}
gr.query();
while (gr.next()) {
var targetId = direction === 'down' ? gr.parent.toString() : gr.child.toString();
var targetName = direction === 'down' ? gr.parent.name.toString() : gr.child.name.toString();
tree.push({
depth: depth,
direction: direction,
ci_name: targetName,
ci_sys_id: targetId
});
getDependencies(targetId, depth + 1, direction);
}
}
getDependencies(ciSysId, 1, 'down');
gs.info('Upstream dependencies (what depends on this CI):');
tree.forEach(function(item) {
gs.info(' '.repeat(item.depth) + item.ci_name);
});
クリティカルパスを特定する:
単一障害点があるサービスには、クリティカルパスがあります。
Tool: SN-Query-Table
Parameters:
table_name: cmdb_rel_ci
query: parent.sys_class_name=cmdb_ci_service^type.parent_descriptorLIKEDepends
fields: parent.name,child.name,child.sys_class_name
ステップ 6:孤立した CI を検出する
孤立した CI(関係を持たない CI)は、CMDB の価値を下げ、影響分析を複雑にします。
関係を持たない CI を検索する:
Tool: SN-Execute-Background-Script
Parameters:
description: Find orphan CIs with no relationships
script: |
var orphans = [];
var ciClasses = ['cmdb_ci_server', 'cmdb_ci_appl', 'cmdb_ci_database_instance'];
ciClasses.forEach(function(ciClass) {
var gr = new GlideRecord(ciClass);
gr.addQuery('operational_status', '1');
gr.query();
while (gr.next()) {
var relGr = new GlideRecord('cmdb_rel_ci');
relGr.addQuery('parent', gr.sys_id);
relGr.addOrCondition('child', gr.sys_id);
relGr.setLimit(1);
relGr.query();
if (!relGr.hasNext()) {
orphans.push({
sys_id: gr.sys_id.toString(),
name: gr.name.toString(),
class: ciClass
});
}
}
});
gs.info('Orphan CIs found: ' + orphans.length);
orphans.forEach(function(o) {
gs.info(' ' + o.class + ': ' + o.name + ' (' + o.sys_id + ')');
});
MCP の代替方法 - クエリベースのアプローチ:
Tool: SN-Query-Table
Parameters:
table_name: cmdb_ci_server
query: operational_status=1^sys_idNOT IN(SELECT parent FROM cmdb_rel_ci)^sys_idNOT IN(SELECT child FROM cmdb_rel_ci)
fields: name,ip_address,sys_class_name
limit: 50
注:複雑なサブクエリは REST API 経由では動作しない場合があります。確実性を高めるには、バックグラウンドスクリプトを使用してください。
ステップ 7:関係の健全性を維持する
定期的なクリーンアップスクリプト:
Tool: SN-Execute-Background-Script
Parameters:
description: Clean up invalid relationships
script: |
var deleted = 0;
// Delete relationships where parent CI was deleted
var gr = new GlideRecord('cmdb_rel_ci');
gr.addNullQuery('parent');
gr.query();
while (gr.next()) {
gr.deleteRecord();
deleted++;
}
// Delete relationships where child CI was deleted
gr = new GlideRecord('cmdb_rel_ci');
gr.addNullQuery('child');
gr.query();
while (gr.next()) {
gr.deleteRecord();
deleted++;
}
gs.info('Deleted ' + deleted + ' invalid relationships');
古くなった関係を更新する: CI の運用ステータスが変わると、関係の更新が必要になる場合があります。
Tool: SN-Query-Table
Parameters:
table_name: cmdb_rel_ci
query: parent.operational_status!=1^ORchild.operational_status!=1
fields: sys_id,parent.name,child.name,parent.operational_status,child.operational_status
ツールの使用概要
| 操作 | MCP ツール | REST エンドポイント |
|---|---|---|
| 関係タイプの一覧表示 | SN-Query-Table | GET /cmdb_rel_type |
| 関係のクエリ | SN-Query-Table | GET /cmdb_rel_ci |
| 関係の作成 | SN-Create-Record | POST /cmdb_rel_ci |
| 関係の削除 | SN-Update-Record(非アクティブに設定) | DELETE /cmdb_rel_ci/{id} |
| 複雑なクエリ | SN-Execute-Background-Script | POST /api/sn_chg_rest/change |
| CI 関係 API | 該当なし | GET /cmdb/instance/{id}/relation |
ベストプラクティス
- 双方向の把握: 関係には 2 つの視点(親/子)があることを覚えておきます
- 関係の最小化: すべての運用 CI に少なくとも 1 つの関係を設定します
- タイプの一貫性: 類似する CI パターン間で一貫した関係タイプを使用します
- 循環依存の回避: B が A に依存している場合、A は B に依存しないようにします
- ビジネスコンテキストの記録: 関係属性を使用して、関係が存在する理由を説明します
- 定期監査: 孤立した CI の検出を毎月、無効な関係のクリーンアップを毎週実行します
- ディスカバリーとの連携: 手動で作成した関係を、ディスカバリーで作成された関係と整合させます
トラブルシューティング
依存関係ビューに関係が表示されない
症状: 作成した関係が CI の依存関係ビューに表示されません
原因: 関係タイプが依存関係の可視化用に設定されていません
解決策: cmdb_rel_type レコードを確認し、is_used_by と is_dependency のフラグが適切に設定されていることを確認します
ディスカバリー後に重複した関係ができる
症状: 同じ関係が複数存在します 原因: 手動での作成とディスカバリーが重複しました 解決策: 重複検出スクリプトを実行し、ディスカバリーで作成されたレコードを残して重複を削除します
循環依存が検出される
症状: 影響分析で無限ループの警告が表示されます 原因: CI A が B に依存し、B が C に依存し、C が A に依存しています 解決策: 循環する依存関係を確認して解消します。多くの場合、関係タイプの使い方が誤っていることを示しています
関係タイプが見つからない
症状: ユースケースに適した関係タイプが見つかりません
原因: OOB タイプではすべてのシナリオを網羅できない場合があります
解決策: cmdb_rel_type テーブルを使用してカスタム関係タイプを作成します(cmdb_admin が必要です)
例
例 1:3 層アプリケーションのマッピング
# 1. Identify the CIs
Business Service: "Customer Portal"
Web Application: "Portal Frontend"
App Server: "prod-app-01"
Database: "Portal DB"
DB Server: "prod-db-01"
# 2. Find relationship type sys_ids
Tool: SN-Query-Table
Parameters:
table_name: cmdb_rel_type
query: nameLIKEDepends on^ORnameLIKERuns on
fields: sys_id,name,parent_descriptor
# 3. Create relationships (batch in one message)
# Service depends on Web App
SN-Create-Record: cmdb_rel_ci
parent: [service_sys_id], child: [webapp_sys_id], type: [depends_on_type]
# Web App runs on App Server
SN-Create-Record: cmdb_rel_ci
parent: [webapp_sys_id], child: [appserver_sys_id], type: [runs_on_type]
# Web App depends on Database
SN-Create-Record: cmdb_rel_ci
parent: [webapp_sys_id], child: [database_sys_id], type: [depends_on_type]
# Database runs on DB Server
SN-Create-Record: cmdb_rel_ci
parent: [database_sys_id], child: [dbserver_sys_id], type: [runs_on_type]
例 2:孤立した CI の検出と修復
# 1. Find orphan servers
Tool: SN-Execute-Background-Script
Parameters:
script: [orphan detection script from Step 6]
# 2. For each orphan, determine what it hosts
Tool: SN-Query-Table
Parameters:
table_name: cmdb_ci_appl
query: install_dateLIKE[orphan_ip_address]
fields: name,sys_id
# 3. Create missing relationships
Tool: SN-Create-Record
Parameters:
table_name: cmdb_rel_ci
data:
parent: [app_sys_id]
child: [orphan_server_sys_id]
type: [runs_on_type_sys_id]
関連スキル
cmdb/ci-discovery- CI の作成と分類cmdb/impact-analysis- 影響分析での関係の使用cmdb/data-quality- CMDB データ品質の管理itsm/change-management- 変更と CI の関係