3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ServiceNowAdvent Calendar 2024

Day 20

BoxとServiceNow連携:ファイル共有依頼(Box AIにて事前分析)

Posted at

概要

Boxにあるファイルは簡単に共有できますが、秘密情報が入っているファイルを共有する前に承認を依頼する時があります。Box Relayで承認依頼フローを作ることができますが、この記事ではServiceNowでファイル共有の承認を依頼する方法を紹介します。

イメージとして、ユーザーがあるファイルを共有したく、ServiceNowで共有承認を依頼します。承認者は判断する前に、Box AIにてファイルを分析して、秘密情報が入っているかどうか確認します。その確認の結果を承認依頼のコメントに記載します。

準備

本記事では、Boxカスタムアプリ、ServiceNowのアプリケーションレジストリとRESTメッセージが作成・設定されたことを仮定します。それらの設定について、「BoxとServiceNow連携:認証方法」を参考してください。

実装

ファイル共有承認前のBox AIにて分析を実現するために、以下のステップを実装します:

  1. ファイル共有依頼のテーブルを作成
  2. レコードプロデューサーを作成
  3. 「Box AI メタデータを抽出(構造化)」のHTTPメソッドを追加
  4. ワークフローアクションを作成
  5. ワークフローを作成

最後に動作確認を行います。

フォルダ作成依頼情報のテーブルを作成

まずはBoxファイル共有依頼の情報を保管するテーブルを作成します:

  • ラベル:<任意>(例:Boxファイル共有依頼)
  • 名前:<任意>(例:u_box_file_sharing_request)

Boxファイル共有依頼テーブル.png

新規レコードを保存すると、以下の列を追加します:

  • 「BoxファイルID」列
    • タイプ:文字列 (完全な UTF-8)
    • 列ラベル:<任意>(例:フォルダ名)
    • 列名:<任意>(例:u_box_file_id)
  • 「承認」列
    • タイプ:選択肢
    • 列ラベル:<任意>(例:承認)
    • 列名:<任意>(例:u_approval)
  • 「承認履歴」列
    • タイプ:ジャーナル
    • 列ラベル:<任意>(例:承認履歴)
    • 列名:<任意>(例:u_approval_journal)

テーブル列.png

この記事では、なるべくわかりやすくするため、必要な列だけを追加し、テーブル列の設定を極力省いています。
本番の実装で、要件に従って適切な列(例えば、依頼説明や承認者など)を追加し、細かくテーブルを設定することをお勧めします(例えば、列タイプや最大長など)。

レコードプロデューサーを作成

次は、サービスカタログで利用するレコードプロデューサーを作成します:

  • 名前:<任意>(例:Boxファイル共有依頼)
  • テーブル名:前のステップで作成したテーブル(例:u_box_file_sharing_request)

レコードプロデューサー.png

レコードを保存すると、画面の下に「変数」タブが表示され、依頼フォームの項目を設定することができます。今回は非常にシンプルなフォームを作成し、共有したいファイルIDだけ設定します:

  • 「BoxファイルID」変数
    • フィールドにマップ:チェック
    • タイプ:1行テキスト
    • フィールド:BoxファイルID
    • 「質問」タブで「質問」:<任意>(例:BoxファイルID)
    • 「質問」タブで「名前」:前のステップで作成したフォルダ名のテーブル列名(例:u_box_file_id)

レコードプロデューサー変数.png

最後に、レコードプロデューサーの「カタログ」タブで「サービスカタログ」を追加し、「カテゴリ」タブで適切なカテゴリを選択します(例:セキュリティとアクセス)。

レコードプロデューサーカタログ.png

サービスカタログで作成したレコードプロデューサーを検索すると、フォームの見た目などを確認することができます。テスト値を入力して送信すると、プロデューサーの該当テーブルでレコードが作成されたことも確認できます。

「Box AI メタデータを抽出(構造化)」のHTTPメソッドを追加

Box AIにてファイルを分析するには、「メタデータを抽出 (構造化)」のAPIエンドポイントを使います:https://api.box.com/2.0/ai/extract_structuredガイド)。
Boxメタデータを設定する前にこのエンドポイントを使うことが多いですが、ファイルに対する構造データを取得したい場合でも便利です。

パラメータとして、共有したいファイルのIDと取得したい情報(フィールド)の定義を指定します。今回は秘密情報についてデータを取得しますが、様々なケースで同じメソッドを使うために、フィールドを変数として渡します。

