

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

# 了解 Step Functions 中的狀態機器
<a name="concepts-statemachines"></a>

Step Functions 是以*狀態機器*為基礎，也稱為*工作流程*。工作流程由一系列的事件驅動步驟組成。

您可以使用 Amazon States Language 定義工作流程，也稱為 ASL。您可以選擇使用視覺化工作流程設計工具 Workflow Studio 來建置和編輯工作流程。

工作流程中的每個步驟都稱為 *狀態*。狀態有兩種類型：流程狀態和任務狀態：

**流程狀態**  
 流程狀態控制步驟的執行流程。例如，**選擇狀態**提供條件式邏輯；**等待狀態**暫停工作流程執行；**映射狀態**會針對資料集中的每個項目執行子工作流程；**平行狀態**會在工作流程中建立個別分支。

**任務狀態**  
任務狀態代表另一個 AWS 服務執行的工作單位，例如呼叫另一個 AWS 服務 或 API。任務狀態也稱為**動作**。您可以選擇數百個動作，以在 AWS 和外部服務中執行工作。（注意：您也可以使用在 Step Functions 外部執行的工作者來執行任務。 如需詳細資訊，請參閱 [活動](concepts-activities.md)。)

![Step Functions 工作流程元件的說明性範例。](http://docs.aws.amazon.com/zh_tw/step-functions/latest/dg/images/state-machine-conceptual-jsonata.png)


**執行和處理錯誤**

當您執行工作流程時，Step Functions 會建立稱為*執行*的工作流程執行個體。您可以監控工作流程執行的狀態。如果執行遇到錯誤，工作流程可能會捕捉到錯誤。根據您的使用案例，您可能會稍後重新驅動執行，以繼續工作流程。

**傳遞資料**

您可以選擇性地將 JSON 文字形式的**輸入資料**提供給工作流程。每個**步驟**都可以使用變數和狀態輸出將資料傳遞至後續步驟。儲存在變數中的資料可供後續步驟使用。狀態輸出會成為下一個步驟的輸入。若要進一步了解傳遞資料，請參閱 [使用變數在狀態之間傳遞資料](workflow-variables.md)。

在工作流程結束時，您的狀態機器可以選擇性地產生輸出，也可以以 JSON 的形式產生輸出。

**轉換資料**

狀態和狀態機器可以使用**查詢語言**轉換資料。建議的查詢語言是 **JSONata**；不過，在 re：Invent 2024 之前建立的狀態機器會使用 **JSONPath**。為了回溯相容性，您的狀態機器或個別狀態必須選擇使用 JSONata 查詢語言。

您可以透過將 `QueryLanguage` 欄位設定為 "JSONata" 來識別 JSONata 狀態機器和個別狀態。使用 JSONPath 的狀態機器和狀態缺少 `QueryLanguage` 欄位。

使用 JSONPath 的狀態會有狀態欄位，例如 InputPath、參數、ResultSelector、ResultPath 和 OutputPath。在 JSONPath 狀態機器定義中，您也會看到結尾為 的欄位名稱`.$`，以及字首為 `$.`和 的值`$$.`，這兩者都代表路徑。在路徑中，您可能會看到各種內部函數，例如 `States.MathAdd`。內部函數**僅用於** JSONPath。

JSONata 狀態使用**引數**和**輸出**欄位。在這些選用欄位中，您可能會看到如下所示的 JSONata 表達式：`"{% $type = 'local' %}"`。透過 JSONata，您可以使用表達式、運算子和函數。如需詳細資訊，請參閱 [在 Step Functions 中使用 JSONata 轉換資料](transforming-data.md)。

**注意**  
每個狀態只能使用一種查詢語言。您無法在單一步驟中混合 JSONPath 和 JSONata。

## 重要概念
<a name="key-concepts-get-started"></a>



以下提供內容的關鍵 Step Functions 術語概觀。




| 術語 | Description | 
| --- | --- | 
| 工作流程 | 通常反映業務流程的一系列步驟。 | 
| 州 (States) | 狀態機器中的個別步驟，可以根據其輸入做出決策、從這些輸入執行動作，並將輸出傳遞給其他狀態。<br />如需詳細資訊，請參閱[探索要在 Step Functions 中使用的工作流程狀態](workflow-states.md)。 | 
| 工作流程 Studio | 視覺化工作流程設計工具，可協助您更快速地建立原型和建置工作流程。<br />如需詳細資訊，請參閱[在 Step Functions Workflow Studio 中開發工作流程](workflow-studio.md)。 | 
| 狀態機器 | 使用 JSON 文字定義的工作流程，代表工作流程中的個別狀態或步驟，以及 欄位，例如 `StartAt`、 `TimeoutSeconds`和 `Version`。<br />如需詳細資訊，請參閱[Step Functions 工作流程的 Amazon States Language 狀態機器結構](statemachine-structure.md)。 | 
| Amazon States Language |  用於定義狀態機器的 JSON 型結構化語言。使用 ASL，您可以定義可執行工作 [探索要在 Step Functions 中使用的工作流程狀態](workflow-states.md)([`Task` 狀態](state-task.md)) 的狀態集合、決定要轉換為下一個 ([`Choice` 狀態](state-choice.md)) 的狀態，以及以錯誤 ([`Fail` 狀態](state-fail.md)) 停止執行。<br />如需詳細資訊，請參閱[使用 Amazon States Language 定義 Step Functions 工作流程](concepts-amazon-states-language.md)。 | 
| 輸入和輸出組態 | 工作流程中的狀態會接收 JSON 資料做為輸入，通常將 JSON 資料做為輸出傳遞至下一個狀態。Step Functions 提供篩選條件來控制狀態之間的資料流程。<br />如需詳細資訊，請參閱[在 Step Functions 中處理輸入和輸出](concepts-input-output-filtering.md)。 | 
| 服務整合 | 您可以從工作流程呼叫 AWS 服務 API 動作。<br />如需詳細資訊，請參閱[將 服務與 Step Functions 整合](integrate-services.md)。 | 
| 服務整合類型 |  [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/step-functions/latest/dg/concepts-statemachines.html)  | 
| 服務整合模式 | 呼叫 時 AWS 服務，您可以使用下列其中一種服務整合模式：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/step-functions/latest/dg/concepts-statemachines.html) | 
| 執行 | 狀態機器執行是您執行工作流程以執行任務的執行個體。<br /> 如需詳細資訊，請參閱[在 Step Functions 中啟動狀態機器執行](statemachine-starting.md)。 | 

