다음과 연동 ServiceNow

앱 소유자는 App Configuration 과의 통합을 통해 ServiceNow® 워크플로우를 추가하여 기능 플래그 활성화를 관리할 수 있습니다.

환경 레벨에서 App Configuration 에 대한 구성 변경사항의 승인 프로세스 플로우를 연관시킬 수 있습니다. 승인 워크플로우를 사용으로 설정하면 구현할 변경 요청 상태를 승인하고 이동한 후에만 변경사항이 반영됩니다. 변경 요청이 구현 상태가 되면 변경사항이 자동으로 반영됩니다.

구성을 업데이트하려면 관리자 권한이 있는 ServiceNow 인스턴스가 있어야 합니다.

외부 ServiceNow 이름은 표준 https://xxx.service-now.com 을 따르며, 여기서 xxx 은 인스턴스 이름입니다. ServiceNow 인스턴스 이름, 사용자 이름 및 비밀번호는 ServiceNow 콘솔에서 가져올 수 있습니다. ServiceNow 프로필로 이동하여 인스턴스 비밀번호 관리로 이동하여 자세한 내용을 확인합니다.

ServiceNow 워크플로우와 통합하려면 다음 단계를 수행하십시오.

  1. App Configuration 서비스 인스턴스 대시보드에서 ‘설정’을 클릭합니다.

  2. ‘승인 워크플로 ’ 섹션에서 ‘워크플로 만들기 ’를 클릭합니다.

  3. 1단계에서 워크플로의 범위를 정의합니다:

    1. 워크플로우 이름을 입력하십시오.

    2. 워크플로를 활성화할 리소스를 선택하십시오.

      • 컬렉션의 경우, 삭제 시 승인이 필요합니다.

      • 세그먼트의 경우, 수정 및 삭제는 승인을 필요로 합니다.

      • 환경의 경우, 모든 기능 플래그 작업, 모든 속성 작업 및 환경 삭제 시 승인이 요청될 수 있습니다.

  4. 다음 을 클릭하십시오.

  5. 2단계에서 ServiceNow 인스턴스에 대한 연결을 구성합니다. ServiceNow 인스턴스의 인스턴스 유형으로 ‘외부’ ServiceNow 를 선택합니다.

  6. ‘검토’를 클릭하여 워크플로 구성을 검토하십시오.

  7. 워크플로 세부 정보를 확인한 후 ‘생성’을 클릭하여 워크플로를 생성하고 적용하십시오.

외부 워크플로우

외부 워크플로우의 경우 다음 단계를 수행해야 합니다.

  1. 입력하다 URLServiceNow 의 인스턴스입니다.

  2. ServiceNow 인스턴스에 연결할 때 사용할 사용자 이름을 입력하십시오.

  3. ServiceNow 인스턴스에서 인증하기 위해 이전에 언급한 Username 을 인증하는 데 사용할 비밀번호 를 입력하십시오.

  4. OAuth 액세스 토큰을 가져오기 위해 필요한 클라이언트 ID 를 입력하세요.

  5. 이전에 제공된 클라이언트 ID 를 인증하는 데 필요한 클라이언트 시크릿 을 입력하십시오.

ServiceNow 인스턴스에 액세스하려면 클라이언트 ID와 클라이언트 비밀번호가 필요합니다. 클라이언트 ID클라이언트 비밀을 생성하려면 외부 클라이언트를 위한 OAuth API 엔드포인트 생성 방법에 대한 서비스 지금 문서를 확인하세요.

  1. ServiceNow 에서 정의된 승인 그룹 이름을 입력하십시오. 승인 그룹 이름에는 ServiceNow 워크플로우에서 작성된 변경 요청을 승인할 수 있는 권한이 부여된 사용자 세트가 포함됩니다.

  2. 변경 요청 만기 시간 (시간) 을 설정하십시오. 최소 1-최대 999시간.

  3. 선택한 범위에 대해 워크플로를 활성화하려면 ‘사용’ 토글 스위치를 ‘ON’으로 설정하십시오.

리소스당 하나의 승인 워크플로만 생성할 수 있습니다.

환경에 대한 워크플로를 생성할 때, 워크플로 생성 시 선택한 범위(예: 모든 플래그, 모든 속성 또는 환경 삭제) 내의 리소스를 수정하거나 삭제하려면 승인이 필요합니다.

각 작업마다 변경 요청이 생성되며, 해당 변경 요청이 승인될 때까지 해당 환경에서 리소스를 수정하거나 삭제할 수 없습니다. 한 환경에서 승인을 기다리고 있는 리소스는 다른 환경에서는 여전히 수정할 수 있습니다.

변경 요청을 확인하려면 수정하려는 리소스 이름 옆에 있는 CR 아이콘 위에 마우스를 올려놓으세요. 변경 요청 링크가 표시됩니다.

예를 들어, 해당 범위 내의 모든 플래그를 선택한 경우, 해당 환경에서 기능 플래그를 ‘On’ 또는 ‘Off’ 상태로 전환하면 승인 절차를 거쳐야 하는 변경 요청이 생성됩니다.

