mcpField
I
impact-analysis

impact-analysis

github.com/happy-technologies-llcクラウド・DevOps4141 回インストール2 日前に更新
リポジトリ

impact-analysis について

impact-analysisは、構成アイテムの変更が依存システムやビジネスサービスに及ぼす影響を評価するServiceNowスキルです。変更管理者やITチーム向けに、CMDBの関係を追跡し、CIの重要度に基づくリスク評価とCAB審査用の情報作成を支援します。

主な機能

  1. 01構成アイテムの検索
  2. 02依存関係の追跡
  3. 03影響を受けるビジネスサービスの特定
  4. 04CIの重要度と変更リスクの評価
  5. 05影響レポートの生成
  6. 06影響を受けるCIと変更リクエストの関連付け

活用シーン

  1. 01データベースサーバーの保守変更の評価
  2. 02アプリケーション導入の影響確認
  3. 03CAB向けの影響情報の準備
  4. 04インシデントのトリアージ時のサービス影響調査

MCP 対応

ServiceNow MCPツールでCI、CMDBの関係、サービス関連付けを検索し、バックグラウンド分析を実行して、影響を受けるCIを変更リクエストに関連付けます。

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/happy-technologies-llc/happy-platform-skills --skill impact-analysis

インストール後、Claude Code で/impact-analysisを入力して読み込まれたか確認します。

詳細

変更影響分析

概要

影響分析では、CI に変更を加えた場合に何が影響を受けるかを特定します。このスキルでは、以下の方法を扱います。

  • CMDB のリレーションを使用して影響経路をたどる
  • 影響を受けるビジネスサービスを特定する
  • CI の重要度をビジネスへの影響にマッピングする
  • CI のリレーションに基づいて変更リスクを定量化する
  • CAB レビュー用の影響レポートを作成する

使用するタイミング: 変更の実施前、インシデントのトリアージ中、キャパシティプランニング時、または新しいデプロイメントの評価時です。

価値提案: 正確な影響分析により、予期しない停止を防ぎ、変更の失敗を減らし、情報に基づいたリスク判断が可能になります。

前提条件

  • ロール: itil、change_manager、または cmdb_read アクセス権
  • アクセス: cmdb_ci、cmdb_rel_ci、cmdb_ci_service、service_ci_assoc テーブル
  • 知識: CMDB のリレーション、サービスマッピングの概念
  • 関連スキル: 先に cmdb/relationship-mapping を完了してください

手順

ステップ 1:変更対象の CI を特定する

まず、変更によって影響を受ける CI を見つけます。

名前で検索:

Tool: SN-Query-Table
Parameters:
  table_name: cmdb_ci
  query: nameLIKEprod-web-01
  fields: sys_id,name,sys_class_name,operational_status,business_criticality

IP アドレスで検索:

Tool: SN-Query-Table
Parameters:
  table_name: cmdb_ci_computer
  query: ip_address=10.0.1.100
  fields: sys_id,name,sys_class_name,operational_status,support_group

便利なツールを使用:

Tool: SN-List-CmdbCis
Parameters:
  ci_class: cmdb_ci_server
  query: name=prod-web-01
  fields: sys_id,name,business_criticality,support_group
ステップ 2:上流への影響をマッピングする(この CI に依存するもの)

変更対象の CI に依存するものをたどります。

直接の依存関係(1 レベル):

Tool: SN-Query-Table
Parameters:
  table_name: cmdb_rel_ci
  query: child=[ci_sys_id]^type.parent_descriptorLIKEDepends
  fields: parent,parent.name,parent.sys_class_name,type.parent_descriptor

依存する CI の詳細を取得:

Tool: SN-Query-Table
Parameters:
  table_name: cmdb_ci
  query: sys_idIN[comma_separated_parent_ids]
  fields: sys_id,name,sys_class_name,business_criticality,operational_status

複数レベルの依存関係チェーン(再帰):

