IBM Cloud Docs
との統合 ServiceNow

との統合 ServiceNow

アプリ所有者は、 ServiceNow® と App Configurationを統合してワークフローを追加することで、フィーチャー・フラグの有効化を管理できます。

構成変更の承認プロセス・フローを環境レベルで App Configuration に関連付けることができます。 承認ワークフローを有効にすると、承認後に変更が反映され、実装する変更要求の状態が変更されます。 変更要求が実装状態になると、変更は自動的に反映されます。

構成を更新するための管理者特権を持つ ServiceNow インスタンスがあることを確認します。

外部 ServiceNow 名は、標準の https://xxx.service-now.com に従います。ここで、 xxx はインスタンス名です。 ServiceNow インスタンス名、ユーザー名、およびパスワードは、 ServiceNow コンソールから取り出すことができます。 ServiceNow プロファイルにナビゲートし、 「インスタンス・パスワードの管理 (Manage Instance Password)」 に移動して詳細を取得します。

ServiceNow ワークフローと統合するには、以下のステップを実行します。

  1. App Configuration サービス・インスタンスのダッシュボードで、 「現在の環境」 フィールドの値を選択します。 この値は、 ServiceNow ワークフロー・プロセスを有効にする環境でなければなりません。

  2. 「機能フラグ」 をクリックします。

  3. 「ワークフローの管理」 をクリックします。 「ワークフローの管理」 サイド・パネルが表示されます。

    外部ワークフローを管理する{: caption="フローを管理する外部ワーク" caption-side="bottom"}を管理する外部ワークフローを管理する

  4. 外部ワークフローの場合、以下のステップを実行します。

    1. xml-ph-0000@deepl.internalインスタンスの URLServiceNow インスタンスの

    2. ServiceNow インスタンスへの接続に使用するユーザー名を入力します。

    3. ServiceNow インスタンスで認証するために前述の ユーザー名 の認証に使用する パスワード を入力します。

    4. OAuthアクセストークンを取得するために必要なクライアントIDを入力します。

      ServiceNow インスタンスにアクセスするには、 「クライアント ID」「クライアント秘密鍵」 が必要です。 クライアント ID および クライアント・シークレットを作成する場合は、 外部クライアント用の OAuth API エンドポイントを作成する方法についてサービスの資料を参照してください。

    5. 前述の 「クライアント ID」 の認証に必要な 「クライアント秘密鍵」 を入力します。

    6. ServiceNow で定義された承認グループ名を入力します。 承認グループ名には、 ServiceNow ワークフローで作成された変更要求を承認する権限を持つ担当者のセットが含まれます。

    7. 変更要求の有効期限 (時間単位) を設定します。 最小 1 時間から最大 999 時間。

    8. 「有効」 トグル・スイッチを ON に設定して、選択した環境のワークフローを有効にします。

  5. ワークフローを作成・適用するには「 作成 」をクリックします。

環境でワークフローを作成するときに、その環境で機能フラグを 「オン」 状態または 「オフ」 状態に切り替えると、変更要求が開始され、ワークフロー承認プロセスを経る必要があります。

ワークフロー承認プロセスを適用する前に一部の機能フラグを既に有効にしている場合、それらの機能フラグは通常どおり機能しますが、さらに切り替えを行うと承認プロセスが実行されます。

既存の機能フラグを無効にしてワークフローを適用した後、機能フラグを有効にすると、その状況が 「ワークフロー開始」 に変更され、変更要求ワークフローが開始されます。

外部 ServiceNow ワークフロー変更要求に必須タグを追加するにはどうすればよいですか?

