こんにちは
SCSKの庄司です。
先日ServiceNow環境で発生した「スクリプトを含むフローアクションが突然動作しなくなる」という事象について、注意喚起を込めて紹介します。
発生した事象
これまでずっと安定して動作していたフローアクションが、突然正常に動作しなくなりました。
具体的には、以下のようなスクリプトで要求アイテム(RITM)の情報を取得し、カタログタスクを作成する処理を行っていました。
問題が発生したスクリプト(抜粋):
var reqItemGR = new GlideRecord("sc_req_item");
reqItemGR.get(inputs.request_item);
var reqItemId = reqItemGR.getValue("sys_id");
var requestId = reqItemGR.getValue("request");
var catalogItemId = reqItemGR.getValue("cat_item");
var requestor = reqItemGR.getValue("requested_for");
二行目に記載のreqItemGR.get(inputs.request_item) が失敗するようになっており、sysIDが空のまま処理が続行されました。
その結果、「どの要求アイテムにも紐づかないカタログタスク」が作成され、要求アイテムとしてはカタログタスクが作成されなかったためそのままフローが終了してしまうという実務上のトラブルが発生しました。
該当のフローアクションは1年以上更新しておらず、フローやカタログアイテム側にも直近の変更はありませんでした。
直近の改修がないにもかかわらず挙動が変わったため、原因特定にそれなりに時間を要することとなりました。
対応策
修正として、get() メソッドの引数に渡す値を、明示的に sys_id の文字列として取得するように変更したところ、正常に動作するようになりました。
修正後のスクリプト(抜粋):
var reqItemGR = new GlideRecord("sc_req_item");
reqItemGR.get(inputs.request_item.getValue("sys_id"));
var reqItemId = reqItemGR.getValue("sys_id");
var requestId = reqItemGR.getValue("request");
var catalogItemId = reqItemGR.getValue("cat_item");
var requestor = reqItemGR.getValue("requested_for");
考えられる原因
前述した通り直近で変更はなかったにもかかわらずなぜこのような事態が発生したのか、調査の結果、事象発生の直前にYokohama Patch 10 Hotfix 1が適用されていたことが判明しました。
これまで inputs.request_item(参照型オブジェクト)をそのままget()に渡しても、プラットフォーム側でよしなにsysIDとして解釈してくれていたものが、Hotfix適用後の内部的な変更もしくは不具合により、「明示的な sys_id の指定」が必要になった可能性が高いと考えています。
本事象とYokohama Patch 10 Hotfix 1との関連性については、現在Now Supportに確認中です。
何かわかりましたら随時アップデートいたします。