Tool: SN-Execute-Background-Script
Parameters:
  description: Trace full upstream impact
  script: |
    var targetCiId = 'YOUR_CI_SYS_ID';
    var maxDepth = 5;
    var impactedCIs = [];
    var visited = {};

    function traceUpstream(ciId, depth) {
      if (depth > maxDepth || visited[ciId]) return;
      visited[ciId] = true;

      var gr = new GlideRecord('cmdb_rel_ci');
      gr.addQuery('child', ciId);
      gr.addQuery('type.parent_descriptor', 'CONTAINS', 'Depends');
      gr.query();

      while (gr.next()) {
        var parentId = gr.parent.toString();
        var parentCi = new GlideRecord('cmdb_ci');
        if (parentCi.get(parentId)) {
          impactedCIs.push({
            depth: depth,
            sys_id: parentId,
            name: parentCi.name.toString(),
            class: parentCi.sys_class_name.toString(),
            criticality: parentCi.business_criticality.toString()
          });
          traceUpstream(parentId, depth + 1);
        }
      }
    }

    traceUpstream(targetCiId, 1);

    gs.info('=== UPSTREAM IMPACT ANALYSIS ===');
    gs.info('Total CIs impacted: ' + impactedCIs.length);
    impactedCIs.forEach(function(ci) {
      gs.info('Level ' + ci.depth + ': ' + ci.name + ' (' + ci.class + ') - Criticality: ' + ci.criticality);
    });
ステップ 3:影響を受けるビジネスサービスを特定する

ビジネスサービスは依存関係チェーンの最上位にあり、ビジネス価値を表します。

直接関連付けられているサービスを検索:

Tool: SN-Query-Table
Parameters:
  table_name: service_ci_assoc
  query: ci_id=[ci_sys_id]
  fields: service_id,service_id.name,service_id.operational_status

リレーションチェーン経由でサービスを検索:

Tool: SN-Query-Table
Parameters:
  table_name: cmdb_rel_ci
  query: child=[ci_sys_id]^parent.sys_class_nameLIKEcmdb_ci_service
  fields: parent,parent.name,parent.operational_status,parent.busines_criticality

包括的なサービス影響分析:

Tool: SN-Execute-Background-Script
Parameters:
  description: Find all affected business services
  script: |
    var targetCiId = 'YOUR_CI_SYS_ID';
    var affectedServices = [];
    var visited = {};

    function findServices(ciId, path) {
      if (visited[ciId]) return;
      visited[ciId] = true;

      // Check if this CI is a service
      var ci = new GlideRecord('cmdb_ci');
      if (ci.get(ciId)) {
        if (ci.sys_class_name.toString().indexOf('cmdb_ci_service') !== -1) {
          affectedServices.push({
            sys_id: ciId,
            name: ci.name.toString(),
            criticality: ci.business_criticality.toString(),
            path: path.join(' -> ')
          });
          return;
        }
      }

      // Check direct service associations
      var assoc = new GlideRecord('service_ci_assoc');
      assoc.addQuery('ci_id', ciId);
      assoc.query();
      while (assoc.next()) {
        var svc = new GlideRecord('cmdb_ci_service');
        if (svc.get(assoc.service_id)) {
          affectedServices.push({
            sys_id: svc.sys_id.toString(),
            name: svc.name.toString(),
            criticality: svc.business_criticality.toString(),
            path: path.join(' -> ') + ' -> (direct association)'
          });
        }
      }

      // Traverse upstream
      var gr = new GlideRecord('cmdb_rel_ci');
      gr.addQuery('child', ciId);
      gr.query();
      while (gr.next()) {
        var parentId = gr.parent.toString();
        var parentCi = new GlideRecord('cmdb_ci');
        if (parentCi.get(parentId)) {
          findServices(parentId, path.concat([parentCi.name.toString()]));
        }
      }
    }

    var startCi = new GlideRecord('cmdb_ci');
    startCi.get(targetCiId);
    findServices(targetCiId, [startCi.name.toString()]);

    gs.info('=== AFFECTED BUSINESS SERVICES ===');
    gs.info('Total services: ' + affectedServices.length);
    affectedServices.forEach(function(svc) {
      gs.info('Service: ' + svc.name + ' | Criticality: ' + svc.criticality);
      gs.info('  Path: ' + svc.path);
    });
ステップ 4:ビジネス上の重要度を評価する

CI の重要度によって変更リスクのレベルが決まります。