以下のステップに従って、外部 ServiceNow ワークフロー統合の変更要求に必須タグを追加します。

  1. ServiceNow インスタンスに管理者としてログインします。

  2. 既存の変更要求を開きます。

    ServiceNow change request
    ServiceNow change request

  3. 追加アクション・アイコンをクリックして、追加オプションを開きます。

    ServiceNow additional actions
    ServiceNow additional actions

  4. 「構成」 をクリックし、 「フォーム・レイアウト」 を選択します。

    フォームレイアウト
    追加設定オプション - フォームレイアウト
    ..

  5. 「フォーム・ビューおよびセクション (Form view and section)」 の下の 「フォーム・レイアウト (Form Layout)」 で、 「変更要求 (Change Request)」 を選択し、 「名前 (Name)」Appconfiguration タグ「タイプ (Type)」ストリング「フィールド長さ (Field length)」 を *「中 (100)」*として新規フィールドを作成します。

    フィールド名は、必ず Appconfiguration タグ (大/小文字の区別あり) と正確に一致するように入力してください。

    新規
    追加設定オプション - フォームレイアウト - 新規フィールド
    の作成

  6. 追加 をクリックします。 追加されると、新規フィールドが 「使用可能」 セクションに表示されます。

    利用可能
    追加設定オプション - フォームレイアウト - 利用可能セクションに表示される新しいフィールド

  7. 「使用可能」 セクションから 「Appconfiguration タグ」 を選択し、それを 「選択済み」 セクションに追加します。

    利用可能なセクションから選択された
    追加設定オプション - フォームレイアウト - 利用可能なセクションから選択されたセクション
    への新しいフィールドの選択

  8. 変更要求に新しいフィールドが表示されます。

    変更要求に表示される新しいフィールド
    フィールド
    変更要求に表示される新しいフィールド

    フィールド値は、新規変更要求の作成時に App Configuration サービスによって追加されます。 そのため、値を変更したり、その他の値を 「Appconfiguration タグ」 フィールドに追加したりしないでください。 フィールドに他の値を変更または追加すると、変更要求イベントが無視される可能性があります。

外部 ServiceNow インスタンスに Webhook スクリプトを登録または追加する方法