워크플로를 적용하기 전에 이미 활성화된 기능 플래그나 속성은 정상적으로 작동하지만, 그 이후에 이루어지는 모든 변경 사항에는 승인이 필요합니다. 기능 플래그를 비활성화하고 워크플로를 적용한 후, 해당 기능 플래그를 다시 활성화하려고 하면 상태가 ‘ ’로 변경됩니다. 성공했습니다! 변경 요청 워크플로가 시작되었으며( ), 변경 요청이 생성되었습니다.

외부 ServiceNow 워크플로우 변경 요청에 필수 태그를 추가하는 방법은 무엇입니까?

외부 ServiceNow 워크플로우 통합에 대한 변경 요청에 필수 태그를 추가하려면 다음 단계를 수행하십시오.

  1. ServiceNow 인스턴스에 관리자로 로그인하십시오.

  2. 기존 변경 요청을 여십시오.

    ServiceNow 변경 요청 변경 요청 변경 요청
    ServiceNow

  3. 추가 조치 아이콘을 클릭하여 추가 옵션을 여십시오.

    ServiceNow 추가 조치 추가 조치 추가 조치
    ServiceNow

  4. 구성 을 클릭하고 양식 레이아웃을 선택하십시오.

    양식 레이아웃
    ServiceNow 추가 구성 옵션 - 양식 레이아웃

  5. 양식 보기 및 섹션아래의 양식 레이아웃 에서 변경 요청 를 선택하고 이름 정확히 Appconfiguration 태그로, 유형문자열로, 필드 길이 를 *중간 (100)*로 사용하여 새 필드를 작성하십시오.

    이름 필드를 Appconfiguration tag (대소문자 구분) 와 동일하게 입력해야 합니다.

    새 필드 만들기
    ServiceNow 추가 구성 옵션 - 양식 레이아웃 - 새 필드 만들기

  6. 추가 를 클릭하십시오. 추가되면 새 필드가 사용 가능 섹션에 표시됩니다.

    사용 가능한 섹션에 새 필드 생성됨
    ServiceNow 추가 구성 옵션 - 양식 레이아웃 - 사용 가능한 섹션에 새 필드 생성됨

  7. 사용 가능 섹션에서 애플리케이션 구성 태그 를 선택하고 이를 선택됨 섹션에 추가하십시오.

    사용 가능한 섹션에서 선택된 섹션으로 새 필드 선택
    ServiceNow 추가 구성 옵션 - 양식 레이아웃 - 사용 가능한 섹션에서 선택된 섹션으로 새 필드 선택

  8. 변경 요청에 새 필드가 표시되는 것을 볼 수 있습니다.

    caption-side=bottom"
    변경 요청에 표시되는 새

    필드 값은 새 변경 요청을 생성하는 동안 App Configuration 서비스에 의해 추가됩니다. 따라서 값을 수정하거나 Appconfiguration tag 필드에 다른 값을 추가하지 마십시오. 필드에 다른 값을 수정하거나 추가하면 변경 요청 이벤트가 무시될 수 있습니다.

외부 ServiceNow 인스턴스에 웹훅 스크립트를 등록하거나 추가하는 방법은 무엇입니까?

ServiceNow 인스턴스에 웹훅 스크립트를 등록하거나 추가하려면 다음 단계를 수행하십시오.

  1. ServiceNow 인스턴스에 관리자로 로그인하십시오.

  2. 모두 탭을 클릭하고 시스템 정의 아래에 나열된 Business Rules를 검색하십시오.

    ServiceNow 모든 탭 모든 탭 - 시스템 정의 아래에 나열됨
    ServiceNow Business Rules

  3. Business Rules 페이지에서 새로 작성 단추를 클릭하십시오.

    새 비즈니스 규칙
    ServiceNow- 새 비즈니스 규칙 만들기

  4. 새 레코드에서 이름을 추가하고 변경 요청이 될 테이블을 선택하십시오. 고급 옵션 탭을 보려면 고급 선택란을 선택하십시오.

    웹후크 스크립트를 추가하는 고급{: caption="추가하는 고급 옵션웹후크 " caption-side="bottom"} 추가하는 고급 옵션

  5. 고급 옵션 탭에서 웹훅 스크립트를 추가하십시오.

    (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. ‘제출’을 클릭하여 세부 정보를 저장하세요.

웹훅 스크립트에 대한 IBM IAM 토큰 또는 App Configuration 서비스 인증 정보의 API키를 추가하는 방법은 무엇입니까?

웹훅 스크립트에는 웹훅 호출을 위한 IBM IAM 토큰 또는 App Configuration 서비스 인증 정보의 API키가 필요합니다. 여기서 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 인스턴스에 키를 저장하십시오. 저장되면 데이터가 암호화되는 것을 볼 수 있습니다.

웹훅 스크립트의 ServiceNow 시스템 특성에 App Configuration 인스턴스 ID를 추가하는 방법은 무엇입니까?

다음 단계를 수행하십시오.

  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 인스턴스에 키를 저장하십시오. 저장되면 데이터가 암호화되는 것을 볼 수 있습니다.