ビジネス上の重要度の値:

値ラベル説明変更リスク
1最も重要中核となるビジネス業務非常に高い
2重要重要なビジネス機能高い
3重要性あり支援機能中程度
4やや重要必須ではない機能低い
5重要ではないビジネスへの影響は最小限非常に低い

総合リスクを計算:

Tool: SN-Execute-Background-Script
Parameters:
  description: Calculate change risk score
  script: |
    var targetCiId = 'YOUR_CI_SYS_ID';
    var impactData = {
      directCriticality: '',
      servicesImpacted: 0,
      criticalServicesImpacted: 0,
      totalDependentCIs: 0,
      riskScore: 0
    };

    // Get target CI criticality
    var targetCi = new GlideRecord('cmdb_ci');
    if (targetCi.get(targetCiId)) {
      impactData.directCriticality = targetCi.business_criticality.toString() || '5';
    }

    // Count dependent CIs and criticality
    var visited = {};
    function countImpact(ciId) {
      if (visited[ciId]) return;
      visited[ciId] = true;

      var gr = new GlideRecord('cmdb_rel_ci');
      gr.addQuery('child', ciId);
      gr.query();

      while (gr.next()) {
        var parentCi = new GlideRecord('cmdb_ci');
        if (parentCi.get(gr.parent)) {
          impactData.totalDependentCIs++;

          if (parentCi.sys_class_name.toString().indexOf('service') !== -1) {
            impactData.servicesImpacted++;
            if (parseInt(parentCi.business_criticality) <= 2) {
              impactData.criticalServicesImpacted++;
            }
          }

          countImpact(gr.parent.toString());
        }
      }
    }

    countImpact(targetCiId);

    // Calculate risk score (1-10)
    var critScore = 6 - parseInt(impactData.directCriticality || 5);
    var svcScore = Math.min(impactData.servicesImpacted * 2, 4);
    var critSvcScore = impactData.criticalServicesImpacted * 2;
    impactData.riskScore = Math.min(critScore + svcScore + critSvcScore, 10);

    gs.info('=== RISK ASSESSMENT ===');
    gs.info('Direct CI Criticality: ' + impactData.directCriticality);
    gs.info('Dependent CIs: ' + impactData.totalDependentCIs);
    gs.info('Services Impacted: ' + impactData.servicesImpacted);
    gs.info('Critical Services: ' + impactData.criticalServicesImpacted);
    gs.info('RISK SCORE: ' + impactData.riskScore + '/10');
    gs.info('Recommendation: ' + (impactData.riskScore >= 7 ? 'CAB REVIEW REQUIRED' : impactData.riskScore >= 4 ? 'Peer Review Recommended' : 'Standard Change Process'));
ステップ 5:影響レポートを作成する

CAB レビュー用の包括的な影響レポートを作成します。

すべての影響データを構造化形式で取得:

Tool: SN-Execute-Background-Script
Parameters:
  description: Generate comprehensive impact report
  script: |
    var targetCiId = 'YOUR_CI_SYS_ID';
    var report = {
      generatedAt: new GlideDateTime().getDisplayValue(),
      targetCI: {},
      upstreamImpact: [],
      downstreamImpact: [],
      affectedServices: [],
      affectedUsers: 0,
      riskLevel: '',
      recommendations: []
    };

    // Target CI details
    var targetCi = new GlideRecord('cmdb_ci');
    if (targetCi.get(targetCiId)) {
      report.targetCI = {
        name: targetCi.name.toString(),
        class: targetCi.sys_class_name.toString(),
        criticality: targetCi.business_criticality.getDisplayValue(),
        environment: targetCi.environment.toString(),
        supportGroup: targetCi.support_group.getDisplayValue(),
        location: targetCi.location.getDisplayValue()
      };
    }

    // Upstream (what depends on this)
    var upGr = new GlideRecord('cmdb_rel_ci');
    upGr.addQuery('child', targetCiId);
    upGr.query();
    while (upGr.next()) {
      var upCi = new GlideRecord('cmdb_ci');
      if (upCi.get(upGr.parent)) {
        report.upstreamImpact.push({
          name: upCi.name.toString(),
          class: upCi.sys_class_name.toString(),
          criticality: upCi.business_criticality.getDisplayValue()
        });
      }
    }

    // Downstream (what this depends on)
    var downGr = new GlideRecord('cmdb_rel_ci');
    downGr.addQuery('parent', targetCiId);
    downGr.query();
    while (downGr.next()) {
      var downCi = new GlideRecord('cmdb_ci');
      if (downCi.get(downGr.child)) {
        report.downstreamImpact.push({
          name: downCi.name.toString(),
          class: downCi.sys_class_name.toString()
        });
      }
    }

    // Services
    var svcAssoc = new GlideRecord('service_ci_assoc');
    svcAssoc.addQuery('ci_id', targetCiId);
    svcAssoc.query();
    while (svcAssoc.next()) {
      var svc = new GlideRecord('cmdb_ci_service');
      if (svc.get(svcAssoc.service_id)) {
        report.affectedServices.push({
          name: svc.name.toString(),
          criticality: svc.business_criticality.getDisplayValue()
        });
      }
    }

    // Estimate affected users (if service has user_base field)
    report.affectedServices.forEach(function(svc) {
      var svcGr = new GlideRecord('cmdb_ci_service');
      svcGr.addQuery('name', svc.name);
      svcGr.query();
      if (svcGr.next() && svcGr.user_base) {
        report.affectedUsers += parseInt(svcGr.user_base) || 0;
      }
    });

    // Risk level
    var criticalCount = report.affectedServices.filter(function(s) {
      return s.criticality === 'Most Critical' || s.criticality === 'Critical';
    }).length;

    if (criticalCount > 0 || report.upstreamImpact.length > 10) {
      report.riskLevel = 'HIGH';
      report.recommendations.push('Schedule during maintenance window');
      report.recommendations.push('Prepare rollback plan');
      report.recommendations.push('Notify affected service owners');
    } else if (report.upstreamImpact.length > 3) {
      report.riskLevel = 'MEDIUM';
      report.recommendations.push('Peer review recommended');
      report.recommendations.push('Test in non-prod first');
    } else {
      report.riskLevel = 'LOW';
      report.recommendations.push('Standard change process');
    }

    gs.info(JSON.stringify(report, null, 2));
ステップ 6:影響分析を変更リクエストに関連付ける

影響分析を変更リクエストに関連付けます。

影響を受ける CI を変更に追加:

Tool: SN-Create-Record
Parameters:
  table_name: task_ci
  data:
    task: [change_request_sys_id]
    ci_item: [affected_ci_sys_id]

影響の概要で変更を更新:

Tool: SN-Update-Record
Parameters:
  table_name: change_request
  sys_id: [change_sys_id]
  data:
    impact: 2  # 1=High, 2=Medium, 3=Low
    risk: "Medium"
    business_duration: "4 hours"
    justification: "Impact analysis shows 5 dependent services, 2 critical"

ツール使用の概要

操作MCP ツールREST エンドポイント
CI を検索SN-Query-Table, SN-List-CmdbCisGET /cmdb_ci
リレーションを照会SN-Query-TableGET /cmdb_rel_ci
サービスを検索SN-Query-TableGET /cmdb_ci_service
サービスの関連付けSN-Query-TableGET /service_ci_assoc
複雑な分析SN-Execute-Background-ScriptPOST /api/sn_chg_rest
変更に関連付けSN-Create-RecordPOST /task_ci

ベストプラクティス

  • 広く調べてから深く掘り下げる: まず第 1 レベルの依存関係をすべて特定し、その後、再帰的にたどります
  • 両方向を考慮する: 影響は上流(依存関係)だけでなく、下流(インフラストラクチャ)にも及びます
  • 時間要因を考慮する: 同じ変更でも、営業時間内とメンテナンス時間帯では影響が異なります
  • 前提を文書化する: CMDB に記録されていないリレーションに関する前提を記録します
  • CAB の前に検証する: CAB に提示する前に、重要な経路を手動で検証します
  • 先に CMDB を更新する: リレーションが不足している場合は、影響分析を完了する前に追加します

リスク評価マトリックス