上記のエンドポイントへリクエストを送信するために、事前に作成されたRESTメッセージで新規なHTTPメソッドを追加します。新規HTTPメソッド画面で以下のように設定します(詳細設定はBox APIガイドで確認だきます):

  • 名前:<任意>(例:Box AI メタデータを抽出(構造化))
  • HTTP メソッド:POST
  • REST エンドポイント:https://api.box.com/2.0/ai/extract_structured
  • 「HTTP要求」タブの「コンテンツ」の内容は以下のJSONです。JSONではfileIdfieldsを変数として指定します
{
  "items": [
    {
      "id": "${fileId}",
      "type": "file"
    }
  ],
  "fields": ${fields}
}

${fields}は配列ですので、クオーテーションで囲まれません。

Box AI メタデータを抽出(構造化)メソッド.png

レコードを保存すると、画面の下に「REST メッセージ関数パラメーター」タブが表示されます。「関連リンク」の「変数の自動生成」をクリックすると、JSONで指定した変数がパラメーターとして設定されます。

HTTPメソッド変数.png

ワークフローアクションを作成

ファイル共有承認を依頼されたら、ワークフローでBox AIにての分析を行いますので、上記で作成した「Box AI メタデータを抽出(構造化)」のHTTPメソッドを利用するフローアクションを作成します。

アクションの入力として、ファイルIDを渡します:

  • ラベル:<任意> (例:ファイルID)
  • 名前:<任意> (例:fileid)
  • タイプ:String

アクション入力.png

アクションに新しいスクリプトステップを追加し、以下のように入力変数を設定します:

  • 名前:<任意> (例:id)
  • 値:action➛ファイルID

スクリプトボックスで、以下のコードを設定します:

(function execute(inputs, outputs) {
    // 取得する情報を定義
    var metadataExtractionFields = [
        {
            key: "personalInformation",
            description: "個人情報有無",
            displayName: "個人情報",
            prompt: "ファイルに次のような個人に関する情報が含まれる場合は、値をtrueにしてください:氏名、他のデータと組み合わせて個人を特定できる部分的な名前、住所(部分住所や郵便番号を含む)、電話番号、メールアドレス、社会保障番号、運転免許証番号、または国民ID。一般的な用語(例: 'カスタマーサービス')や匿名のプレースホルダー(例: '山田太郎')は含めないでください。個人を特定できる情報が含まれていない場合は、falseに設定してください。",
            type: "boolean"
        },
        {
            key: "financialInformation",
            description: "金融情報有無",
            displayName: "金融情報",
            prompt: "ファイルに次のような機密性の高い金融データが含まれる場合は、値をtrueにしてください:クレジットカード番号(例: 16桁の数字列)、銀行口座番号、ルーティング番号、取引記録、口座残高、税務書類、給与明細、または財務諸表。一般的な価格表や「予算の議論」のような非機密データは除外してください。機密性の高い金融データが見つからない場合は、falseに設定してください。",
            type: "boolean"
        },
        {
            key: "businessInformation",
            description: "機密ビジネス情報有無",
            displayName: "機密ビジネス情報",
            prompt: "ファイルに次のような機密性の高いビジネス情報が含まれる場合は、値をtrueにしてください:独自情報、営業秘密、詳細な製品設計、ビジネス戦略、業務計画、顧客リスト、または非公開の財務報告書。「機密」「専有」といったラベルが付けられたデータも含めてください。一般公開されているマーケティング資料や非専有情報は除外してください。機密ビジネス情報が見つからない場合は、falseに設定してください。",
            type: "boolean"
        },
        {
            key: "healthInformation",
            description: "健康情報有無",
            displayName: "健康情報",
            prompt: "ファイルに次のような健康関連情報が含まれる場合は、値をtrueにしてください:医療記録、処方箋、検査結果、保険情報、診断コード、または規制(例: HIPAA)の対象となるデータ。「患者123が胸痛を訴えた」のような機密メモも含めてください。特定の個人に関連しない健康アドバイスや一般的なフィットネスのヒントは除外してください。健康情報が見つからない場合は、falseに設定してください。",
            type: "boolean"
        },
        {
            key: "authenticationInformation",
            description: "認証情報有無",
            displayName: "認証情報",
            prompt: "ファイルに次のような認証情報が含まれる場合は、値をtrueにしてください:ユーザー名、パスワード、APIキー、OAuthトークン、暗号化キー、またはその他のアクセス制御に使用されるデータ。デフォルトまたはプレースホルダーの認証情報(例: 'admin/admin')も、悪用される可能性がある場合は含めてください。認証情報が含まれない設定データや無関係な数字列は除外してください。認証情報が見つからない場合は、falseに設定してください。",
            type: "boolean"
        }
    ];

    // 作成したHTTPメソッドでBox AI APIへリクエストを送信
    var r = new sn_ws.RESTMessageV2('Box', 'Box AI メタデータを抽出(構造)');
    r.setStringParameterNoEscape('fileId', inputs.id);
    r.setStringParameterNoEscape('fields', JSON.stringify(metadataExtractionFields));
    var response = r.execute();
    var responseBody = JSON.parse(response.getBody());

    // 結果をパースして、ファイル共有依頼に記載するコメントを用意
    var result = "--Box AIによるファイル情報分析--";
    result += "<br/>個人情報:";
    result +=  responseBody.personalInformation ? "" : "";
    result += "<br/>金融情報:";
    result +=  responseBody.financialInformation ? "" : "";
    result += "<br/>機密ビジネス情報:";
    result +=  responseBody.businessInformation ? "" : "";
    result += "<br/>健康情報:";
    result +=  responseBody.healthInformation ? "" : "";
    result += "<br/>認証情報:";
    result +=  responseBody.authenticationInformation ? "" : "";

    outputs.result = result;
})(inputs, outputs);

