

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

# Step Functions 工作流程的 Amazon States Language 狀態機器結構
<a name="statemachine-structure"></a>

**管理狀態和轉換資料**  
了解如何[使用變數在狀態與使用 JSONata 轉換資料之間傳遞資料](workflow-variables.md)。 [ JSONata](transforming-data.md)

狀態機器是使用 JSON 文字來定義的，而該 JSON 文字代表包含下列欄位的結構。

** `Comment` (選用)**  
狀態機器的人類可讀描述。

** `QueryLanguage` （選用；省略 時，預設為 `JSONPath`)**  
+ 狀態機器使用的查詢語言名稱。允許的值為 `JSONPath` 和 `JSONata`。
+ 如果未提供狀態機器，則每個狀態的預設值為 JSONPath。
+ 當最上層狀態機器查詢語言為 時`JSONPath`，個別狀態可以透過將 QueryLanguage 設定為 來覆寫查詢語言`JSONata`。有鑑於此方法，您可以逐步將狀態機器從 JSONPath 轉換為 JSONata，一次一個狀態。
+ **注意：**您無法將頂層 JSONata 型狀態機器還原為 JSONata 和 JSONPath 狀態的混合。

** `StartAt` (必要)**  
一個字串，該字串必須完全符合其中一個狀態物件的名稱 (區分大小寫)。

** `TimeoutSeconds` （選用）**  
狀態機器可以執行的執行秒數上限。如果執行超過指定的時間，執行會失敗，出現`States.Timeout` [錯誤名稱](concepts-error-handling.md#error-handling-error-representation)。

** `Version` (選用)**  
狀態機器中使用的 Amazon States Language 版本 （預設為 "1.0")。

** `States` (必要)**  
一個物件，其中包含以逗號分隔的一組狀態。

`States` 欄位包含[狀態](workflow-states.md)。

```
{
    "State1" : {
    },

    "State2" : {
    },
    ...
}
```

狀態機器是由其包含的狀態和其間的關係所定義。

以下是範例。

```
{
  "Comment": "A Hello World example of the Amazon States Language using a Pass state",
  "StartAt": "HelloWorld",
  "States": {
    "HelloWorld": {
      "Type": "Pass",
      "Result": "Hello World!",
      "End": true
    }
  }
}
```

啟動此狀態執行時，系統會從 `StartAt` 欄位 (`"HelloWorld"`) 中參考的狀態著手。如果此狀態具有 `"End": true` 欄位，則執行停止並傳回結果。否則，系統會尋找 `"Next":` 欄位並繼續以該狀態執行。此程序會重複執行，直到系統達到結束狀態 (具有 `"Type": "Succeed"`、`"Type": "Fail"` 或 `"End": true` 的狀態)，或發生執行時間錯誤為止。

下列規則適用於狀態機器內的狀態：
+ 封閉區塊內的狀態可以任何順序發生，但是其列出的順序不會影響其執行順序。此順序是由狀態本身的內容所決定。
+ 在狀態機器內，只能有一個狀態指定為 `start` 狀態，而該狀態是由最上層結構中 `StartAt` 欄位的值所指定。此狀態是開始執行時最先執行的狀態。
+ `End` 欄位為 `true` 的任何狀態都會被視為 `end` (或 `terminal`) 狀態。根據您的狀態機器邏輯，例如，如果您的狀態機器有多個執行分支，您可能有一個以上的`end`狀態。
+ 如果狀態機器只包含一個狀態，該狀態可能同時是 `start` 狀態和 `end` 狀態。

## 工作流程中的常見狀態欄位
<a name="amazon-states-language-common-fields"></a>

下列欄位適用於所有狀態元素。

** `Type` (必要)**  
狀態的類型：任務、選擇、平行、映射、通過、等待、成功、失敗。

**`QueryLanguage` （選用；省略 時，預設為 `JSONPath`)**  
+ 狀態使用的查詢語言名稱。允許的值為 `JSONPath` 和 `JSONata`。
+ 當最上層狀態機器查詢語言為 時`JSONPath`，個別狀態可以透過將 QueryLanguage 設定為 來覆寫查詢語言`JSONata`。有鑑於此方法，您可以逐步將狀態機器從 JSONPath 轉換為 JSONata，一次一個狀態。

** `Next` **  
下一個狀態的名稱將會在目前狀態完成時執行。有些狀態類型 (例如 `Choice`) 允許使用多個轉移狀態。  
如果目前狀態是工作流程中的最後一個狀態，或終端狀態，例如 [工作流程狀態成功](state-succeed.md)或 [失敗的工作流程狀態](state-fail.md)，則您不需要指定 `Next` 欄位。

** `End` **  
如果設定為 `true`，請將此狀態指定為結束狀態 (結束執行)。每個狀態機器可以有任意數量的結束狀態。只有其中一個 `Next` 或 `End` 可使用於狀態中。有些狀態類型，例如 `Choice`或終端狀態，例如 [工作流程狀態成功](state-succeed.md)和 [失敗的工作流程狀態](state-fail.md)，不支援或使用 `End` 欄位。

** `Comment` (選用)**  
保留人類可讀的狀態描述。

** `Assign` (選用)**  
用來存放變數。`Assign` 欄位接受 JSON 物件，其中包含定義變數名稱及其指派值的鍵/值對。任何字串值，包括物件或陣列內的值，都會在以`{% %}`字元包圍時評估為 JSONata   
如需詳細資訊，請參閱[使用變數在狀態之間傳遞資料](workflow-variables.md)。

** `Output` （選用，僅限 JSONata)**  
用來指定和轉換 狀態的輸出。指定時，值會覆寫狀態輸出預設值。  
輸出欄位接受任何 JSON 值 （物件、陣列、字串、數字、布林值、 null)。任何字串值，包括物件或陣列內的值，如果被 \$1% %\$1 字元包圍，將評估為 JSONata。  
 輸出也直接接受 JSONata 表達式，例如：「輸出」：「\$1% jsonata 表達式 %\$1」   
如需詳細資訊，請參閱[輸入和輸出處理](concepts-input-output-filtering.md)。

** `InputPath` （選用，僅限 JSONPath)**  
一個[路徑](concepts-input-output-filtering.md)，可供選取一部分的狀態輸入以傳遞至狀態的任務進行處理。如果省略，它具有可指定整個輸入的 `$` 值。如需詳細資訊，請參閱[輸入和輸出處理](concepts-input-output-filtering.md)。

** `OutputPath` （選用，僅限 JSONPath)**  
選取要傳遞至下一個狀態之狀態輸出的一部分的[路徑](concepts-input-output-filtering.md)。如果省略，則其具有`$`指定整個輸出的值。如需詳細資訊，請參閱[輸入和輸出處理](concepts-input-output-filtering.md)。