ServiceNow インスタンスに Webhook スクリプトを登録または追加するには、以下の手順を実行します。

  1. ServiceNow インスタンスに管理者としてログインします。

  2. すべて タブをクリックし、 「システム定義」にリストされている Business Rulesを検索します。

    ServiceNow All tab
    ServiceNow - Business Rules listed under System Definitions

  3. Business Rules ページで、 「新規」 ボタンをクリックします。

    新規ビジネス
    - 新規ビジネスルール
    作成

  4. 新規レコードで、 「名前」 を追加し、 *「変更要求」*にするテーブルを選択します。 「拡張」 チェック・ボックスを選択して、拡張オプション・タブを表示します。

    ![Webhookスクリプトを追加するための高度なオプション](images/ac-sn-03.png "Webhookスクリプトを追加するための高度なオプション* Webhook" caption-side="bottom"}を追加するための"){: caption="なオプション* Webhookスクリプトを追加するための高度なオプション

  5. 「拡張」 オプション・タブで、Webhook スクリプトを追加します。

    (function executeRule(current, previous /*null when async*/) {
       try {
          if (current.u_appconfiguration_tag == "appconfig-workflow" && (current.state == -1 || current.state == -5 || current.state == 4)) {
                //creating the glider Encrypt object
                var glideEncrypt = new GlideEncrypter();
                //fetching the sys_property that contains the IAM key
                var encryptedIbmIAMKey = gs.getProperty('<Add System property name which holds the IBM IAM key (Case Sensitive)>');
                //example: var encryptedKey = gs.getProperty('WorkflowAppConfigIamKey');
                //Decrypting the key
                var decryptedIAMKey = glideEncrypt.decrypt(encryptedIbmIAMKey);
                gs.addInfoMessage("IBM KEY DECRYPTION COMPLETED");
                if (Object.keys(decryptedIAMKey).length !== 0) {
                   gs.addInfoMessage("CHANGE REQUEST IDENTIFIED AS WORKFLOW RELATED");
                   //Adding the decrypted key to the IAM token generation body
                   var bodyContent = "grant_type=urn:ibm:params:oauth:grant-type:apikey&apikey=" + decryptedIAMKey;
                   //Making POST call to IBM IAM to generate token
                   var ibmIamTokenRequest = new sn_ws.RESTMessageV2();
                   ibmIamTokenRequest.setHttpMethod('POST');
                   ibmIamTokenRequest.setEndpoint('https://iam.cloud.ibm.com/identity/token');
                   ibmIamTokenRequest.setRequestBody(bodyContent);
                   ibmIamTokenResponse = ibmIamTokenRequest.execute();
                   var ibmIamTokenResponseCode = ibmIamTokenResponse.getStatusCode();
                   gs.addInfoMessage("IBM IAM TOKEN CREATION HTTP RESPONSE CODE: " + ibmIamTokenResponseCode);
                   if (ibmIamTokenResponseCode == 200) {
                      //parsing json response to extract the access_token
                      var ibmIamTokenResponseData = JSON.parse(ibmIamTokenResponse.getBody());
    
                      //extracting the access_token
                      var access_token = ibmIamTokenResponseData.access_token;
                      var encryptedInstanceId = gs.getProperty('<Add System property name which holds the AppConfig InstanceId (Case Sensitive)>');
                      //example: var encryptedInstanceId = gs.getProperty('WorkflowIbmAppConfigInstanceId');
                      var decryptedInstanceId = glideEncrypt.decrypt(encryptedInstanceId);
                      gs.addInfoMessage("IBM APP CONFIG INSTANCE ID DECRYPTION COMPLETED");
                      //preparing webhook request to forward
                      var webHookRequest = new sn_ws.RESTMessageV2();
                      //Refer link https://cloud.ibm.com/apidocs/app-configuration#endpoints-urls for more info on base URL
                      //Choose the base url from below based on your AppConfig instance region
                      //Dallas: https://us-south.apprapp.cloud.ibm.com
                      //Washington DC: https://us-east.apprapp.cloud.ibm.com
                      //London: https://eu-gb.apprapp.cloud.ibm.com
                      //Sydney: https://au-syd.apprapp.cloud.ibm.com
                      //Frankfurt: https://eu-de.apprapp.cloud.ibm.com
                      //Madrid: https://eu-es.apprapp.cloud.ibm.com
    
                      webHookRequest.setEndpoint('{{AppConfigRegionBaseURL}}/apprapp/workflow/v1/instances/' + decryptedInstanceId + '/crevents');
                      webHookRequest.setRequestHeader('Authorization', 'Bearer ' + access_token);
                      webHookRequest.setHttpMethod('POST');
                      webHookRequest.setRequestHeader("Accept", "application/json");
                      webHookRequest.setRequestHeader("Content-Type", "application/json");
    
                      //preparing the data for the webhook request
                      var webHookReqDataObject = new Object();
                      //BELOW ARE THE DATA THAT IS NEEDED TO PROCESS THE REQUEST, MODIFYING OR ALTERING THE DATA OR THE ATTRIBUTE WILL RESULT IN WEBHOOK REQUEST FAILURE.
                      webHookReqDataObject.operation = String(current.operation());
                      webHookReqDataObject.short_description = String(current.short_description);
                      webHookReqDataObject.change_request_id = String(current.number);
                      webHookReqDataObject.description = String(current.description);
                      webHookReqDataObject.cr_state = String(current.state);
                      webHookReqDataObject.cr_approval_assignment_group = String(current.assignment_group);
                      webHookReqDataObject.appconfiguration_tag = String(current.u_appconfiguration_tag);
                      webHookReqDataObject.implementation_time = String(current.work_start);
                      var webHookJsonStringData = JSON.stringify(webHookReqDataObject);
                      gs.addInfoMessage(webHookJsonStringData);
                      webHookRequest.setRequestBody(webHookJsonStringData);
    
                      //checking the change request has the tag, we only accept the CR with the below mentioned tag id
                      gs.addInfoMessage("SENDING REQUEST TO APP CONFIGURATION WEBHOOK HANDLER");
                      var webHookResponse = webHookRequest.execute();
                      httpResponseStatus = webHookResponse.getStatusCode();
                      gs.addInfoMessage("APP CONFIGURATION WEBHOOK HANDLER RESPONSE CODE:  " + httpResponseStatus);
                      if (httpResponseStatus == 200) {
                            gs.addInfoMessage("SUCCESSFULLY EXECUTED THE WEBHOOK CALL");
                      } else {
                            //try once more
                            webHookResponse = webHookRequest.execute();
                            httpResponseStatus = webHookResponse.getStatusCode();
                            gs.addInfoMessage("WEBHOOK CALL RETRY STATUS CODE:  " + httpResponseStatus);
                            gs.addInfoMessage(webHookResponse.getBody());
                      }
                   } else {
                      gs.addInfoMessage("IBM IAM TOKEN GENERATION FAILED");
                   }
                } else {
                   gs.addInfoMessage("DECRYPTED IAM KEY IS EMPTY OR NOT FOUND");
                }
          } else {
                gs.addInfoMessage("CR STATE : " + current.state + " CR APPCONFIGURATION TAG VALUE : " + current.u_appconfiguration_tag);
                gs.addInfoMessage("CHANGE REQUEST DOES NOT BELONG TO WORKFLOW INTEGRATION OR STATE OF THE CR IS NOT VALID");
          }
       } catch (ex) {
          var message = ex.getMessage();
          gs.info(message);
       }
    })(current, previous);
    
  6. IBM IAM トークンまたは App Configuration サービス資格情報の API キーと App Configuration インスタンス ID を使用して、コピーしたスクリプトを変更します。

  7. 「いつ実行するか」 タブにナビゲートし、 「更新」 チェック・ボックスを選択します。

    ServiceNow- When to run tab
    ServiceNow - When to run tab

  8. Submitをクリックして詳細を保存します。