## 狀態機器資料
<a name="concepts-state-machine-data"></a>

狀態機器資料的格式如下：
+ 狀態機器的初始輸入
+ 狀態之間傳遞的資料
+ 來自狀態機器的輸出

本節將說明 AWS Step Functions會如何格式化和使用狀態機器的資料。

**Topics**
+ [資料格式](#concepts-state-machine-data-format)
+ [狀態機器輸入/輸出](#concepts-state-machine-data-state-machine-input-output)
+ [狀態輸入/輸出](#concepts-state-machine-data-state-input-output)

### 資料格式
<a name="concepts-state-machine-data-format"></a>

狀態機器資料以 JSON 文字表示。您可以使用 JSON 支援的任何資料類型，將值提供給狀態機器。

**注意**  
JSON 文字格式中的數字符合 JavaScript 語意。這些數字通常對應到雙精度 [IEEE-854](https://standards.ieee.org/findstds/standard/854-1987.html) 值。
以下是有效的 JSON 文字：  
單機、以引號分隔的字串
物件
陣列
數字
布林值
`null`
狀態的輸出會成為下一個狀態的輸入。不過，您可以使用輸入[和輸出處理](concepts-input-output-filtering.md)來限制狀態以處理輸入資料的子集。

### 狀態機器輸入/輸出
<a name="concepts-state-machine-data-state-machine-input-output"></a>

您可以透過兩種方式之一，將初始輸入資料提供給 AWS Step Functions 狀態機器。您可以在開始執行時將資料傳遞至`[StartExecution](https://docs.aws.amazon.com/step-functions/latest/apireference/API_StartExecution.html)`動作。您也可以從 [Step Functions 主控台](https://console.aws.amazon.com/states/home?region=us-east-1#/)將資料傳遞至狀態機器。初始資料會傳送至狀態機器的 `StartAt` 狀態。如果沒有提供輸入，預設會是空的物件 (`{}`)。

執行的輸出會由最後狀態 (`terminal`) 傳回。此輸出會在執行結果中以 JSON 文字呈現。

對於標準工作流程，您可以使用 `[DescribeExecution](https://docs.aws.amazon.com/step-functions/latest/apireference/API_DescribeExecution.html)`動作等外部發起人從執行歷史記錄中擷取執行結果。您可以在 [Step Functions 主控台](https://console.aws.amazon.com/states/home?region=us-east-1#/)上檢視執行結果。

對於快速工作流程，如果您啟用記錄，您可以從 CloudWatch Logs 擷取結果，或在 Step Functions 主控台中檢視和偵錯執行。如需詳細資訊，請參閱[使用 CloudWatch Logs 在 Step Functions 中記錄執行歷史記錄](cw-logs.md)及[在 Step Functions 主控台中檢視執行詳細資訊](concepts-view-execution-details.md)。

您也應該考慮與狀態機器相關的配額。如需詳細資訊，請參閱[Step Functions 服務配額](service-quotas.md)

### 狀態輸入/輸出
<a name="concepts-state-machine-data-state-input-output"></a>

每個狀態的輸入皆包含先前狀態的 JSON 文字，或者針對 `StartAt` 狀態，則是要執行的輸入。某些流程控制狀態會將他們的輸入重複到他們的輸出中。

在以下範例中，狀態機器會同時新增兩個數字。

1. 定義 AWS Lambda 函數。

   ```
   function Add(input) {
     var numbers = JSON.parse(input).numbers;
     var total = numbers.reduce(
       function(previousValue, currentValue, index, array) {
         return previousValue + currentValue; });
     return JSON.stringify({ result: total });
   }
   ```

1. 定義 狀態機器。

   ```
   {
     "Comment": "An example that adds two numbers together.",
     "StartAt": "Add",
     "Version": "1.0",
     "TimeoutSeconds": 10,
     "States":
       {
           "Add": {
             "Type": "Task",
             "Resource": "arn:aws:lambda:{{region}}:123456789012:function:Add",
             "End": true
           }
       }
   }
   ```

1. 開始執行以下 JSON 文字。

   ```
   { "numbers": [3, 4] }
   ```

   `Add` 狀態會接收 JSON 文字並將其傳遞給 Lambda 函數。

   Lambda 函數會將計算結果傳回 狀態。

   狀態會在它的輸出中傳回以下值。

   ```
   { "result": 7 }
   ```

   由於 `Add` 也是狀態機器中的最終狀態，此值會做為狀態機器的輸出傳回。

   如果最終狀態沒有傳回輸出，則狀態機器會傳回空的物件 (`{}`)。

如需詳細資訊，請參閱[在 Step Functions 中處理輸入和輸出](concepts-input-output-filtering.md)。

## AWS Step Functions 從其他 服務叫用
<a name="concepts-invoke-sfn"></a>

您可以設定其他數個 服務來叫用狀態機器。根據狀態機器的[工作流程類型](choosing-workflow-type.md)，您可以非同步或同步叫用狀態機器。若要同步叫用狀態機器，請使用 `[StartSyncExecution](https://docs.aws.amazon.com/step-functions/latest/apireference/API_StartSyncExecution.html)` API 呼叫或 Amazon API Gateway 與快速工作流程整合。使用非同步調用時，Step Functions 會暫停工作流程執行，直到傳回任務字符為止。不過，等待任務字符確實會讓工作流程同步。

您可以設定 叫用 Step Functions 的服務包括：
+  AWS Lambda，使用 [https://docs.aws.amazon.com/step-functions/latest/apireference/API_StartExecution.html](https://docs.aws.amazon.com/step-functions/latest/apireference/API_StartExecution.html)呼叫。
+  [Amazon API Gateway](https://docs.aws.amazon.com/step-functions/latest/dg/tutorial-api-gateway.html) 
+  [Amazon EventBridge](https://docs.aws.amazon.com/eventbridge/latest/userguide/create-eventbridge-rule.html) 
+ [AWS CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/action-reference-StepFunctions.html) 
+  [AWS IoT 規則引擎](https://docs.aws.amazon.com/iot/latest/developerguide/iot-rule-actions.html) 
+  [AWS Step Functions](https://docs.aws.amazon.com/step-functions/latest/dg/connect-stepfunctions.html) 

Step Functions 調用由`StartExecution`配額管理。如需詳細資訊，請參閱：
+ [Step Functions 服務配額](service-quotas.md)

## 狀態機器中的轉換
<a name="concepts-transitions"></a>

當您開始新的狀態機器執行時，系統會從最上層`StartAt`欄位中參考的狀態開始。此欄位以字串提供，必須完全符合工作流程中狀態的名稱，包括大小寫。

狀態執行後， AWS Step Functions 會使用 `Next` 欄位的值來判斷要前進到的下一個狀態。

 `Next` 欄位也會將狀態名稱指定為字串。此字串區分大小寫，且必須與狀態機器描述中指定的狀態名稱完全相符

例如，以下狀態包含對 `NextState` 的移轉。

```
"SomeState" : {
  ...,
  "Next" : "NextState"
}
```

大多數狀態只允許具有 `Next` 欄位的單一轉換規則。不過，某些流程控制狀態，例如`Choice`狀態，可讓您指定多個轉換規則，每個規則都有自己的`Next`欄位。[Amazon 狀態語言](concepts-amazon-states-language.md)提供每個您可以指定之狀態類型的詳細資訊，包括有關如何指定轉換的資訊。

狀態可以具有來自其他狀態的多個傳入轉換。

程序會重複，直到達到結束狀態 （具有 `"Type": Succeed`、 `"Type": Fail`或 的狀態`"End": true`)，或發生執行時間錯誤為止。

當您[redrive](redrive-executions.md)執行時，會將其視為狀態轉換。此外，在 中重新執行的所有狀態redrive也會被視為狀態轉換。

下列規則適用於狀態機器內的狀態：
+ 狀態可能會以任何順序出現在封裝區塊中。不過，列出它們的順序不會影響它們的執行順序。該順序取決於狀態的內容。
+ 在狀態機器中，只能有一個指定為`start`狀態的狀態。`start` 狀態由最上層結構中的 `StartAt` 欄位值定義。
+ 根據您的狀態機器邏輯，例如，如果您的狀態機器有多個邏輯分支，您可能有多個`end`狀態。
+ 如果您的狀態機器只包含一個狀態，它可以是開始和結束狀態。

### 分散式映射狀態的轉換
<a name="dist-map-transitions"></a>

當您在分散式模式中使用 `Map` 狀態時，將針對*分散式映射狀態*啟動的每個子工作流程執行，向您收取一次狀態轉換的費用。當您在內嵌模式中使用 `Map` 狀態時，您不需要為*內嵌映射*狀態的每個反覆運算支付狀態轉換費用。

您可以在分散式模式中使用 `Map` 狀態來最佳化成本，並在`Map`狀態定義中包含巢狀工作流程。當您啟動 **Express** 類型的子工作流程執行時，*分散式映射狀態*也會新增更多值。Step Functions 會儲存 Express 子工作流程執行的回應和狀態，這可減少在 CloudWatch Logs 中存放執行資料的需求。您也可以存取*分散式映射狀態*可用的流程控制，例如定義錯誤閾值或批次處理一組項目。如需 Step Functions 定價的資訊，請參閱 [AWS Step Functions 定價](https://aws.amazon.com/step-functions/pricing/)。

## Step Functions 中的讀取一致性
<a name="concepts-read-consistency"></a>

中的狀態機器更新最終 AWS Step Functions 一致。幾秒鐘內的所有`StartExecution`呼叫都會使用更新的定義 和 `roleArn`(IAM 角色的 Amazon Resource Name)。如果在呼叫 `UpdateStateMachine` 後立即開始執行，則可能會使用先前的狀態機器定義和 `roleArn`。

如需詳細資訊，請參閱下列內容：
+ *AWS Step Functions API 參考*中的 [https://docs.aws.amazon.com/step-functions/latest/apireference/API_UpdateStateMachine.html](https://docs.aws.amazon.com/step-functions/latest/apireference/API_UpdateStateMachine.html)