本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
適用於步驟函數工作流程的 Amazon 州語言中的內建函數
Amazon States 語言提供數個內建函數 (也稱為內建函式),可協助您在不使用狀態的情況下執行基本資料處理操作。Task
內在函數是看起來類似於編程語言中的函數的構造。它們可用於幫助有效負載構建器處理進出狀Task
態Resource
字段的數據。
在 Amazon States 語言中,內建函數會根據您要執行的資料處理任務類型,分為下列類別:
注意
若要使用內建函數,您必須
.$
在狀態機器定義的索引鍵值中指定,如下列範例所示:"KeyId.$": "
States.Array
($.Id)"您最多可以在工作流程的欄位內嵌 10 個內建函數。下列範例顯示名為的欄位包
含九個巢狀內建函式:myArn
"
myArn.$
": "States.Format('{}.{}.{}', States.ArrayGetItem(States.StringSplit(States.ArrayGetItem(States.StringSplit($.ImageRecipe.Arn
, '/'), 2), '.'), 0), States.ArrayGetItem(States.StringSplit(States.ArrayGetItem(States.StringSplit($.ImageRecipe.Arn
, '/'), 2), '.'), 1))"
提示
如果您在本機開發環境中使用 Step Functions,請確定您使用的是 1.12.0 或更高版本
支援內建函數的欄位
下列狀態支援下列欄位中的內建函數:
-
傳遞狀態:參數
-
工作狀態:參數, ResultSelector, 證明資料
-
平行狀態:參數, ResultSelector
-
地圖狀態:參數, ResultSelector
數組的內在函數
使用下列內建函式來執行陣列操作。
States.Array
-
States.Array
內在函數接受零個或多個參數。解釋器返回一個包含按照提供的順序參數值的數JSON組。例如,假設有下列輸入:{ "Id": 123456 }
你可以使用
"BuildId.$": "States.Array($.Id)"
這將返回以下結果:
“BuildId”: [123456]
States.ArrayPartition
-
使用
States.ArrayPartition
內建函數對大型陣列進行分割。您也可以使用此內建資料來切片資料,然後以較小的區塊傳送有效負載。這個內在函數有兩個參數。第一個參數是一個數組,而第二個參數定義塊的大小。解釋器將輸入數組塊成由塊大小指定的大小的多個數組。如果陣列中剩餘項目的數目小於區塊大小,則最後一個陣列區塊的長度可能會小於前一個陣列區塊的長度。
輸入驗證
-
您必須指定一個陣列作為函數第一個引數的輸入值。
-
您必須為代表區塊大小值的第二個引數指定非零的正整數。
如果您為第二個引數指定非整數值,Step Functions 會將其四捨五入為最接近的整數。
-
輸入陣列不能超過 256 KB 的步進函數的裝載大小限制。
例如,給定以下輸入數組:
{"inputArray": [1,2,3,4,5,6,7,8,9] }
您可以使用該
States.ArrayPartition
函數將數組分成四個值的塊:"inputArray.$": "States.ArrayPartition($.inputArray,4)"
這將返回以下數組塊:
{"inputArray": [ [1,2,3,4], [5,6,7,8], [9]] }
在前面的例子中,
States.ArrayPartition
函數輸出三個數組。前兩個陣列各包含四個值,如區塊大小所定義。第三個數組包含剩餘的值,並且小於定義的塊大小。 -
States.ArrayContains
-
使用
States.ArrayContains
內建函數來判斷陣列中是否存在特定值。例如,您可以使用此函數來檢測Map
狀態迭代中是否存在錯誤。這個內在函數有兩個參數。第一個參數是一個數組,而第二個參數是數組中要搜索的值。
輸入驗證
-
您必須指定一個數組作為函數的第一個參數的輸入值。
您必須指定有效的JSON物件作為第二個引數。
-
輸入陣列不能超過 256 KB 的步進函數的裝載大小限制。
例如,給定以下輸入數組:
{ "inputArray": [1,2,3,4,5,6,7,8,9], "lookingFor": 5 }
您可以使用該
States.ArrayContains
函數來查找以下內容中的lookingFor
值inputArray
:"contains.$": "States.ArrayContains($.inputArray, $.lookingFor)"
由於儲存在中的值包含
lookingFor
在中inputArray
,因此會States.ArrayContains
傳回下列結果:{"contains": true }
-
States.ArrayRange
-
使用
States.ArrayRange
內建函式建立包含特定範圍元素的新陣列。新陣列最多可包含 1000 個元素。這個函數有三個參數。第一個參數是新數組的第一個元素,第二個參數是新數組的最後一個元素,第三個參數是新數組中元素之間的增量值。
輸入驗證
-
您必須為所有引數指定整數值。
如果您為任何引數指定非整數值,Step Functions 會將其四捨五入為最接近的整數。
-
您必須為第三個引數指定非零值。
-
新產生的陣列不能包含超過 1000 個項目。
例如,下面使用該
States.ArrayRange
函數將創建一個數組,其第一個值為 1,最終值為 9,並且第一個值和最終值之間的值為每個項目增加兩個:"array.$": "States.ArrayRange(1, 9, 2)"
這將返回以下數組:
{"array": [1,3,5,7,9] }
-
States.ArrayGetItem
-
這個內在函數返回指定索引的值。這個函數有兩個參數。第一個參數是值的數組,第二個參數是要返回的值的數組索引。
例如,使用下列
inputArray
和index
值:{ "inputArray": [1,2,3,4,5,6,7,8,9], "index": 5 }
從這些值中,您可以使用
States.ArrayGetItem
函數返回數組中index
位置 5 的值:"item.$": "States.ArrayGetItem($.inputArray, $.index)"
在這個例子中,
States.ArrayGetItem
將返回以下結果:{ "item": 6 }
States.ArrayLength
-
States.ArrayLength
內在函數返回一個數組的長度。它有一個參數,該數組返回的長度。例如,給定以下輸入數組:
{ "inputArray": [1,2,3,4,5,6,7,8,9] }
您可以使
States.ArrayLength
用返回的長度inputArray
:"length.$": "States.ArrayLength($.inputArray)"
在此範例中,
States.ArrayLength
會傳回代表陣列長度的下列JSON物件:{ "length": 9 }
States.ArrayUnique
-
States.ArrayUnique
內在函數從數組中刪除重複值,並返回僅包含唯一元素的數組。這個函數需要一個數組,它可以是未排序的,作為它的唯一參數。例如,以下
inputArray
內容包含一系列重複值:{"inputArray": [1,2,3,3,3,3,3,3,4] }
您可以使用該
States.ArrayUnique
函數作為並指定要從中刪除重複值的數組:"array.$": "States.ArrayUnique($.inputArray)"
該
States.ArrayUnique
函數將返回以下僅包含唯一元素的數組,刪除所有重複值:{"array": [1,2,3,4] }
數據編碼和解碼的內在函數
使用下列內建函數根據 Base64 編碼配置編碼或解碼資料。
States.Base64Encode
-
使用
States.Base64Encode
內建函數根據 MIME Base64 編碼配置對資料進行編碼。您可以使用此函數將數據傳遞給其他 AWS 服務不使用 AWS Lambda 功能。此函數需要一個最多 10,000 個字元的資料字串來編碼為唯一引數。
例如,請考慮下列
input
字串:{"input": "Data to encode" }
您可以使用該
States.Base64Encode
函數將input
字符串編碼為 MIME Base64 字符串:"base64.$": "States.Base64Encode($.input)"
該
States.Base64Encode
函數返回以下編碼數據作為響應:{"base64": "RGF0YSB0byBlbmNvZGU=" }
States.Base64Decode
-
使用
States.Base64Decode
內建函數根據 MIME Base64 解碼方案來解碼資料。您可以使用此函數將數據傳遞給其他 AWS 不使用 Lambda 函數的服務。此函數需要一個最多 10,000 個字符的 Base64 編碼數據字符串作為其唯一的參數進行解碼。
例如,假設有下列輸入:
{"base64": "RGF0YSB0byBlbmNvZGU=" }
您可以使用該
States.Base64Decode
函數將 base64 字符串解碼為人類可讀的字符串:"data.$": "States.Base64Decode($.base64)"
States.Base64Decode function
將返回以下解碼數據作為響應:{"data": "Decoded data" }
哈希計算的內在
States.Hash
-
使用
States.Hash
內建函數來計算給定輸入的雜湊值。您可以使用此函數將數據傳遞給其他 AWS 不使用 Lambda 函數的服務。這個函數有兩個參數。第一個參數是要計算散列值的數據。第二個引數是用來執行雜湊計算的雜湊演算法。您提供的資料必須是包含 10,000 個字元或更少的物件字串。
您指定的雜湊演算法可以是下列任一演算法:
-
MD5
-
SHA-1
-
SHA-256
-
SHA-384
-
SHA-512
例如,您可以使用此函數來計算使用指定的
Data
字符串的哈希值Algorithm
:{ "Data": "input data", "Algorithm": "SHA-1" }
您可以使用
States.Hash
函數來計算哈希值:"output.$": "States.Hash($.Data, $.Algorithm)"
該
States.Hash
函數返回響應以下哈希值:{"output": "aaff4a450a104cd177d28d18d7485e8cae074b7" }
-
用於數據操作的內在函數 JSON
您可以使用這些函數JSON對物件執行基本的資料處理作業。
States.JsonMerge
-
使用
States.JsonMerge
內建函式將兩個JSON物件合併為單一物件。這個函數有三個參數。前兩個參數是您要合併的JSON對象。第三個引數是的布林值false
。此布林值決定是否啟用深度合併模式。目前,Step Functions 僅支援淺層合併模式;因此,您必須將布林值指定為
false
。在淺模式下,如果兩個對像中都JSON存在相同的密鑰,則後一個對象的鍵將覆蓋第一個對象中的相同密鑰。此外,當您使用淺層合併時,不會合併物件中巢狀的物件。JSON例如,您可以使用
States.JsonMerge
函數來合併下列共用金鑰的JSON物件a
。{ "json1": { "a": {"a1": 1, "a2": 2}, "b": 2 }, "json2": { "a": {"a3": 1, "a4": 2}, "c": 3 } }
您可以將 json1 和 json2 對象指定為
States.JsonMerge
函數中的輸入以將它們合併在一起:"output.$": "States.JsonMerge($.json1, $.json2, false)"
會
States.JsonMerge
傳回下列合併JSON物件做為結果。在合併的JSON物件中output
,json2
物件的索引鍵a
會取代json1
物件的索引鍵a
。另外,由於淺模式不支持合併嵌套json1
對象,因此丟棄對象鍵a
中的嵌套對象。{ "output": { "a": {"a3": 1, "a4": 2}, "b": 2, "c": 3 } }
-
States.StringToJson
-
該
States.StringToJson
函數將轉義JSON字符串的引用路徑作為其唯一參數。解釋器應用一個JSON解析器,並返回輸入的解析JSON形式。例如,您可以使用此函數來逸出下列輸入字串:
{ "escapedJsonString": "{\"foo\": \"bar\"}" }
使用
States.StringToJson
函數並指定escapedJsonString
為輸入引數:States.StringToJson($.escapedJsonString)
該
States.StringToJson
函數返回以下結果:{ "foo": "bar" }
-
States.JsonToString
-
該
States.JsonToString
函數只需要一個引數,這是包含要作為未轉義字符串返回的數JSON據的路徑。解釋器返回一個字符串,其中包含表示由 Path 指定的數據的JSON文本。例如,您可以提供下列包含逸出值的JSON路徑:{ "unescapedJson": { "foo": "bar" } }
為
States.JsonToString
函數提供包含在其中的數據unescapedJson
:States.JsonToString($.unescapedJson)
該
States.JsonToString
函數返回以下響應:{\"foo\": \"bar\"}
數學運算的內在函數
使用這些函數來執行數學運算。
States.MathRandom
-
使用
States.MathRandom
內在函數返回指定的起始編號(包括)和結束編號(排斥)之間的隨機數。您可以使用此函數在兩個或多個資源之間分配特定任務。
這個函數有三個參數。第一個參數是開始編號,第二個參數是結束編號,最後一個參數控制可選的種子值,請注意,如果使用此函數具有相同的種子值,它將返回相同的數字。
重要
由於
States.MathRandom
函數不會傳回密碼編譯安全隨機數,因此建議您不要將它用於安全性敏感的應用程式。輸入驗證
-
您必須為起始編號和結束編號引數指定整數值。
如果您為起始編號或結束編號引數指定非整數值,Step Functions 會將其四捨五入為最接近的整數。
例如,若要產生介於 1 到 999 之間的隨機數字,您可以使用下列輸入值:
{ "start": 1, "end": 999 }
若要產生隨機數,請將
start
andend
值提供給States.MathRandom
函數:"random.$": "States.MathRandom($.start, $.end)"
該
States.MathRandom
函數返回以下隨機數作為響應:{"random": 456 }
-
States.MathAdd
-
使用
States.MathAdd
內在函數返回兩個數字的總和。例如,您可以使用此函數在迴圈內增加值,而不叫用 Lambda 函數。輸入驗證
-
您必須為所有引數指定整數值。
如果您為一個或兩個引數指定非整數值,Step Functions 會將其四捨五入為最接近的整數。
-
您必須在 -2147483648 和 2147483647 的範圍內指定整數值。
例如,您可以使用下列值從 111 減去一個值:
{ "value1": 111, "step": -1 }
然後,使用
States.MathAdd
函數定義value1
為起始值,並step
作為遞增value1
的值:"value1.$": "States.MathAdd($.value1, $.step)"
該
States.MathAdd
函數將返回以下數字作為響應:{"value1": 110 }
-
字符串操作的內在
States.StringSplit
-
使用
States.StringSplit
內建函式將字串分割成值陣列。這個函數有兩個參數。第一個參數是一個字符串,第二個參數是分隔字符,該函數將用於分割字符串。範例 -使用單一分隔字元分割輸入字串
在此範例中,使用
States.StringSplit
來除以下項目inputString
,其中包含一系列逗號分隔值:{ "inputString": "1,2,3,4,5", "splitter": "," }
使用
States.StringSplit
函數並定義inputString
為第一個引數,並將分隔字元splitter
作為第二個引數:"array.$": "States.StringSplit($.inputString, $.splitter)"
該
States.StringSplit
函數返回以下字符串數組作為結果:{"array": ["1","2","3","4","5"] }
範例 -使用多個分隔字元分割輸入字串
在此範例中,使用
States.StringSplit
來除以下項目inputString
,其中包含多個分隔字元:{ "inputString": "This.is+a,test=string", "splitter": ".+,=" }
使用
States.StringSplit
函數,如下所示:{ "myStringArray.$": "States.StringSplit($.inputString, $.splitter)" }
該
States.StringSplit
函數返回以下字符串數組作為結果:{"myStringArray": [ "This", "is", "a", "test", "string" ]}
唯一標識符生成的內在
States.UUID
-
使用
States.UUID
內部函數返回使用隨機數生成的版本 4 通用唯一標識符(v4UUID)。例如,您可以使用此函數來調用其他 AWS 需要UUID參數或在 DynamoDB 表中插入項目的服務或資源。該
States.UUID
函數被調用,沒有指定參數:"uuid.$": "States.UUID()"
函數會傳回隨機產生的UUID,如下列範例所示:
{"uuid": "ca4c1140-dcc1-40cd-ad05-7b4aa23df4a8" }
泛型操作的內在
States.Format
-
使用
States.Format
內建函式,從常值和內插值建構字串。這個函數需要一個或多個參數。第一個參數的值必須是一個字符串,並且可以包含字符序列的零個或多個實例{}
。內在函數調用中必須有盡可能多的剩餘參數,因為發生了。{}
解釋器返回第一個參數中定義的字符串,每個參數{}
由內在調用中的位置對應參數的值替換。例如,您可以使用以下個人的輸入
name
,以及將其名稱插入到一個template
句子中:{ "name": "Arnav", "template": "Hello, my name is {}." }
使用該
States.Format
函數並指定template
要插入的字符串和字符串代替{}
字符:States.Format('Hello, my name is {}.', $.name)
或
States.Format($.template, $.name)
對於以前的任一輸入,
States.Format
函數返回完成的字符串作為響應:Hello, my name is Arnav.
內在函數中的保留字符
下列字元是為內建函數保留的,如果您希望這些字元出現在 Value: ' { }、和,則必須使用反斜線 ('\') 逸出。\
如果字元\
需要顯示為值的一部分而不做為逸出字元,您必須使用反斜線將其逸出。下面的轉義字符序列與內在函數一起使用:
文字字串
\'
代表'
。文字字串
\{
代表{
。文字字串
\}
代表}
。文字字串
\\
代表\
。
在中JSON,字串常值中包含的反斜線必須以另一個反斜線逸出。的對等清單JSON是:
-
轉義字符串
\\\'
表示\'
。 -
轉義字符串
\\\{
表示\{
。 -
轉義字符串
\\\}
表示\}
。 -
轉義字符串
\\\\
表示\\
。
注意
如果在內部調用字符串中找到\
一個打開的轉義反斜杠,解釋器將返回一個運行時錯誤。
如果欄位名稱包含未包含在規則member-name-shorthand
定義中的任何字元,則必須使用方括號表示法作為引數傳遞至內部函數的 P ath。JsonPath ABNF_
,您必須使用方括號符號。例如:$.abc.['def ghi']
。