第565話:自動化で実現するIT全般統制

2017年12月11日

業務:ユーザ管理

「社員さんの所属部署変更」が発生したら、情報システム部門の雑務が増える。(風が吹けば…的な?)

例えばイチローさんが『営業部』から『カスタマーサービス部』へ異動するという辞令ケース。。。 Google Group で言えば、『ichiro@example.com』というメールアドレスを『sales@example.com』からメンバ削除し、『cs@example.com』にメンバ追加する処理をしなければならない。

ただし、こういった場合「引き継ぎ」を考慮し、加入組織へのメンバ追加は4月1日に、脱退組織からのメンバ削除は4月30日にセットする、というオペレーションを取っている。

課題:所属情報変更の自動化

Google Group 設定については、『第544話:Google Group 連携で、ラクラクML管理(2)』の業務テンプレを使って、自動化できている! 「API 連携」でタイマー処理についても自動化されているため、ミスやヌケモレはほとんど発生しない。

しかし、、、他にも「グループ設定の変更」は沢山あるのだ。(ディレクトリ・サービスは万能ではない)

あれれ? ワークフロー基盤の組織所属設定も自動変更したいのだが、、、どうやって??

[アカウント発行およびML登録-IT全般統制]

解決:ワークフロー基盤APIをワークフローからリクエストする!?!

クラウド型ワークフロー『Questetra BPM Suite』は、アドオン自動工程・スクリプト工程など「他システムに対して様々な API リクエストを投げる機能」を持っていますが、、、別途「外部からの API リクエストに応える機能」もあわせもっています。(System Settings API・Workflow API)

ここに紹介した業務プロセス定義は、ワークフロー上の自動工程からワークフロー基盤の設定 API に対してリクエストが投げられる仕組みです。

なんとも「一人芝居」な業務プロセス定義で不思議な感じがしますが、リクエスト時刻をセットすることでシステム設定の変更をタイマー予約することも可能となっています。

<業務フローで予約されるリクエスト>
  • System Settings API への追加リクエスト
  • System Settings API への削除リクエスト
  • Google Group API (※)への追加リクエスト
  • Google Group API (※)への削除リクエスト
※正確には『Admin SDK Directory API』

考察:内部統制とシステム管理業務

ユーザ設定の更新オペレーション自体を業務プロセスとして定義しておくと、申請や承認といった関連する業務ログが自動的に記録されるようになります。また、API連携自動工程に利用すれば「深夜の自動更新」なども完全自動化され、またその更新ログも自動的に記録されるようになります。

「IT全般統制」の視点において、(また情報システム部門自身の「IT業務処理統制」の視点において)、非常に有効な手段であると言えます。

ただ、System Settings API を利用する自動工程は、管理権限を持つユーザによって「OAuth2 認可」されなければなりません。言い換えれば、非常に影響力の大きい業務を自動化することができます。「グループメンバーの追加を自動化する」といった業務など、比較的影響の小さい管理業務から少しずつ自動化に慣れていくのが良いかもしれません。

[アカウント発行およびML登録-IT全般統制:「1.アカウント申請」画面]

<データ項目一覧画面>

<自動工程の「定義ファイル」(Addon-XML)の中身>
<?xml version="1.0" encoding="UTF-8"?><service-task-definition>

<label>Questetra Org Add Membership</label>
<label locale="ja">Questetra 組織メンバー追加</label>

<summary>System Administrator Authority and User Manager Authority required
1. Get Secret: https://{YOUR}.questetra.net/Admin/OAuth2/Client/list
2. Config [OAuth 2.0 Setting]
</summary>

<help-page-url>https://www.questetra.com/tour/m4/m415/addon-questetra-membership-add/</help-page-url>
<help-page-url locale="ja">https://www.questetra.com/ja/tour/m4/m415/addon-questetra-membership-add/</help-page-url>