Webhook スクリプトの IBM IAM トークンまたは App Configuration サービス資格情報の API キーを追加する方法

Webhook スクリプトには、Webhook 呼び出し用の IBM IAM トークン、またはトークンを生成するための API キーを保管できる App Configuration サービス資格情報の API キーが必要です。

以下の手順を実行します。

  1. ServiceNow インスタンスに管理者としてログインします。

  2. 「すべて」 タブをクリックし、 sys_properties.LIST を検索して、 Enter キーを押します。 あるいは、 https://{{instanceid}}.service-now.com/sys_properties_list.doにアクセスすることもできます。ここで、 instanceid は ServiceNow インスタンス ID です。

    ServiceNow All tab
    ServiceNow - All tab

  3. 「システム・プロパティー」 の詳細が表示されます。

    システム・プロパティ*
    - システム・プロパティ
    システム・プロパティ

  4. New をクリックして、新しいシステム・プロパティを作成する。

    新システムプロパティ*
    - 新システムプロパティ
    新システムプロパティ

  5. 以下の詳細を追加して、トークンを追加します。 password2 タイプを使用して鍵を保管します。 このタイプはデータを暗号化し、 ServiceNow インスタンスでのみ暗号化解除できます。

    システム・プロパティ*
    - システム・プロパティ
    システム・プロパティ

  6. 「送信」 をクリックして、 ServiceNow インスタンスに鍵を保存します。 保存すると、データが暗号化されていることが分かります。

App Configuration インスタンス ID を Webhook スクリプトの ServiceNow システム・プロパティーに追加する方法

以下の手順を実行します。

  1. ServiceNow インスタンスに管理者としてログインします。

  2. 「すべて」 タブをクリックし、 sys_properties.LIST を検索して、 Enter キーを押します。 あるいは、 https://{{instanceid}}.service-now.com/sys_properties_list.doにアクセスすることもできます。ここで、 instanceid は ServiceNow インスタンス ID です。

    ServiceNow All tab
    ServiceNow - All tab

  3. 「システム・プロパティー」 の詳細が表示されます。

    システム・プロパティ*
    - システム・プロパティ
    システム・プロパティ

  4. New をクリックして、新しいシステム・プロパティを作成する。

    新システムプロパティ*
    - 新システムプロパティ
    新システムプロパティ

  5. App Configuration インスタンス ID を追加します。 password2 タイプを使用して鍵を保管します。 このタイプはデータを暗号化し、 ServiceNow インスタンスでのみ暗号化解除できます。

    システム・プロパティ*
    - システム・プロパティ
    システム・プロパティ

  6. 「送信」 をクリックして、 ServiceNow インスタンスに鍵を保存します。 保存すると、データが暗号化されていることが分かります。