service-mapping について
ServiceNow ITOM Service Mappingでサービスのトポロジーを管理・診断する手順を提供するスキルです。運用担当者やサービスオーナー向けに、依存関係やマッピングの不足、ディスカバリーパターンの確認方法を案内し、検証や変更影響の評価に役立ちます。
主な機能
- 01ビジネスサービスのトポロジー表示
- 02サービスマップの完全性と正確性の検証
- 03未マッピングまたは孤立したCIの特定
- 04サービス依存関係の分析
- 05ディスカバリーパターンの確認と診断
- 06サービスとインフラ間のマッピング不足の検出
活用シーン
- 01変更前のビジネスサービス影響評価
- 02欠落または古いサービスマップの調査
- 03ディスカバリーパターンの失敗確認
- 04サービスに関連付いていないインフラCIの特定
MCP 対応
SN-Query-Table、SN-Get-Record、SN-Update-Record、SN-Natural-Language-Search、SN-Execute-Background-Scriptを使い、ServiceNowのサービスマッピングデータを検索、確認、更新します。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ happy-technologies-llc/ happy-platform-skills --skill service-mappingインストール後、Claude Code で/service-mappingを入力して読み込まれたか確認します。
詳細
サービスマッピング
概要
このスキルでは、ServiceNow ITOM Service Mappingでサービスマップを管理するための構造化されたアプローチを提供します。以下の内容を扱います。
- ビジネスサービスのトポロジーを検出して表示する
- サービスマップの完全性と正確性を検証する
- サービスに属するべき、マッピングされていないCIや孤立したCIを特定する
- 影響評価のためにサービスの依存関係チェーンを分析する
- ディスカバリーパターンを確認してトラブルシューティングする
- サービスとその基盤インフラストラクチャ間のマッピングギャップを検出する
使用するタイミング: 運用担当者やサービスオーナーが、サービスのトポロジーを把握したい場合、ディスカバリー結果を検証したい場合、壊れたサービスマップをトラブルシューティングしたい場合、または変更影響分析の準備をしたい場合に使用します。
必要なプラグイン: com.snc.service-mapping
前提条件
- ロール:
sm_admin、sm_user、itil、またはcmdb_read - アクセス権:
cmdb_ci_service、svc_ci_assoc、sa_pattern、cmdb_rel_ciに対する読み取り/書き込み権限 - 知識: CMDB CIクラス、サービスマッピングの概念、ディスカバリーパターンに関する知識
- プラグイン:
com.snc.service-mappingとcom.snc.service-watchが有効化されている必要があります
手順
ステップ1:ビジネスサービスとその健全性を一覧表示する
定義されているすべてのビジネスサービスを取得し、サービスの全体像を把握します。
MCPを使用する場合:
Tool: SN-Query-Table
Parameters:
table_name: cmdb_ci_service
query: active=true^ORDERBYname
fields: sys_id,name,number,operational_status,busines_criticality,owned_by,support_group,sys_class_name,sys_updated_on
limit: 50
REST APIを使用する場合:
GET /api/now/table/cmdb_ci_service?sysparm_query=active=true^ORDERBYname&sysparm_fields=sys_id,name,number,operational_status,busines_criticality,owned_by,support_group,sys_class_name,sys_updated_on&sysparm_display_value=true&sysparm_limit=50
運用ステータスの値:
| 値 | ラベル | 説明 |
|---|---|---|
| 1 | 運用中 | サービスは正常に稼働しています |
| 2 | 修復中 | 修復またはメンテナンス中です |
| 3 | 運用停止 | サービスが停止しています |
| 4 | DR待機中 | 災害復旧の待機状態です |
ステップ2:サービスマップのCI関連付けを表示する
特定のビジネスサービスにマッピングされているすべてのCIを取得し、そのトポロジーを確認します。
MCPを使用する場合:
Tool: SN-Query-Table
Parameters:
table_name: svc_ci_assoc
query: service=[service_sys_id]
fields: sys_id,service,ci_id,ci_id.name,ci_id.sys_class_name,ci_id.operational_status,port,type,is_manual
limit: 100
REST APIを使用する場合:
GET /api/now/table/svc_ci_assoc?sysparm_query=service=[service_sys_id]&sysparm_fields=sys_id,service,ci_id,port,type,is_manual&sysparm_display_value=true&sysparm_limit=100
ステップ3:サービスの依存関係を分析する
ビジネスサービスの上流および下流の依存関係を追跡します。
MCPを使用する場合:
Tool: SN-Execute-Background-Script
Parameters:
description: Map service dependency tree for a business service
script: |
var svcId = '[service_sys_id]';
gs.info('=== SERVICE DEPENDENCY ANALYSIS ===');
// Upstream dependencies (services this service depends on)
gs.info('\n--- UPSTREAM DEPENDENCIES (Depends On) ---');
var upstream = new GlideRecord('cmdb_rel_ci');
upstream.addQuery('child', svcId);
upstream.addQuery('type.name', 'Depends on::Used by');
upstream.query();
while (upstream.next()) {
var parent = upstream.parent.getRefRecord();
gs.info('Depends on: ' + parent.name + ' (' + parent.sys_class_name + ') | Status: ' + parent.operational_status.getDisplayValue());
}
// Downstream dependencies (services that depend on this)
gs.info('\n--- DOWNSTREAM DEPENDENCIES (Used By) ---');
var downstream = new GlideRecord('cmdb_rel_ci');
downstream.addQuery('parent', svcId);
downstream.addQuery('type.name', 'Depends on::Used by');
downstream.query();
while (downstream.next()) {
var child = downstream.child.getRefRecord();
gs.info('Used by: ' + child.name + ' (' + child.sys_class_name + ') | Status: ' + child.operational_status.getDisplayValue());
}
// CI count by class
gs.info('\n--- CI COMPOSITION ---');
var ga = new GlideAggregate('svc_ci_assoc');
ga.addQuery('service', svcId);
ga.addAggregate('COUNT');
ga.groupBy('ci_id.sys_class_name');
ga.query();
while (ga.next()) {
gs.info('Class: ' + ga.ci_id.sys_class_name + ' | Count: ' + ga.getAggregate('COUNT'));
}
REST APIを使用する場合:
# Upstream dependencies
GET /api/now/table/cmdb_rel_ci?sysparm_query=child=[service_sys_id]^type.name=Depends on::Used by&sysparm_fields=parent,type&sysparm_display_value=true
# Downstream dependencies
GET /api/now/table/cmdb_rel_ci?sysparm_query=parent=[service_sys_id]^type.name=Depends on::Used by&sysparm_fields=child,type&sysparm_display_value=true
ステップ4:ディスカバリーパターンを確認する
サービスマッピングパターンを調べ、CIがどのように検出されマッピングされるかを把握します。
MCPを使用する場合:
Tool: SN-Query-Table
Parameters:
table_name: sa_pattern
query: active=true^ORDERBYname
fields: sys_id,name,description,ci_type,status,pattern_type,last_run,run_count,success_count,failure_count
limit: 50
REST APIを使用する場合:
GET /api/now/table/sa_pattern?sysparm_query=active=true^ORDERBYname&sysparm_fields=sys_id,name,description,ci_type,status,pattern_type,last_run,run_count,success_count,failure_count&sysparm_display_value=true&sysparm_limit=50
パターンステータスの参照:
| ステータス | 説明 |
|---|---|
| 準備完了 | パターンを実行する準備ができています |
| 実行中 | パターンを現在実行しています |
| 完了 | 前回の実行が正常に完了しました |
| 失敗 | 前回の実行でエラーが発生しました |
| 無効 | パターンは非アクティブです |
ステップ5:マッピングギャップを特定する
どのビジネスサービスにも関連付けられていないCIを見つけます。
MCPを使用する場合:
Tool: SN-Execute-Background-Script
Parameters:
description: Find CIs with no service association (potential mapping gaps)
script: |
gs.info('=== SERVICE MAPPING GAP ANALYSIS ===');
// Find servers not mapped to any service
var ciClasses = ['cmdb_ci_server', 'cmdb_ci_app_server', 'cmdb_ci_db_instance', 'cmdb_ci_lb'];
for (var i = 0; i < ciClasses.length; i++) {
var className = ciClasses[i];
var gr = new GlideRecord(className);
gr.addQuery('operational_status', '1'); // Operational only
gr.addQuery('install_status', '1'); // Installed
gr.addJoinQuery('svc_ci_assoc', 'sys_id', 'ci_id', true); // LEFT JOIN - no association
gr.setLimit(20);
gr.query();
if (gr.getRowCount() > 0) {
gs.info('\n--- Unmapped ' + className + ' (showing up to 20) ---');
while (gr.next()) {
gs.info('CI: ' + gr.name + ' | IP: ' + gr.ip_address + ' | Location: ' + gr.location.getDisplayValue());
}
}
}
// Count total mapped vs unmapped
gs.info('\n--- MAPPING COVERAGE SUMMARY ---');
var totalCIs = new GlideAggregate('cmdb_ci');
totalCIs.addQuery('install_status', '1');
totalCIs.addAggregate('COUNT');
totalCIs.query();
totalCIs.next();
var total = parseInt(totalCIs.getAggregate('COUNT'));
var mappedCIs = new GlideAggregate('svc_ci_assoc');
mappedCIs.addAggregate('COUNT', 'DISTINCT', 'ci_id');
mappedCIs.query();
mappedCIs.next();
var mapped = parseInt(mappedCIs.getAggregate('COUNT', 'DISTINCT', 'ci_id'));
gs.info('Total installed CIs: ' + total);
gs.info('CIs mapped to services: ' + mapped);
gs.info('Unmapped CIs: ' + (total - mapped));
gs.info('Coverage: ' + Math.round((mapped / total) * 100) + '%');
ステップ6:サービスマップの正確性を検証する
サービスマップとアクティブなアラートを照合し、古くなったマッピングや誤ったマッピングを検出します。
MCPを使用する場合:
Tool: SN-Execute-Background-Script
Parameters:
description: Cross-reference service maps with alerts
script: |
gs.info('=== SERVICE MAP VALIDATION ===');
var svc = new GlideRecord('cmdb_ci_service');
svc.addQuery('active', true);
svc.query();
while (svc.next()) {
// Check for alerts on CIs in this service
var assoc = new GlideRecord('svc_ci_assoc');
assoc.addQuery('service', svc.sys_id.toString());
assoc.query();
var alertCount = 0;
var staleCIs = 0;
while (assoc.next()) {
var ciId = assoc.ci_id.toString();
// Check for active alerts
var alert = new GlideAggregate('em_alert');
alert.addQuery('ci', ciId);
alert.addQuery('state', '!=', 'Closed');
alert.addAggregate('COUNT');
alert.query();
if (alert.next()) {
alertCount += parseInt(alert.getAggregate('COUNT'));
}
// Check for stale CIs (not updated in 90 days)
var ci = new GlideRecord('cmdb_ci');
if (ci.get(ciId)) {
var lastUpdate = new GlideDateTime(ci.sys_updated_on.toString());
var cutoff = new GlideDateTime();
cutoff.addDaysLocalTime(-90);
if (lastUpdate.before(cutoff)) {
staleCIs++;
}
}
}
if (alertCount > 0 || staleCIs > 0) {
gs.info('Service: ' + svc.name + ' | Active Alerts: ' + alertCount + ' | Stale CIs: ' + staleCIs);
}
}
ステップ7:失敗したディスカバリーパターンをトラブルシューティングする
失敗したパターンや予期しない結果を生成したパターンを調査します。
MCPを使用する場合:
Tool: SN-Query-Table
Parameters:
table_name: sa_pattern
query: status=Failed^ORactive=true^failure_count>0
fields: sys_id,name,ci_type,status,last_run,failure_count,success_count,error_message
limit: 20
REST APIを使用する場合:
GET /api/now/table/sa_pattern?sysparm_query=status=Failed^ORactive=true^failure_count>0&sysparm_fields=sys_id,name,ci_type,status,last_run,failure_count,success_count,error_message&sysparm_display_value=true&sysparm_limit=20
ツールの使用方法
MCPツールのリファレンス
| ツール | 使用するタイミング |
|---|---|
SN-Query-Table | サービス、関連付け、パターン、リレーションシップのクエリ |
SN-Get-Record | 単一のサービスまたはパターンレコードの取得 |
SN-Update-Record | サービスステータスまたはパターン設定の更新 |
SN-Natural-Language-Search | 「失敗したパターンがあるサービス」のような自然言語検索 |
SN-Execute-Background-Script | 依存関係の分析、ギャップの検出、一括検証 |
REST API リファレンス
| エンドポイント | メソッド | 目的 |
|---|---|---|
/api/now/table/cmdb_ci_service | GET | ビジネスサービスを検索します |
/api/now/table/svc_ci_assoc | GET | サービスと CI の関連付け |
/api/now/table/sa_pattern | GET | ディスカバリーパターン |
/api/now/table/cmdb_rel_ci | GET | CI の関係と依存関係 |
/api/now/table/em_alert | GET | アラートをサービス CI と相互参照します |
ベストプラクティス
- トップダウンでマッピングする: ビジネスサービスから始めてインフラストラクチャまで下方向にマッピングし、ビジネスコンテキストを確保します
- ディスカバリー後に検証する: 新しいパターンの結果を本番サービスマップに反映する前に、必ず確認します
- カバレッジ指標を監視する: サービスにマッピングされた運用 CI の割合を追跡し、改善目標を設定します
- 手動エントリーは最小限にする: 手動の CI 関連付けではディスカバリーの検証が省略されるため、パターンに基づくマッピングを優先します
- 古いマッピングを確認する: サービスマップから廃止された CI を削除するため、四半期ごとの確認を予定します
- 変更管理と関連付ける: トポロジーの正確性を確保するため、大規模な変更後にサービスマップを検証します
トラブルシューティング
パターンが認証情報エラーで失敗する
原因: ディスカバリーの認証情報の有効期限が切れているか、対象ホストに対する権限がありません 解決策: Discovery Credentials モジュールで認証情報を確認します。MID Server からの SSH/WMI/SNMP 接続をテストします。
サービスマップに CI が表示されない
原因: パターンが CI クラスをカバーしていないか、エントリーポイントが正しくありません 解決策: パターンのエントリーポイント設定を確認します。CI クラスに適用可能なパターンがあるか確認します。MID Server からネットワークに到達できることを確認します。
サービスマップに重複した CI が表示される
原因: 調整ルールが正しく一致せず、CI が重複して作成されています
解決策: 該当する CI クラスの IRE(Identification and Reconciliation Engine)ルールを確認します。discovery_source フィールドに競合するソースがないか確認します。
サービスマップに古いトポロジーが表示される
原因: ディスカバリースケジュールが実行されていないか、パターンが無効になっています
解決策: ディスカバリースケジュールが有効で、正しい MID Server 上で実行されていることを確認します。sa_pattern.last_run を確認して実行状況を検証します。
例
例 1:サービスの完全なトポロジーレポート
# 1. Get the business service
Tool: SN-Query-Table
Parameters:
table_name: cmdb_ci_service
query: name=Email Service
fields: sys_id,name,operational_status,busines_criticality,owned_by
limit: 1
# 2. Get all CIs in the service map
Tool: SN-Query-Table
Parameters:
table_name: svc_ci_assoc
query: service=[service_sys_id]
fields: ci_id,ci_id.name,ci_id.sys_class_name,ci_id.operational_status,port,type
limit: 200
# 3. Get dependency relationships
Tool: SN-Query-Table
Parameters:
table_name: cmdb_rel_ci
query: parent=[service_sys_id]^ORchild=[service_sys_id]
fields: parent,child,type
limit: 50
例 2:変更前の影響評価
# 1. Find all services affected by a CI undergoing change
Tool: SN-Query-Table
Parameters:
table_name: svc_ci_assoc
query: ci_id=[ci_sys_id]
fields: service,service.name,service.busines_criticality,type
limit: 20
# 2. For each affected service, get downstream consumers
Tool: SN-Query-Table
Parameters:
table_name: cmdb_rel_ci
query: parent=[service_sys_id]^type.name=Depends on::Used by
fields: child,child.name,child.sys_class_name
limit: 50
例 3:ディスカバリーパターンの健全性チェック
Tool: SN-Execute-Background-Script
Parameters:
description: Summary of pattern health
script: |
var ga = new GlideAggregate('sa_pattern');
ga.addQuery('active', true);
ga.addAggregate('COUNT');
ga.groupBy('status');
ga.query();
gs.info('=== PATTERN HEALTH SUMMARY ===');
while (ga.next()) {
gs.info('Status: ' + ga.status.getDisplayValue() + ' | Count: ' + ga.getAggregate('COUNT'));
}
関連スキル
itom/alert-analysis- マッピングされたサービスに関連するアラートを分析しますitom/observability-integration- 外部監視をサービスマップと統合しますitom/health-log-analytics- マッピングされたサービスコンポーネントの健全性を監視しますcmdb/relationship-mapping- CMDB の関係管理cmdb/impact-analysis- サービスマップを使用したビジネス影響分析