劇本組件動作的參數支援普通值、變數以及運算式、函數等,參數處理包含提取、去重、迴圈執行等環節。
參數分類
-
從功能上區分,參數分為劇本輸入參數、劇本輸出參數、組件動作輸入參數、組件動作輸出參數。
-
從類型上區分,參數又分為系統參數和組件參數。
說明在組件動作執行過程中,除組件參數外,系統預設的參數,在任意節點都能擷取。
組件(節點)輸入和輸出參數
組件的輸入參數可以是自訂的,也可以是上遊節點的輸出。若選擇上遊節點輸出,上遊節點必須是編排路徑上可達的前置節點。
多路情境下要保證節點名稱全域唯一。
以下圖節點B為例:可以拿到上遊節點A的輸出和劇本的輸入參數,不能拿到節點D的輸出,因為他們不在一個分路上,也拿不到節點C的輸出,因為節點C不是節點B的前置節點。
系統參數說明
劇本中的系統參數
系統預設的參數,在任意節點都能擷取,都可通過下表中的取值運算式擷取。“event”可視為開始節點的名稱,可通過${event.參數名}格式擷取劇本系統參數。
|
參數 |
資料類型 |
取值運算式 |
描述 |
|
_tenant_id |
String |
${event._tenant_id} |
調用劇本的阿里雲帳號ID。 |
|
_domain_id |
String |
${event._domain_id} |
登入使用者的角色狀態。
|
|
_trigger_user |
String |
${event._trigger_user} |
觸發劇本的阿里雲帳號ID,如果是RAM使用者(子帳號),則為RAM使用者(子帳號)ID。 |
|
_region_id |
String |
${event._region_id} |
地區ID。 |
|
_req_uuid |
String |
${event._req_uuid} |
當前劇本執行任務的唯一標識。 |
|
parentTaskUuid |
String |
${event.parentTaskUuid} |
父劇本的_req_uuid,子劇本調用時會存在此參數。 |
|
parentTaskName |
String |
${event.parentTaskName} |
父劇本的劇本UUID,子劇本調用時會存在此參數。 |
組件動作輸出參數中的系統參數
任意組件的輸出結果都包含如下參數,自訂參數會封裝在datalist中,可通過${節點名稱.datalist.*}擷取所有輸出參數值。
|
參數 |
資料類型 |
含義 |
|
datalist |
JSONArray |
動作執行後的輸出參數。 重要
組件自訂輸出的參數也儲存在datalist中。 |
|
total_data_successful |
Int |
動作執行過程中處理成功的資料量。 |
|
total_data |
Int |
動作執行過程中處理的資料量。 |
|
total_data_with_dup |
Int |
動作執行過程中處理成功的去重後的資料量。 |
|
total_exe_successful |
Int |
當前動作運行成功的次數。 |
|
total_exe |
Int |
當前動作啟動並執行次數。 |
|
status |
Boolean |
動作執行成功狀態,取值:true、false。 |
|
messageForUser |
String |
執行失敗情況下,使用者關注的報錯資訊。 |
|
message |
String |
執行失敗情況下,系統報錯資訊。 |
|
failed_exe_detail |
String |
執行失敗情況下,報錯的詳情資訊。 |
參數格式
參數支援常量、變數、運算式這三種基本格式,同時支援三種基本格式的排列組合,以及更複雜的嵌套。
|
基本格式 |
說明 |
樣本 |
|
常量 |
一個固定的字串 |
Ali。 |
|
變數 |
從劇本輸入參數和前置節點的輸出參數中提取值 |
${event.aliuid},從劇本輸入參數擷取aliuid。 |
|
運算式 |
使用內嵌運算式和函數產生值,格式為<%=運算式|函數%>,支援的函數列表請參見運算式中內建函數列表。 |
運算式:只支援Java文法,如<%=2*60*60%>。 函數:<%=currentTime()%>。 |
|
組合格式 |
常量_變數_運算式 |
組合樣本: Ali_${event.aliuid}_<%=currentTime()%>_<%=2*60*60%>,動作執行時會將其中的變數和運算式解析後替換為對應的值:Ali_aliuid_目前時間_7200。 嵌套樣本:(運算式可以嵌入變數)<%=formatTimeStamp(secondstamp_add(${DateTime:event.datalist.*.gmt_create},-600L),"yyyy-MM-dd'T'HH:mm:ss.SSSXXX")%>,從${DateTime:event.datalist.*.gmt_create}擷取gmt_create值,並減去600,最後格式化為日期。 |
運算式中內建函數列表
|
函數名 |
描述 |
樣本 |
樣本輸出 |
|
currentTime |
返回當前的時間戳記。 |
<%=currentTime()%> |
2025-06-05 10:30:00 |
|
secondstamp_add |
在目前時間timestamp上增加多少秒secNum。 |
<%=secondstamp_add(currentTime(),300L)%> |
2025-06-05 10:30:09 |
|
formatTimeStamp |
把輸入時間戳記根據format格式化。 |
<%=formatTimeStamp(currentTime(),"yyyyMMdd")%> |
20250605 |
|
timestampToseconds |
在目前時間timestamp上增加多少秒secNum,然後轉換為秒輸出。 |
<%=timestampToseconds(currentTime(),300L)%> |
1749099848 |
|
splitStr |
把輸入字串inputStr根據splitStr切分為一個列表。 |
<%=splitStr("test,value",",")%> |
[test,value] |
|
parseTimeMs |
將時間格式的字串轉換為毫秒。 |
<%=parseTimeMs("2025-06-05 10:30:32","yyyy-MM-ddHH:mm:ss")%> |
1749090632000 |
|
currentTimeToMs |
目前時間戳轉為毫秒。 |
<%=currentTimeToMs()%> |
1749091369688 |
|
currentHourToMs |
當前小時的時間戳記轉為毫秒,會從當前小時的0分0秒開始計算。 |
<%=currentHourToMs()%> |
1749088800000 |
|
currentDayToMs |
當前天的時間戳記轉為毫秒,會從當前天的0時0分0秒開始計算。 |
<%=currentDayToMs()%> |
1749052800000 |
|
parseTimeMsWDefault |
將時間戳記解析為毫秒,支援預設值。如果參數1為空白,使用參數2為預設值。 |
<%=parseTimeMsWDefault("2025-06-05 10:30:32",1749091369688L)%> |
1749090632000 |
|
splitStrToJsonArray |
把輸入字串inputStr根據splitStr切分為JSONArray。 |
<%=splitStrToJsonArray("test,value",",")%> |
["test","value"] |
|
concatListStr |
使用拼接符連接字串,需配合splitStr函數使用。 |
<%=concatListStr("|",splitStr("test,value",","))%> |
test|value |
|
substring |
截取字串。 參數1:截取的字串。 參數2:起始的下標。 參數3:終止的下標。 |
<%=substring("012345",0,3)%> |
012 |
|
remainStrStartEnd |
保留起始標號之外的字串。即保留inputStr開頭的beginSize個字元,以及結尾的endSize個字元,中間以5個底線串連。
|
<%=remainStrStartEnd("012345",2,2)%> |
01_____45 |
|
toLong |
把一個對象轉換為long類型。 參數1:輸入值。 參數2:轉換失敗的預設值。 |
<%=toLong("1234",12L)%> |
1234.0 |
|
toLowerCase |
把字串中的英文字母轉為小寫。 |
<%=toLowerCase("TEST")%> |
test |
|
toUpperCase |
把字串中的英文字母轉為大寫。 |
<%=toUpperCase("test")%> |
TEST |
|
toJSONObject |
把JSON字串轉成JSON對象。 |
<%=toJSONObject("{\"name\":\"test\",\"age\":12}")%> |
{"name":"test","age":12} |
|
base64encode |
對字串進行Base64編碼。 |
<%=base64encode("abc")%> |
YWJj |
|
base64decode |
對字串進行Base64解碼。 |
<%=base64decode("YWJj")%> |
abc |
|
replace |
對字串替換。
|
<%=replace("abc123","abc","aaa")%> |
aaa123 |
|
isNull |
判斷一個對象是否為空白。 |
<%=isNull("")%> |
true |
變數參數
在劇本組件的執行過程中,如果想拿到流程中前置節點的參數,可以在組件中使用變數的參數格式來表示。對於劇本輸入參數而言,使用event作為節點名稱,可以將它理解為開始節點的輸出參數,所以在劇本編排的過程中,不要把組件的名稱設定為event。
-
目前只支援根據節點的輸出參數來擷取資料。
-
劇本的輸入參數=開始節點的輸出參數。
-
當前節點輸入參數=上一個節點的輸出參數。
文法格式
擷取節點輸出參數的文法為${節點名稱.參數路徑},路徑採用jsonpath的方式,支援任意多層的JSON格式。
-
對於JSONObject格式,通過“.”直接擷取下級節點的資料。對於JSONArray格式,*表示擷取所有資料,同時支援基於數字下標擷取單條資料。以下為擷取動作執行後的輸出參數為例:
類型
文法
說明
擷取JSON中的參數
${節點名稱.datalist.*.參數1.參數2}
說明開始節點(劇本)輸出參數文法為:${event.參數1.參數2}。
擷取參數1下參數2的資料。
說明參數1的值為JSONObject格式。
擷取JSON數組中所有的資料
${節點名稱.datalist.*.參數1.*.參數2}
說明開始節點(劇本)輸出參數文法為:${event.參數1.*.參數2}。
擷取參數1下所有的JSONObject中參數2的資料。
說明參數1的值必須為JSONArray格式。
擷取JSON數組中單條的資料
${節點名稱.datalist.*.參數1.[0].參數2}
說明開始節點(劇本)輸出參數文法為:${event.參數1.[0].參數2}。
擷取參數1下的第一個JSONObject中參數2的資料
說明參數1的值必須為JSONArray格式。
-
除了手寫文法規則外,系統還支援在輸入框下拉式清單進行選擇對應參數的方式產生對應的文法,這個在調試完成後會推薦。例如:在 outputFields 配置中,單擊欄位對應值地區可彈出資料來源下拉式功能表(如 InputCheck、dataSetFilter、SiemEventFormat),選擇資料來源後右側展示可選欄位路徑列表,單擊目標欄位即可自動產生Variant 運算式,例如
${InputCheck.datalist.*.records.*.hackerIP}。
擷取變數參數樣本
以某個節點node1為樣本,該節點的輸出參數如下:
{
"datalist": [
{
"person": {
"weight": "120",
"age": "12"
}
},
{
"person": {
"weight": "121",
"age": "13"
}
}
],
"total_data_successful": 2,
"total_data": 2,
"total_exe_successful": 2,
"total_exe": 2,
"total_data_with_dup": 2,
"status": true
}
|
文法 |
說明 |
|
${event._req_uuid} |
擷取開始節點(即輸入參數)中的系統參數_req_uuid的值。 |
|
${event.parentTaskUuid} |
子劇本中擷取父劇本的_req_uuid(如果存在父劇本調用)。 |
|
${node1.total_data_successful} |
擷取node1節點的執行成功資料量。 輸出值:2。 |
|
${node1.datalist.*.person.age} |
擷取node1節點datalist下所有的person的age資料。 輸出值:{12,13}。 |
|
${node1.datalist.[0].person.age} |
擷取node1節點datalist下第一條的person的age資料。 輸出值:12。 |
參數的資料類型轉換
在劇本執行過程中,大部分情境下,資料都是以字串的類型進行處理的,當劇本執行過程中的資料類型不符合要求時,可以進行資料類型的轉換,將源類型轉為目標類型。
方式為${資料類型:資料},支援的資料類型轉換如下表:
|
資料類型 |
說明 |
源類型支援範圍 |
|
Boolean |
轉為Boolean類型,取值:true、false。 |
|
|
Long |
轉為Long類型。 |
|
|
Int |
轉為Int類型。 |
|
|
Double |
轉為Double類型。 |
|
|
String |
轉為String類型。 |
所有類型都支援轉換。 |
|
DateTime |
轉為日期類型。 |
|
|
JSONObject |
從某個JSONObject中提取key和value,組成新的JSONObject類型。用於把多列的資料以{}格式封裝,輸出格式為:{"fieldname":"fieldValue",...}。 |
只支援JSONObject類型。 |
|
JSONArray |
從某個JSONObject中提取key和value,組成JSONArray類型。把多行多列的資料以[{}]格式封裝,資料輸出為單行單列的資料。 |
只支援JSONObject類型 |
|
JSONObjectStr |
將JSONObject轉為字串。 |
JSONObject類型。 |
|
JSONArrayStr |
將JSONArray轉為字串。 |
JSONArray類型。 |
樣本:
-
JSONObject樣本:劇本輸入參數為:{"src_ip":"127.0.0.1","dst_ip":"127.0.0.2","msg":"hello"}。
-
${JSONObject:event}:把整個event都作為一個完整JSON字串輸出。
-
${JSONObject:event.src_ip}:把event中的src_ip產生一個單行單列的JSON。結果為:{"src_ip":"127.0.0.1"}。
-
${JSONObject:event.src_ip|msg}:把event中的src_ip和msg欄位產生一個單行單列的JSON字串。結果為:{"src_ip":"127.0.0.1","msg":"hello"}。
-
${JSONArray:event}:把整個event都作為一個完整JSONArray輸出。
-
${JSONArray:event.src_ip}: 把event中的src_ip產生一個單行單列的JSONArray。結果為:[{"src_ip":"127.22.22.1"}]。
-
${JSONArray:event.src_ip|msg}: 把event中的src_ip和msg欄位,產生一個單行單列的JSONArray。結果為:[{"src_ip":"127.0.0.1","msg":"hello"}]。
-
-
JSONArray樣本:劇本輸入參數為:{"datalist":[{"src_ip":"127.0.0.1","dst_ip":"127.1.0.1","msg":"hello"},{"src_ip":"127.1.0.1","dst_ip":"127.1.0.1","msg":"hello"}]}。
-
${JSONObject:event.datalist.*.src_ip}:展開為多行,每行的結果為:{"src_ip":"127.x.0.1"}。
-
${JSONObject:event.datalist.*.src_ip|msg}: 展開為多行,每行都是一個JSON字串:{"src_ip":"127.x.0.1","msg":"hello"}。
-
${JSONArray:event.datalist.*.src_ip}:展開為單行。結果為:[{"src_ip":"127.0.0.1"},{"src_ip":"127.1.0.1"}]。
-
${JSONArray:event.datalist.*.src_ip|msg}:展開為單行。結果為:[{"src_ip":"127.0.0.1","msg":"hello"},{"src_ip":"127.1.0.1","msg":"hello"}]
-
參數處理和節點執行流程
-
節點參數提取:在所有需要上遊節點執行完成後,根據當前節點的輸入配置,提取當前節點的實際輸入資料,提取的過程在下面有詳細介紹。
-
節點執行:組成該節點的輸入參數後,當所有的欄位都一樣時,自動去重後執行節點群組件動作。
說明當一個動作的接受參數是多組值時,為簡化操作,動作會執行多次。
如:找到被入侵應用的所有伺服器(多個),對這些伺服器逐一執行“惡意檔案清除”動作。使用者只需在動作的參數中選擇“伺服器IP”(${node1.datalist.*.ip})即可,系統會自動把所有的IP執行“惡意檔案清除”動作,不必寫一個迴圈後逐一執行清除動作。
-
輸出結果匯總去重:對節點多次執行之後的結果匯總,並自動去重。去重的邏輯是所有的欄位相同為重複,例如:
去重前
去重後
[ { "a":"11", "b":"22" }, { "a":"11", "b":"22" }, { "a":"11", "b":"33" } ][ { "a":"11", "b":"22" }, { "a":"11", "b":"33" } ]
參數提取過程
同一個資料來源處理
複雜的任意深度的JSON格式可以看作一個樹形結構,提取JSON中參數的原則是:同一深度的兄弟關係保持不變,同一祖輩節點做祖輩擴充,既不是兄弟也不是父輩的做笛卡爾乘積。
-
自動提取任意深度的資料。樣本如下:

-
同一深度的兄弟關係保持不變。樣本如下:

-
同一祖輩節點:祖輩擴充。樣本如下:

-
既不是兄弟,也不是父輩的進行笛卡爾乘積。樣本如下:

多資料來源的處理
對各個單資料來源處理結果做笛卡爾乘積。
