內部函數 - AWS Step Functions

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

內部函數

Amazon States 語言提供數個內建函數 (也稱為內建函式),可協助您在使用狀態的情況下執行基本資料處理操作。Task內在函數是看起來類似於編程語言中的函數的構造。它們可用於幫助有效負載構建器處理進出狀TaskResource字段的數據。

在 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 或更高版本,以便能夠在工作流程中包含所有內建函數。

支援內建函數的欄位

下表顯示哪些欄位支援每個狀態的內建函式。

支援內建函數的欄位
State
通行證 任務 選擇 等候 成功 失敗 平行 Map
InputPath
參數
ResultSelector
ResultPath
OutputPath
變數
<Comparison Operator>路徑
TimeoutSecondsPath
HeartbeatSecondsPath
憑證

數組的內在函數

使用下列內建函式來執行陣列操作。

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函數來查找以下內容中的lookingForinputArray

"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

這個內在函數返回指定索引的值。這個函數有兩個參數。第一個參數是值的數組,第二個參數是要返回的值的數組索引。

例如,使用下列inputArrayindex值:

{ "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 數據的路徑。解釋器返回一個字符串,其中包含表示由路徑指定的數據的 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 and end 值提供給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 通用唯一標識符(v4 UUID)。例如,您可以使用此函數呼叫需要 UUID 參數的其他AWS服務或資源,或在 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 的等效列表是:

  • 轉義字符串\\\'表示\'

  • 轉義字符串\\\{表示\{

  • 轉義字符串\\\}表示\}

  • 轉義字符串\\\\表示\\

注意

如果在內部調用字符串中找到\一個打開的轉義反斜杠,解釋器將返回一個運行時錯誤。