サービスNow: XOpsストーリーとの統合を設定する

概要

XOpsは、XOpsストーリーと外部サービス管理プラットフォーム間の双方向同期をサポートしています。 この統合により、プラットフォーム間で調査活動を整合させることができ、一方のプラットフォームで行った更新が他方に反映されます。

詳細については、サービス管理プラットフォームと双方向統合を作成するを参照してください。

サービスNow統合の設定

サービスNowの統合を設定するには、次の5つの手順を完了します。

手順1: カスタムフィールドの作成

Cato管理アプリケーション(CMA)でチケット制されたときに入力されるフィールドを作成します。

カスタムフィールドを作成するには:

  1. サービスNowプラットフォームにログインします。
  2. 任意のインシデントを開きます。
  3. 上部バナーから右クリックして 設定 > フォームビルダー に進みます。
  4. 必要に応じてフォームビルダーを試してみることに同意し、デフォルトビューを選択します。
  5. インシデントテーブルで新しいフィールドを追加をクリックします。
  6. 次のフィールドを追加します:

    • CMAアカウントID

      • タイプ: 整数
      • プロパティ: 参照のみ、必須、アクティブ
    • CMAストーリーID

      • タイプ: 文字列
      • プロパティ: 参照のみ、必須、アクティブ

手順2: CMAでサービスAPIキーを作成

サービスAPIキーは、外部ツールやサービスとのスケーラブルな統合を可能にし、このフォーマットで作成されます: R=<...>|K=<...>。 サービスAPIキーの作成方法についての詳細は、Cato APIのためにAPIキーを生成するをご覧ください。

サービスAPIキーを作成したら、コピーして保存し、サービスNowプラットフォームに入力できるようにします。

手順3: 安全なシステムプロパティにAPIキーを安全に保存

サービスNowプラットフォームで、安全なシステムプロパティを作成してAPIキーを保存します。

安全なシステムプロパティを作成するには:

  1. https://<お使いのインスタンス>.service-now.com/sys_properties_list.do に移動します
  2. 新規をクリックします。
  3. システムプロパティ新規レコードフォームで、次の詳細を追加します:

    SN5.png
    • 名前: cma_prod_api_key
    • タイプ: パスワード2
    • 値: ステップ2で作成したサービスAPIキー
  4. 送信をクリックします。

手順4: RESTメッセージを作成

サービスNowのインシデントからCatoに詳細を送信するRESTメッセージを作成します:

RESTメッセージを作成するには:

  1. サービスNowプラットフォームで、すべて>システムWebサービス>アウトバウンド>RESTメッセージに進みます。
  2. 新規をクリックします。
  3. RESTメッセージフォームで、以下の詳細を追加します:

    • 名前: RESTメッセージの名前を追加
    • エンドポイント: https://<お使いのCatoアカウント名>.cc.catonetworks.com/api/v1/graphql2
    • 認証タイプ: 認証なし
    • HTTPメソッド: 新規をクリックして次の詳細を追加します:

      • 名前: 名前を追加
      • HTTPメソッド: POST
      • エンドポイント: https://<お使いのCatoアカウント名>.cc.catonetworks.com/api/v1/graphql2
  4. 送信をクリックします。

手順5: ビジネスルールを作成

RESTメッセージをトリガーするビジネスルールを作成します。

ビジネスルールを作成するには:

  1. サービスNowプラットフォームで、すべて> システム定義> ビジネスルールに進みます。
  2. 新規をクリックします。
  3. ビジネスルール新規レコードフォームで、次の詳細を追加します:

    SN6.png
    • 名前: ビジネスルールの名前を追加
    • テーブル: インシデント
    • タイミング: 後
    • 更新: 真 (チェックボックスをオンにする)
    • フィルター条件: コメントの変更
  4. 詳細設定タブで、このスクリプトを追加します:

    (function executeRule(current, previous) {
      try {
        var lastComment = current.comments.getJournalEntry(1) || '';
        lastComment = stripJournalHeader(lastComment);
        if (!lastComment) {
          gs.info("GraphQL webhook: Empty comment, skipping " + current.number);
          return;
        }
        var accountId = current.u_cma_account_id;
        var storyId = current.u_cma_story_id;
            gs.info("GraphQL webhook: accountId " + accountId + " story " + storyId);
        if (!accountId || !storyId) {
          gs.error("GraphQL webhook: Missing accountId/storyId for " + current.number);
          return;
        }
        var gqlQuery =
          "mutation CreateStoryComment($accountId: ID!, $input: AddStoryCommentInput!) {" +
          "  xdr(accountId: $accountId) {" +
          "    addStoryComment(input: $input) {" +
          "      comment { id type __typename }" +
          "      __typename" +
          "    }" +
          "    __typename" +
          "  }" +
          "}";
        var body = {
          query: gqlQuery,
          variables: {
            accountId: accountId.toString(),
            input: {
              type: "USER",
              storyId: storyId.toString(),
              text: lastComment
            }
          }
        };
            var apiKey = gs.getProperty('cma_prod_api_key');
        var r = new sn_ws.RESTMessageV2('Update XDR story comments CMA Prod', 'post');
        r.setRequestHeader('Content-Type', 'application/json');
        r.setRequestHeader('Accept', 'application/json');
            r.setRequestHeader('x-api-key', apiKey);
        r.setRequestBody(JSON.stringify(body));
        //var response = r.execute(); // can be changed to Async - only for debug purposes
            var eccSysId = r.executeAsync();
        gs.info("GraphQL webhook queued, ECC sys_id=" + eccSysId);
        var status = response.getStatusCode();
        var responseBody = response.getBody();
      // Safe logging (see next section for masking)
         gs.info("GraphQL webhook: status=" + status);
         gs.info("GraphQL webhook: responseBody=" + responseBody);
      } catch (ex) {
        gs.info("GraphQL webhook: Failed: " + ex.message);
      }
      function stripJournalHeader(text) {
        text = text || '';
        if (text.indexOf('\n') > -1) {
          return text.split('\n').slice(1).join('\n').trim();
        }
        return text.trim();
      }
    })(current, previous);
  5. 送信をクリックします。

トラブルシューティング

次のいずれかで問題やエラーを特定できます:

  • システムログ: システムログ > すべてに移動し、GraphQL webhookを含むメッセージを検索します。
  • ECCレコード: https://<インスタンス>.service-now.com/sys_ecc_queue_list.do に移動し、ログに記録されたECC sys_idを持つECCレコードを見つけます。

一般的な問題

以下は一般的な問題とその原因の一覧です:

問題 原因
コメントが送信されない コメントテキストが空
アカウント/ストーリーIDが欠落 カスタムフィールドが入力されていない
APIが400を返す 不正なリクエストフォーマット
APIが401を返す 無効なAPIキー

この記事は役に立ちましたか?

0人中0人がこの記事が役に立ったと言っています

0件のコメント