<configs>
  <config name="conf_OAuth2" required="true" form-type="TEXTFIELD">
    <label>A: Set OAuth2 Config Name (at [OAuth 2.0 Setting])</label>
    <label locale="ja">A: OAuth2通信許可設定名 (←[OAuth 2.0 設定])</label>
  </config>
  <config name="conf_ApplicationRoot" required="true" el-enabled="true" form-type="TEXTFIELD">
    <label>A2: Set Application-Root URI ( https://... )</label>
    <label locale="ja">A2: Application-Root URI をセットしてください ( https://... )</label>
  </config>
  <config name="conf_DataIdB" required="true" form-type="SELECT" select-data-type="QGROUP|STRING_TEXTFIELD|SELECT_CHECKBOX">
    <label>B: Select STRING/CHECKBOX DATA for Qgroup Id (Org Id)</label>
    <label locale="ja">B: Qgroup ID(組織ID)が格納されている文字列型or組織型orチェックボックス型データを選択してください</label>
  </config>
  <config name="conf_DataIdC" required="true" form-type="SELECT" select-data-type="QUSER|STRING_TEXTFIELD">
    <label>C: Select STRING/USER DATA for Quser Email</label>
    <label locale="ja">C: Quser のメールアドレスが格納されている文字列型データorユーザ型データを選択してください</label>
  </config>
  <config name="conf_DataIdX" required="false" form-type="SELECT" select-data-type="STRING_TEXTAREA">
    <label>X: Select STRING DATA for Access Log (update)</label>
    <label locale="ja">X: 通信ログが格納される文字列型データを選択してください (更新)</label>
  </config>
</configs>


<script><![CDATA[
// Adding a Quser to Qgroup via Questetra System Settings API (ver. 20171204)
// (c) 2017, Questetra, Inc. (the MIT License)

//// == Config Retrieving / 工程コンフィグの参照 ==
var oauth2  = configs.get( "conf_OAuth2" ) + "";
var applicationRoot = configs.get( "conf_ApplicationRoot" ) + "";
var dataIdB = configs.get( "conf_DataIdB" ) + "";
var dataIdC = configs.get( "conf_DataIdC" ) + "";
var dataIdX = configs.get( "conf_DataIdX" ) + "";
// convert 'java.lang.String' to 'javascript string'


//// == Data Retrieving / ワークフローデータの参照 ==
var targetGroups = [];
if( engine.findDataDefinitionByNumber( dataIdB ).matchDataType("SELECT_CHECKBOX") ){
  var selectedGroups = engine.findDataByNumber( dataIdB );
  for( var i = 0; i < selectedGroups.size(); i++ ){ // java.util.ArrayList
    var pushGroup = selectedGroups.get(i).getValue() + "";
    targetGroups.push( pushGroup );
  }
}else if( engine.findDataDefinitionByNumber( dataIdB ).matchDataType( "QGROUP" ) ){
  var pushGroup = engine.findDataByNumber( dataIdB ).getId() + "";
  // com.questetra.bpms.core.event.scripttask.QgroupView
  targetGroups.push( pushGroup );
}else{
  var pushGroup = engine.findDataByNumber( dataIdB ) + "";
  targetGroups.push( pushGroup );
}
var userId = "";
if( engine.findDataDefinitionByNumber( dataIdC ).matchDataType("QUSER") ){
  userId = engine.findDataByNumber( dataIdC ).getId() + "";
  // com.questetra.bpms.core.event.scripttask.QuserView 
}else{
  var userEmail = engine.findDataByNumber( dataIdC ) + "";
  userId = quserDao.findByEmail( userEmail ).getId() + "";
}


//// == Calculating / 演算 ==
var accessLog = "";
var token  = httpClient.getOAuth2Token( oauth2 );
var apiUri = applicationRoot + "API/UGA/Membership/add";

for( var i = 0; i < targetGroups.length; i++  ){ // javascript array
  // preparing for API Request
  var apiRequest = httpClient.begin(); // HttpRequestWrapper
  // com.questetra.bpms.core.event.scripttask.HttpClientWrapper
  apiRequest = apiRequest.bearer( token );
  apiRequest = apiRequest.formParam( "quserId",  userId );
  apiRequest = apiRequest.formParam( "qgroupId", targetGroups[i] );

  // Access to the API (POST, GET, PUT, etc)
  var response = apiRequest.post( apiUri ); // HttpResponseWrapper
  var httpStatus = response.getStatusCode() + "";
  accessLog = "---POST request--- " + httpStatus + "\n";
  accessLog += response.getResponseAsString() + "\n";

  // Error Handling
  if( httpStatus !== "200" ){
    if( dataIdX !== "" ){ engine.setDataByNumber( dataIdX, accessLog ); }
    throw new Error( accessLog );
  }
}


//// == Data Updating / ワークフローデータへの代入 ==
if ( dataIdX !== "" ){ engine.setDataByNumber( dataIdX, accessLog ); }
]]></script>


<icon>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACXUlEQVRYR81Xy3HbMBDF6igdYlcS
u4LQ14Vm4lQQpYI4FUQdxB1EriDMjLBX0xXYnUQ+UNeXWQ3pIUFABBgrCa9Y7HvY31uSmfAx8w8i
uu5eBVCKyIdcd5R7Qe2ttQjdc85l+8u+8FcIMPMFEd03Yf3kvzYnAsz8XdMF4EpEnnxfgwi04MaY
MzUGsBGRFxLN+WMoBQAuuyAN+Kqx3YVI9Aj44C0IgCcAN0S0aorvQC7wKUippInologuPJsBiR4B
a+2v9uVTijPxzs45d97a+gQ2xpiPiY6mmt0559q0mEENWGtPSaIHri8ItqG1Vqv17dQnRgr0QUSK
0S5Qg+VyWQC4HyMA4OHwCqJ3Y7ZEdLXdbqskAsfSAOCZiNZ1XW+qqtqpw6IozhaLxQrAmojeRMgM
wh9MQawVm5nwrHihgaLnetcYU0VIhOdASFiOhPOLc+72WLittTfGmG9jKWkeVFJsrIYc1HV93oY9
BtCkQ+dJ0pdMQAsuVMUhFGbWNIwW5qEGUiPwzwko25OkgJlLInqflDBjRouQmbUVv6b4A/AzKMe5
rdSCTWnh2Cg+pgfaz+v9fn/XHUTz+fwzEWkLxqQ6bRDljGKNVPP6wYwfjNycUczMj4FlIiWtURtd
akTkclQLvDXqj0D9y/56N9CCU4K3ZHwS/k64O6JmrxINVVMReSnUwVIaakGdgrPZbA1AJfc6RrKR
ap0rGwAqWr2lRs99NU2ZA732yVnLu3tFCDy4D3i6XnYXyDYHOT8mSkKjFtsj/s9fs7Fqy4nAmK9J
EQgJmAqLiPR+2cfA9fw3F0l+y6naMeEAAAAASUVORK5CYII=
</icon>

</service-task-definition>


[雛形ダウンロード (無料)]
<類似プロセス>
≪関連記事≫

[英文記事 (English Entry) ]

0 件のコメント :

コメントを投稿