

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

# 了解如何開始使用 Step Functions
<a name="getting-started"></a>

使用 Step Functions 服務，您可以協調複雜的應用程式工作流程。若要開始使用，您將使用 Workflow Studio 來建立和執行內建 **Hello World** 工作流程。您將在程式碼中檢閱自動產生的 [Amazon States Language](concepts-amazon-states-language.md)(ASL) 定義。最後，您將drag-and-drop服務整合以進行情緒分析。

完成本教學課程後，您將了解如何使用 Workflow Studio，同時使用**設計和****程式碼**模式來建立、設定、執行和更新工作流程。

預估持續時間：**20-30 分鐘**

## 您將建置的內容
<a name="what-you-will-build"></a>

您的第一個狀態機器將從*流程狀態*開始。流程狀態用於引導和控制您的工作流程。了解如何執行工作流程後，您將新增 **動作**，以整合 Amazon Comprehend 服務與**任務狀態**。

下圖顯示您將建置的完整狀態機器視覺效果。當您第一次建立 Hello World 狀態機器時，不需要執行其他資源。Step Functions 主控台只要按一下即可建立所有狀態和 IAM 角色。稍後，當您新增服務整合時，您將需要建立具有自訂許可政策的角色。

![\[Hello World 工作流程的視覺化呈現。\]](http://docs.aws.amazon.com/zh_tw/step-functions/latest/dg/images/hello-world-arch.png)


## 步驟 1 - 建立您的狀態機器
<a name="step-1-create-your-state-machine"></a>

 在 Step Functions 中，*工作流程*稱為**狀態機器**。我們會交替使用這兩個術語。您的工作流程將包含****採取動作**或**控制狀態機器流程**的狀態。

1. 前往 **Step Functions 主控台。**

1. 在 Step Functions 主控台中，從左上角導覽或導覽列中選擇「**Step Functions**」，然後選擇**開始使用**：  
![\[說明如何開始使用 Hello World 工作流程的說明性螢幕擷取畫面\]](http://docs.aws.amazon.com/zh_tw/step-functions/latest/dg/images/get-started-hello-world.png)

1. 從選項中，選擇**執行 Hello World**：  
![\[說明如何選擇 Hello World 工作流程的說明性螢幕擷取畫面\]](http://docs.aws.amazon.com/zh_tw/step-functions/latest/dg/images/create-hello-world.png)

**提示**  
我們建議您逐步完成簡短的主控台內演練，以熟悉 UI。

### Workflow Studio 概觀
<a name="overview-of-workflow-studio"></a>

 使用 Workflow Studio for Step Functions，您可以在畫布上以視覺化方式drag-and-drop狀態來建置工作流程。

 您可以新增和編輯狀態、設定步驟、轉換結果，以及設定錯誤處理。下列螢幕擷取畫面顯示您將用來建置狀態機器之界面的四個重要區域。

![\[Workflow Studio 介面四個重要區域的說明式螢幕擷取畫面\]](http://docs.aws.amazon.com/zh_tw/step-functions/latest/dg/images/wfs-panel-overview.png)


**模式** - Workflow Studio 提供三種操作模式，預設為視覺化設計模式。
+ **設計** - 視覺化編輯模式，您可以在其中drag-and-drop到工作流程中。
+ **程式碼** - 專注於 Amazon States 語言程式碼的模式，也稱為 ASL 程式碼。您可以直接編輯 ASL 程式碼，並查看視覺效果設計中反映的變更。
+ **Config** - 組態選項，包括狀態機器的名稱和類型 （標準或快速）、工作流程執行時指派的角色、記錄、追蹤、版本控制、加密和標籤。

 **狀態瀏覽器**包含下列三個索引標籤：
+ **動作** - 您可以drag-and-drop至工作流程AWSAPIs 清單。每個動作代表任務工作流程狀態。
+ **流程** - 流程狀態，以控制工作流程中的步驟順序。
+ **模式** - ready-to-use、可重複使用的建置區塊，例如反覆處理 Amazon S3 儲存貯體中的資料。

 **Canvas 和工作流程圖表**可讓您drag-and-drop狀態、變更狀態順序，以及選取要設定和測試的狀態。

 **Inspector 面板**可讓您檢視和編輯畫布上選取之任何狀態的屬性。您可以開啟*定義*切換以顯示目前選取狀態的程式碼。

### 狀態機器概觀
<a name="overview-of-the-state-machine"></a>

 Hello World 工作流程從**傳遞狀態**開始，將輸入*傳遞*至其輸出，而不執行工作。傳遞狀態可用來產生靜態 JSON 輸出或轉換 JSON 輸入，然後再將資料傳遞至下一個狀態。建構和偵錯狀態機器時，傳遞狀態非常有用。

 下一個狀態，**選擇狀態**，使用 中的資料`IsHelloWorldExample`來選擇工作流程的下一個分支。如果第一個規則相符，工作流程會暫停為**等待狀態**，然後以**平行狀態**執行兩個任務，然後繼續前往檢查點並成功結束工作流程。當沒有相符項目時，工作流程會預設為**失敗狀態**，然後再停止狀態機器。

 當您想要在執行更多工作之前延遲時，等待狀態會很有用。也許您的工作流程會在訂單項目後等待 30 秒，因此您的客戶有時間注意到並修正不正確的運送地址。

 平行狀態可以對資料執行多個程序。或許工作流程會同時列印訂單票證、更新庫存，以及增加每日銷售報告。

![\[Hello World 工作流程入門說明圖\]](http://docs.aws.amazon.com/zh_tw/step-functions/latest/dg/images/workflow-1-hello-world.png)


### 檢視工作流程程式碼 (ASL)
<a name="view-the-code"></a>

 您的第一個狀態機器實際上相當詳細，因此請檢閱程式碼來進一步探索。

 狀態機器是使用 [Amazon States Language (ASL)](https://states-language.net/) 定義的，這是開放原始碼規格，描述以 JSON 為基礎的語言，以宣告方式描述狀態機器。

**檢視整個狀態機器定義 **

1. 選擇 **\$1 \$1 Code** 按鈕以檢視 ASL Code。

1. 檢視左側的程式碼，並與右側的狀態機器圖形進行比較。

1. 在畫布上選取要檢閱的某些狀態。例如，選擇**選擇狀態**。

![\[程式碼檢視的說明性影像\]](http://docs.aws.amazon.com/zh_tw/step-functions/latest/dg/images/hello-code-view.png)


 您是否注意到在程式碼檢視中如何反白顯示狀態的定義？ 

**在 Inspector 中檢視程式碼 **

1. 切換回**設計**模式。

1. 展開右側的 **Inspector 面板**。

1. 從 Canvas 上的工作流程圖表中選取**選擇狀態**。

1. 在**檢查器**面板中，選擇**定義**切換。

 請嘗試選擇其他狀態。了解您選取的每個狀態的 ASL 程式碼如何捲動至檢視並反白顯示？ 

### （實際上） 建立狀態機器
<a name="actually-create-the-state-machine"></a>

**警告：立即命名您的狀態機器！**  
您無法在建立狀態機器之後將其**重新命名**。在儲存狀態機器**之前**，請選擇名稱。

 到目前為止，您一直在處理狀態機器的草稿。尚未建立任何資源。

 **重新命名和建立您的狀態機器** 

1. 選擇**組態模式**。

1. 針對狀態機器名稱，輸入 `MyFirstStateMachine`

1. 如需許可，請接受預設 *以建立新角色*。

1. 選擇**建立**按鈕，**實際**建立您的狀態機器。

 您應該會看到狀態機器和新 IAM 角色已建立的通知。

 系統會自動顯示啟動狀態機器的選項。您將在下一個步驟執行此操作！

![\[Hello World 工作流程入門說明圖\]](http://docs.aws.amazon.com/zh_tw/step-functions/latest/dg/images/workflow-created.png)


**工作流程建立完成！**  
Step Functions 已建立您的工作流程和 IAM 角色。現在，您已準備好啟動狀態機器。

## 步驟 2 - 啟動您的狀態機器
<a name="step-2-start-your-state-machine"></a>

 建立狀態機器之後，您可以啟動執行中的工作流程。

 工作流程可選擇採用可在 狀態使用的**輸入**、傳送至整合的服務，以及傳遞至下一個狀態。

**Hello World** 狀態機器是獨立的，不需要輸入。

![\[入門說明圖\]](http://docs.aws.amazon.com/zh_tw/step-functions/latest/dg/images/start_283486381.jpg)


 **啟動狀態機器**

1. 輸入 `hello001` 表示執行的名稱。

1. 將輸入欄位保留*空白*。

1. 選擇**開始執行**按鈕。

![\[啟動工作流程的說明性影像。\]](http://docs.aws.amazon.com/zh_tw/step-functions/latest/dg/images/hello001.png)


### 檢閱執行詳細資訊
<a name="review-the-execution-details"></a>

 開始之後，您應該會立即看到前兩個狀態**成功**。

 稍候片刻，其餘狀態轉換就會執行以完成工作流程。

 您是否想知道**選擇狀態** (*是 Hello World 範例？*) 如何決定分支到**等待 X 秒**狀態？ 

1. 提示：狀態機器的第一個步驟包含分支決策所需的資料 

1. 在**圖形檢視**中，您可以在執行期間監控進度，並探索每個狀態的詳細資訊。

1. 選取第一個**通過狀態** （命名為*設定變數和狀態輸出*)，然後檢閱**輸入/輸出**索引標籤。

 您應該會看到**狀態輸入**空白，但**狀態輸出**包含將 值設為 `IsHelloWorldExample` 的 JSON`true`。

![\[執行 001\]](http://docs.aws.amazon.com/zh_tw/step-functions/latest/dg/images/hello001-graph-view.png)


 從**圖形檢視**切換到**資料表檢視**，以查看依名稱、類型和狀態列出的狀態清單。

![\[執行 001 資料表檢視\]](http://docs.aws.amazon.com/zh_tw/step-functions/latest/dg/images/hello001-table.png)


**提示**  
請記下先前螢幕擷取畫面中的**持續時間**和**時間軸**欄位。一目了然，您可以看到哪些狀態需要比其他狀態更長的時間。

 在此執行詳細資訊頁面上還有兩個檢視可供探索：**事件檢視**和**狀態檢視**。

 **事件檢視**是從狀態到狀態之流程的詳細精細檢視。

 展開**事件檢視**資料表中的第一個 **PassStateEntered** 和 **PassStateExited** 事件，以查看狀態如何不需要輸入、指派稱為零`CheckpointCount`值的變數，並產生您先前看到的輸出。

![\[執行 001 事件檢視\]](http://docs.aws.amazon.com/zh_tw/step-functions/latest/dg/images/hello001-event-view.png)


 最後，您有類似於資料表**檢視的狀態**檢視。 ****在**狀態檢視**表中，您可以選擇性地展開**狀態**，只查看每個狀態的輸入和輸出：

![\[執行 001 狀態檢視\]](http://docs.aws.amazon.com/zh_tw/step-functions/latest/dg/images/hello001-state-view.png)


**恭喜您！您已執行第一個 Step Functions 狀態機器！**  
 使用傳遞狀態將**靜態資料**新增至工作流程是一種常見的模式，特別是用於故障診斷。  
 在下一個步驟中，您將更新工作流程，以便*動態*設定狀態機器輸入。

## 步驟 3 - 處理外部輸入
<a name="step-3-process-external-input"></a>

 將 的值`IsHelloWorldExample`設定為工作流程中的常數值並不實際。您應該預期狀態機器會回應不同的輸入資料。

 在此步驟中，我們將示範如何使用外部 JSON 資料做為工作流程的輸入：

![\[處理外部輸入\]](http://docs.aws.amazon.com/zh_tw/step-functions/latest/dg/images/process-external-input.png)


### 移除硬式編碼輸入
<a name="remove-the-hardcoded-input"></a>

 首先，取代第一個通過狀態的**輸出**中的硬式編碼值。

1. 選取頁面右上角的編輯狀態機器按鈕來編輯您的 Hello World **狀態機器**。

1. 選取**開始**後的第一個**通過狀態** （命名為*設定變數和狀態輸出*)，然後選取**輸出**索引標籤。

1. 將**輸出**取代為下列 JSON：

   ```
   {
     "IsHelloWorldExample": "{% $states.input.hello_world %}",
     "ExecutionWaitTimeInSeconds":  "{% $states.input.wait %}"
   }
   ```

1. 儲存狀態機器。

 更新的狀態輸出將使用 JSONata 表達式從預留 **[\$1states](transforming-data.md#transforming-reserved-variable-states)** 變數提取輸入資料。這些值將做為輸出傳遞至下一個狀態，以成為下一個狀態的輸入。

### 使用輸入資料執行更新的工作流程
<a name="run-the-updated-workflow-with-input-data"></a>

 接著，執行工作流程，並以 JSON 的形式提供外部輸入資料。

1. 選擇**執行**按鈕來執行工作流程。

1. 對於**名稱**，請使用隨機產生的 ID。

1. 針對輸入欄位使用下列 JSON：

   ```
   {
       "wait" : 20,
       "hello_world": true
   }
   ```

1. 選擇**開始執行**按鈕。

 您的狀態機器執行應該等待較長的時間 (20 秒），但最終應該使用您提供的輸入成功。

 在圖形檢視中，檢閱第一個通過狀態的**輸入/輸出**。請注意，您提供的輸入如何轉換為輸出。此外，請查看執行詳細資訊頁面頂端的執行**輸入和輸出**。這兩個位置都會顯示您用來啟動執行的輸入。

**提示**  
如果您在 *hello\$1world* 設定為 **false** 的情況下執行新的執行，預期會發生什麼情況？ 試試看！

### 檢閱工作流程執行
<a name="review-workflow-executions"></a>

 現在您已執行工作流程幾次，請檢閱執行詳細資訊以檢閱工作流程的執行。

 **檢閱執行詳細資訊**

1. 從導覽導覽列或左側選單中選擇**狀態機器**。

1. 選擇您的狀態機器。

 在**執行**索引標籤中，您應該會看到執行清單，類似於下列螢幕擷取畫面：

![\[顯示 hello 工作流程執行範例清單的說明性螢幕擷取畫面。\]](http://docs.aws.amazon.com/zh_tw/step-functions/latest/dg/images/hello-executions.png)


 最後一項注意事項：工作流程執行名稱必須是唯一的，**且無法**重複使用。雖然我們在本教學課程中建議簡短名稱 (`hello001`)，但建議您使用對您的生產工作負載永遠是唯一的命名慣例。

**提示**  
 **恭喜您！**您已修改工作流程，以處理每次執行工作流程時可能不同的*外部輸入*。

## 步驟 4 - 整合服務
<a name="step-4-integrate-a-service"></a>

 Step Functions 狀態機器可以使用 [AWSSDK integrations](https://docs.aws.amazon.com/step-functions/latest/dg/supported-services-awssdk.html) 呼叫超過 220 個AWS服務。AWS服務為您的狀態機器提供超過 10，000 個潛在的 API 動作。

 在此步驟中，您將整合 Amazon Comprehend 任務以進行**情緒分析**，以處理您的狀態機器輸入。

 服務整合使用三種*服務整合模式*之一：

1. **請求回應 **（預設） - 等待 HTTP 回應，然後*立即*繼續下一個狀態。

1. **執行任務 **(*.sync*) - 等待任務完成，然後再移至下一個步驟。

1. **等待回呼** (*.waitForTaskToken*) - 暫停工作流程，直到外部程序傳回任務字符。

![\[描述服務整合的說明性螢幕擷取畫面。\]](http://docs.aws.amazon.com/zh_tw/step-functions/latest/dg/images/AdobeStock_513621530_integration_1000.jpg)


 對於您的第一個整合，您將使用**請求回應** （預設） 整合模式。

### 整合如何運作？
<a name="how-do-integrations-work"></a>

 *任務狀態*代表狀態機器執行的單一工作單位。狀態機器中所有工作都是由任務完成。

 任務通常會透過將輸入傳遞至其他服務的 API 動作來執行工作，然後執行自己的工作。您可以使用多個欄位來指定任務的執行方式，包括：`Credentials`、`TimeoutSeconds`、`Retry``Catch`、 等。您可以在 中進一步了解任務[任務工作流程狀態](state-task.md)。

 若要使用 AWSSDK 整合，您可以指定要呼叫**的服務名稱**和 **API**。有些整合也需要參數。

 您可以使用 Amazon States Language 在任務狀態**的資源**欄位中指定 AWSAPI 動作。您可以選擇性地將服務整合類型新增至服務名稱。

 若要指定 API 動作，您將使用下列資源名稱範本：

```
arn:aws:states:::aws-sdk:serviceName:apiAction.[serviceIntegrationPattern]
```

**參數名稱大小寫**  
請注意，API 動作將為 *camelCase* （小寫首字母），但 *ParameterNames* 將為 Pascal 大小寫 （大寫首字母）。

 **資源名稱的範例**
+ `arn:aws:states:::aws-sdk:ec2:describeInstances` 會傳回呼叫 Amazon EC2 describeInstances API 的結果。
+ `arn:aws:states:::aws-sdk:s3:listBuckets` 會傳回呼叫 Amazon S3 listBuckets API 的結果。
+ `arn:aws:states:::aws-sdk:sfn:startExecution` 將啟動巢狀 Step Functions 狀態機器執行，並傳回該工作流程的結果。

 當 Step Functions 使用 `Task` 狀態呼叫另一個服務時，預設模式為[請求回應](https://docs.aws.amazon.com/step-functions/latest/dg/connect-to-resource.html#connect-default)。使用**請求回應**整合模式時，Step Functions 會呼叫服務、接收回應，並***立即***進入下一個狀態。

![\[情緒偵測整合\]](http://docs.aws.amazon.com/zh_tw/step-functions/latest/dg/images/integrate_sentiment_592194331.png)


### 步驟 4.1 - 新增情緒分析狀態
<a name="step-1-add-sentiment-analysis-state"></a>

1. **編輯** **MyFirstStateMachine** 狀態機器。

1. 在**狀態瀏覽器****的動作**面板中，搜尋 `DetectSentiment`。

1. 將 **Comprehend DetectSentiment** 拖放到**選擇狀態****的預設**分支。

1. 選取並刪除**失敗**狀態。

1. 從**狀態瀏覽器**中的**流程索引標籤**中，在 **DetectSentiment** 之後拖曳**成功**狀態。

### 步驟 4.2 - 設定情緒分析狀態
<a name="step-2-configure-the-sentiment-analysis-state"></a>

1. 選取 **Comprehend** 步驟，在 Inspector 面板中進行設定。

1. 選取**引數和輸出**索引標籤，然後使用下列 JSON 取代**引數**：

   ```
   {
      "LanguageCode": "en",
      "Text": "{% %}"
   }
   ```

1. 將游標放在百分比符號**之間**： `{% %}`和 類型： `$`

1. 在編輯器中使用**自動完成**來選擇 `states`、

    然後輸入 `.` 並選擇 `context`，

    然後輸入 `.` 並選擇 `Execution`，

    然後輸入 `.` 並選擇 `Input`，

    最後，輸入 從**內容物件**`.feedback_comment`擷取初始輸入。

 選擇這些自動完成選項後，您的狀態**引數**應該具有下列 JSON：

```
{
    "LanguageCode": "en",
    "Text": "{% $states.context.Execution.Input.feedback_comment %}"
}
```

**使用編輯器自動完成**  
透過編輯器自動完成，您可以探索您的選項。  
自動完成會列出您的變數、包含內容物件的預留 **[\$1states](transforming-data.md#transforming-reserved-variable-states)** 變數，以及其定義的可用函數！

### 步驟 4.3 - 設定身分政策
<a name="step-3-configure-an-identity-policy"></a>

 您必須先建立**角色**和**政策**，以允許狀態機器對外部服務執行 API 呼叫，才能執行工作流程。

 **為 Step Functions 建立 IAM 角色** 

1. 前往新標籤中的 IAM 主控台，然後選取**角色**。

1. 選擇 **Create a new role (建立新角色)**。

1. 針對**信任的實體類型**，選擇*AWS服務*。

1. 針對**使用案例**，選擇 *Step Functions*。

1. 針對**新增許可**，選擇**下一步**以接受預設政策。建立角色後，您將新增 Comprehend 的政策。

1. 針對**名稱**，輸入 *HelloWorldWorkflowRole*。

1. 選擇建**立角色**。

 **將政策新增至適用於 Amazon Comprehend 的 **HelloWorldWorkflowRole** ** 

1. 選取並編輯 **HelloWorldWorkflowRole** 角色。

1. 選擇**新增許可**，然後選擇**建立內嵌政策**。

1. 選取**服務的 Comprehend**。

1. 在**讀取**中選擇 **DetectSentiment**，然後選擇**下一步**

1. 對於**政策名稱**，輸入 *DetectSentimentPolicy*，然後**建立政策**。

如果您檢閱政策，您會看到它允許所有資源採取**動作** `"comprehend:DetectSentiment"`。

 **將 IAM 角色連接至 Step Functions 狀態機器** 

1. 返回編輯您的狀態機器，然後選取 **Config** 索引標籤。

1. 從**執行角色**下拉式清單中，選擇 *HelloWorldWorkflowRole*。

1. 儲存您的狀態機器。

### 步驟 4.4 - 執行您的狀態機器
<a name="step-4-run-your-state-machine"></a>

 使用以下 JSON 進行輸入，開始執行您的狀態機器：

```
{
    "hello_world": false,
    "wait": 42,
    "feedback_comment" : "This getting started with Step Functions workshop is a challenge!"
}
```

#### 故障診斷許可錯誤...
<a name="policy-section"></a>

 如果沒有正確的政策，您會收到**許可錯誤**，如下所示：

```
User: arn:aws:sts::account-id:assumed-role/StepFunctions-MyStateMachine-role is not authorized
to perform: comprehend:DetectSentiment because no identity-based policy allows the comprehend:DetectSentiment
action (Service: Comprehend, Status Code: 400, Request ID: a1b2c3d4-5678-90ab-cdef-EXAMPLE11111)
```

 先前的錯誤訊息是告知您的狀態機器未獲授權使用外部服務。返回步驟，並確定您已設定身分政策。

 **練習您學到的內容！**

 在深入探討更複雜的工作流程之前，請練習您透過下列任務學到的內容：
+  檢閱 **DetectSentiment** 步驟。查看各種檢視中的輸入/輸出，以查看情緒偵測的結果。
+ 在資料表檢視中尋找 DetectSentiment 狀態的**持續時間**。
+ 變更 **JSON 輸入**中的註解，然後重新執行您的狀態機器。

若要進一步了解情緒分析結果，請參閱 [Amazon Comprehend - 情緒](https://docs.aws.amazon.com/comprehend/latest/dg/how-sentiment.html)。

 考慮請求回應整合的一種方法是回應通常僅代表對請求的*認可*。不過，在某些整合中，例如情緒分析，確認實際上代表任務的*完成*。

 關鍵學習是 `Task` 狀態不會**在請求回應整合中等待**基礎任務。若要等待回應，您需要探索*執行任務 (.sync)* 服務整合模式。

**恭喜您！**  
 您已建立第一個狀態機器，並使用**請求回應**模式整合情緒分析任務。

**我們重視您的意見回饋！**  
如果您發現此入門教學課程很有幫助，或者您有改善教學課程的建議，請使用此頁面上的意見回饋選項讓我們知道。

## 清除資源
<a name="clean-up-resources"></a>

 採取下列步驟來清除您建立的資源：

1. 導覽至 AWS主控台中的 [Step Functions](https://console.aws.amazon.com/states/home) 頁面。

1. 從左側的導覽窗格中選取**狀態機器**。

1. 選擇 **MyFirstStateMachine** 

1. 刪除 IAM 角色

   1 - 依照 **IAM 角色**的連結前往新標籤中的 IAM 角色頁面。刪除自訂相關角色。

   2 - 在 IAM 角色中，搜尋包含 *MyFirstStateMachine* 的自動產生角色。刪除自動產生的角色。

1. 返回 Step Functions 主控台索引標籤，然後選取**動作**下拉式清單，然後選取**刪除**以刪除狀態機器。

您的狀態機器和相關角色現在應該已成功刪除。