この記事では、なるべくわかりやすくするため、コードを極力省いています。
セキュリティ面での行うべき考慮を省略し、エラーハンドリングなども実装されていません。
具体的な実装時には非機能面の考慮と実装方法を開発者が行う必要があります。

分析対象のファイルと取得したい情報によって、フィールドやプロンプトを編集る必要があります。

出力変数として、以下を設定します:

  • ラベル:<任意> (例:分析結果)
  • 名前:<任意> (例:result)
  • タイプ:String

アクションスクリプト.png

アクションの出力を設定します:

  • ラベル:<任意> (例:分析結果)
  • 名前:<任意> (例:result)
  • タイプ:String

アクション出力変数定義.png

そして、出力変数の値をスクリプトステップの出力にします。

  • 分析結果:step➛スクリプト step➛分析結果

アクション出力変数値.png

最後に、アクションを保存と公開して、次に作成するフローで使います。

ワークフローを作成

ファイル共有承認を依頼されたら、フローを起動して、Box AIにて分析して、結果を依頼の承認履歴にコメントとして記載します。

そのため、まずはトリガーを設定します。

  • トリガー:作成時
  • テーブル:以前作成したテーブル(例:Boxファイル共有依頼 [u_box_file_sharing_request])

フロートリガー.png

次に、フローのアクションを設定します。

最初のアクションは作成しておいた「Box AIにてファイル分析」です。パラメータとして、トリガーレコードのファイルIDです:

  • アクション:Box AIにてファイル分析
  • ファイルID:トリガー - Record 作成時➛Boxファイル共有依頼 Record➛BoxファイルID

Box AIにてファイル分析アクション設定.png

2つ目のアクションはBox AIの分析結果をレコードの承認履歴フィールドに追加します。

  • アクション:レコードを更新(Update Record)
  • レコード:トリガー - Record 作成時➛Boxファイル共有依頼 Record
  • テーブル:以前作成したテーブル(例:Boxファイル共有依頼 [u_box_file_sharing_request])
  • フィールド名:承認履歴
  • フィールド値: 1 - Box AIにてファイル分析➛分析結果

レコード更新アクション設定.png

最後のアクションは実際の承認依頼のため、「承認を求める」アクションを使います:

  • アクション:承認を求める(Ask for Approval)
  • レコード:トリガー - Record 作成時➛Boxファイル共有依頼 Record
  • テーブル:以前作成したテーブル(例:Boxファイル共有依頼 [u_box_file_sharing_request])
  • 承認フィールド:承認
  • ジャーナルフィールド:承認履歴
  • ルール:承認または却下
  • ルール時期:任意の人が承認または却下、適切な承認者を選択します(例:System Administrator)

承認を求めるアクション設定.png

アクションの設定ができたら、フローを保存と有効化します。

動作確認

実装したステップは正常に実行されることを確認するには、テスト書類(請求書)を用意し、サービスカタログでBoxファイル共有承認を依頼します。

請求書.png

サービスカタログでBoxファイル共有承認を依頼.png

依頼を送信して、ServiceNowの承認一覧を確認すると、承認依頼があります。

承認依頼.png

その依頼の詳細を見ると、Box AIの分析結果はコメントとして承認履歴に記載されていることが確認できます。

承認履歴.png

まとめ

この記事では、ServiceNowからBoxファイルを共有承認を依頼する方法について説明しました。

最終的に、承認者は判断しますが、Box AIで事前分析を行なって、秘密情報などが入っているかより早くわかると思います。

このように、BoxにあるコンテンツをBox AIで分析や要約をして、ServiceNow管理する業務プロセスの効率化・自動化できると考えられます。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?