基準低(1 点)中(2 点)高(3 点)
CI の重要度重要度なし重要重大/最重要
影響を受けるサービス0~12~56 以上
重要なサービス012 以上
ユーザーへの影響100 未満100~10001000 以上
復旧時間1 時間未満1~4 時間4 時間以上

リスクスコアの解釈:

  • 5~7:低リスク - 標準の変更プロセス
  • 8~11:中リスク - ピアレビューが必要
  • 12~15:高リスク - CAB レビューが必要

トラブルシューティング

影響分析で依存関係が表示されない

症状: CI がサービスに明らかに使用されているにもかかわらず、CI の上流への影響がゼロと表示されます 原因: CMDB の関係が不足しています 解決策: cmdb/relationship-mapping スキルを使用して、不足している関係を確認し、作成します

影響の一覧にサービスが表示されない

症状: 影響を受けるはずのビジネスサービスが表示されません 原因: service_ci_assoc レコードまたは関係が不足しています 解決策:

  1. service_ci_assoc で直接の関連付けを確認します
  2. cmdb_rel_ci で関係の連鎖を確認します
  3. 不足している関連付けを作成します
リスクスコアが低すぎるように見える

症状: 重要なインフラストラクチャのリスクスコアが低く表示されます 原因: CI にビジネス上の重要度が設定されていません 解決策: 分析の前に、CI の business_criticality フィールドを更新します

再帰クエリがタイムアウトする

症状: 複雑な環境でバックグラウンドスクリプトがタイムアウトします 原因: 再帰のレベルが多すぎるか、クエリが適切に最適化されていません 解決策: maxDepth を減らすか、制限付きのインデックス付きクエリを使用します

例

例 1:データベースサーバーのメンテナンスによる影響
# 1. Find the database server
Tool: SN-Query-Table
Parameters:
  table_name: cmdb_ci_server
  query: name=prod-db-01
  fields: sys_id,name,business_criticality

# Result: sys_id = abc123, criticality = 2 (Critical)

# 2. Find what runs on this server
Tool: SN-Query-Table
Parameters:
  table_name: cmdb_rel_ci
  query: child=abc123^type.parent_descriptorLIKERuns
  fields: parent.name,parent.sys_class_name

# Result: Oracle DB Instance, MySQL Instance

# 3. Find what depends on these databases
Tool: SN-Query-Table
Parameters:
  table_name: cmdb_rel_ci
  query: child.nameLIKEOracle^ORchild.nameLIKEMySQL
  fields: parent.name,parent.sys_class_name

# Result: ERP Application, HR Portal, Customer Portal

# 4. Find affected services
Tool: SN-Query-Table
Parameters:
  table_name: service_ci_assoc
  query: ci_id.nameLIKEPortal^ORci_id.nameLIKEERP
  fields: service_id.name,service_id.business_criticality

# Result:
#   - Customer Service (Critical)
#   - HR Services (Important)
#   - Finance Operations (Most Critical)

# CONCLUSION: HIGH RISK - 3 services affected, 2 critical
例 2:アプリケーションのデプロイによる影響
# Scenario: Deploying new version of "Portal Frontend" application

# 1. Get application CI
Tool: SN-List-CmdbCis
Parameters:
  ci_class: cmdb_ci_appl
  query: name=Portal Frontend
  fields: sys_id,business_criticality,support_group

# 2. Run full impact analysis script (from Step 5)
# This returns structured JSON with:
# - All dependent CIs
# - Affected services
# - Risk score
# - Recommendations

# 3. Create impact record for change
Tool: SN-Update-Record
Parameters:
  table_name: change_request
  sys_id: CHG0012345_sys_id
  data:
    impact: 2
    risk: "Medium"
    justification: |
      Impact Analysis Results:
      - 1 Business Service Affected: Customer Portal
      - 3 Dependent Components: Load Balancer, CDN, Auth Service
      - Risk Score: 6/10
      - Recommended: Peer review, rollback plan ready

関連スキル

  • cmdb/relationship-mapping - 関係の作成と検証
  • cmdb/ci-discovery - CI の作成と分類
  • cmdb/data-quality - 信頼性の高い影響分析に向けた CMDB の正確性の確保
  • itsm/change-management - 変更要求のワークフロー

参考資料

コメント