との連携 ServiceNow

アプリのオーナーとして、 ServiceNow® App Configuration との統合によりワークフローを追加することで、機能フラグの有効化を管理することができます。

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

設定を更新するために、管理者権限を持つ ServiceNow インスタンスを持っていることを確認してください。

外部 ServiceNow の名前は標準 https://xxx.service-now.com に従います。 xxx はあなたのインスタンス名です。 ServiceNow インスタンス名、ユーザー名、パスワードは、 ServiceNow コンソールから取得できます。 ServiceNow プロフィールに移動し、「 Manage Instance Password(インスタンスパスワードの管理 )」にアクセスして詳細を取得します。

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

  1. App Configuration サービスのインスタンスのダッシュボードで、「 設定 」をクリックします。

  2. 承認ワークフロー 」セクションで、「 ワークフローを作成 」をクリックします。

  3. ステップ1では、ワークフローの範囲を定義します:

    1. ワークフローの名前を入力してください。

    2. ワークフローを有効にするリソースを選択してください。

      • コレクションの場合、削除には承認が必要です。

      • セグメントについては、編集や削除が行われると承認が必要となります。

      • 環境については、すべてのフィーチャーフラグ操作、すべてのプロパティ操作、および環境の削除に対して承認を要求することができます。

  4. 次へ をクリックします。

  5. 手順 2 では、 ServiceNow インスタンスへの接続を設定します。 ServiceNow インスタンスのインスタンスタイプとして、「 External ServiceNow 」を選択します。

  6. レビュー 」をクリックして、ワークフローの設定を確認してください。

  7. ワークフローの詳細を確認し、「 作成 」をクリックしてワークフローを作成・適用します。

外部ワークフロー

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

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

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

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

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

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

クライアント IDとクライアントシークレットは、 ServiceNow インスタンスにアクセスするために必要です。 Client IDと Client secretの作成については、 外部クライアント用の OAuth APIエンドポイントの作成方法に関するservice nowのドキュメントを確認してください。

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

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

  3. 有効 」トグルスイッチを「 ON 」に設定すると、選択したスコープのワークフローが有効になります。

1つのリソースに対して作成できる承認ワークフローは1つだけです。

環境に対してワークフローを作成する場合、ワークフロー作成時に指定された範囲内のリソース(例:すべてのフラグ、すべてのプロパティ、または環境の削除)を変更または削除するには、承認が必要となります。

アクションごとに変更リクエストが作成され、その変更リクエストが承認されるまで、その環境ではリソースを変更または削除することはできません。 ある環境で承認待ちとなっているリソースでも、他の環境では引き続き変更が可能です。

変更リクエストを確認するには、変更対象のリソース名の横にある CR アイコンにカーソルを合わせてください。 変更依頼へのリンクが表示されます。

たとえば、スコープ内のすべてのフラグを選択した場合、その環境において機能フラグを「 オン 」または「 オフ 」に切り替えると、承認プロセスを経る必要がある変更リクエストが発行されます。

ワークフローを適用する前から有効になっていた機能フラグやプロパティは通常通り機能し続けますが、それ以降の変更には承認が必要となります。 フィーチャーフラグを無効にしてワークフローを適用した後、そのフィーチャーフラグを有効にしようとすると、ステータスが「 成功!」に変わります 変更依頼のワークフローが開始され( )、変更依頼が作成されました。

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

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

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

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

    ServiceNow 変更要求
    ServiceNow 変更要求

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

    ServiceNow 追加アクション
    ServiceNow 追加アクション

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

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

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

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

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

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

    ServiceNow

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

    ServiceNow

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

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

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

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

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

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

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

    ServiceNow すべてのタブ
    ServiceNow- Business Rules システム定義の下にリストされている。

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

    新規ビジネス・ルール
    ServiceNow- 新規ビジネス・ルールの作成

  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/apis/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- タブを実行するとき - タブを実行するとき - タブを実行するとき
    ServiceNow

  8. 送信 」をクリックして詳細を保存してください。

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 すべてのタブ
    ServiceNow- すべてのタブ

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

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

  4. [新規 ] をクリックして、新しいシステムプロパティを作成します。

    新しいシステム・プロパティ
    ServiceNow- 新しいシステム・プロパティ

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

    システム・プロパティ
    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 すべてのタブ
    ServiceNow- すべてのタブ

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

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

  4. [新規 ] をクリックして、新しいシステムプロパティを作成します。

    新しいシステム・プロパティ
    ServiceNow- 新しいシステム・プロパティ

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

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

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