本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
了解如何開始使用 Step Functions
使用 Step Functions 服務,您可以協調複雜的應用程式工作流程。若要開始使用,您將使用 Workflow Studio 建立和執行內建 Hello World 工作流程。您將在程式碼中檢閱自動產生的 Amazon States Language(ASL) 定義。最後,您將 drag-and-drop進行服務整合以進行情緒分析。
完成本教學課程後,您將了解如何使用 Workflow Studio 建立、設定、執行和更新工作流程,同時使用設計和程式碼模式。
預估持續時間:20-30 分鐘
您將建置的內容
您的第一個狀態機器將以流程狀態開始。流程狀態用於引導和控制您的工作流程。了解如何執行工作流程之後,您將新增 動作,以整合 Amazon Comprehend 服務與任務狀態。
下圖顯示您將建置之完整狀態機器的視覺效果。當您第一次建立 Hello World 狀態機器時,不需要執行其他資源。Step Functions 主控台會在按一下後建立所有狀態和IAM角色。稍後,當您新增服務整合時,您將需要使用自訂許可政策建立角色。
步驟 1 - 建立您的狀態機器
在步驟函數中,工作流程稱為狀態機器。我們將交替使用這兩個術語。您的工作流程將包含採取動作或控制狀態機器流程的狀態。
-
前往 Step Functions 主控台。
-
在 Step Functions 主控台中,從左上角導覽中選擇「Step Functions」,或選擇導覽列,然後選擇開始使用:
-
從選項中,選擇執行 Hello World:
提示
我們建議您逐步完成簡短的主控台內演練,以熟悉 UI。
Workflow Studio 概觀
透過 Workflow Studio for Step Functions,您可以在畫布上以視覺化 drag-and-drop方式狀態來建置工作流程。
您可以新增和編輯狀態、設定步驟、轉換結果,以及設定錯誤處理。下列螢幕擷取畫面顯示您將用來建置狀態機器的介面的四個重要區域。
模式 - Workflow Studio 提供三種操作模式,預設為視覺化設計模式。
-
設計 - 視覺化編輯模式,您可以在 drag-and-drop其中在工作流程中陳述 。
-
程式碼 - 專注於 Amazon States 語言程式碼的模式,也稱為ASL程式碼。您可以直接編輯ASL程式碼,並查看視覺效果設計中反映的變更。
-
Config - 組態選項,包括狀態機器的名稱和類型 (標準或快速)、工作流程執行、記錄、追蹤、版本控制、加密和標籤時指派的角色。
狀態瀏覽器包含下列三個索引標籤:
-
動作 - 您可以在 drag-and-drop工作流程中使用的 AWS APIs清單。每個動作代表任務工作流程狀態。
-
流程 - 流程狀態,以控制工作流程中的步驟順序。
-
模式 - ready-to-use可重複使用的建置區塊,例如反覆處理 Amazon S3 儲存貯體中的資料。
Canvas 和工作流程圖表是您在工作流程圖表上陳述的位置 drag-and-drop、變更狀態順序,以及選取要設定和測試的狀態。
Inspector 面板可讓您檢視和編輯畫布上所選任何狀態的屬性。您可以開啟定義切換以顯示目前選取狀態的程式碼。
狀態機器概觀
Hello World 工作流程從傳遞狀態開始,此狀態會將其輸入傳遞至其輸出,而不執行工作。傳遞狀態可用來產生靜態JSON輸出或轉換JSON輸入,然後再將資料傳遞至下一個狀態。建構和偵錯狀態機器時,傳遞狀態非常有用。
下一個狀態,選擇狀態,使用 中的資料IsHelloWorldExample
來選擇工作流程的下一個分支。如果第一個規則相符,工作流程會暫停為等待狀態,然後以平行狀態執行兩個任務,然後繼續前往檢查點並成功結束工作流程。當沒有相符項目時,工作流程會預設為失敗狀態,然後再停止狀態機器。
當您想要在執行更多工作之前延遲時,等待狀態會很有用。也許您的工作流程會在訂單項目後等待 30 秒,因此您的客戶有時間注意到並修正不正確的運送地址。
平行狀態可以在您的資料上執行多個程序。也許工作流程會同時列印訂單票證、更新庫存,以及增加每日銷售報告。
檢視工作流程程式碼 (ASL)
您的第一個狀態機器實際上相當詳細,因此請檢閱程式碼以進一步探索。
狀態機器是使用 Amazon States Language (ASL)
檢視整個狀態機器定義
-
選擇 { } Code 按鈕以檢視ASL程式碼。
-
檢視左側的程式碼,並與右側的狀態機器圖形進行比較。
-
在畫布上選取要檢閱的某些狀態。例如,選擇選擇狀態。
您是否注意到在程式碼檢視中如何反白顯示狀態的定義?
在 Inspector 中檢視程式碼
-
切換回設計模式。
-
展開右側的 Inspector 面板。
-
從 Canvas 上的工作流程圖表中選取選擇狀態。
-
在檢查器面板中,選擇定義切換。
請嘗試選擇其他狀態。了解您所選取之每個狀態的ASL程式碼如何捲動至檢視並反白顯示?
(實際上) 建立狀態機器
警告:立即命名您的狀態機器!
您無法在建立狀態機器之後將其重新命名。在儲存狀態機器之前,請選擇名稱。
到目前為止,您一直在處理狀態機器的草稿。尚未建立資源。
重新命名和建立您的狀態機器
-
選擇組態模式。
-
針對狀態機器名稱,輸入
MyFirstStateMachine
-
如需許可,請接受預設值以建立新的角色。
-
選擇建立按鈕,以實際建立您的狀態機器。
您應該會看到狀態機器和新IAM角色已建立的通知。
系統會自動顯示啟動狀態機器的選項。您將在下一個步驟中執行此操作!
工作流程建立完成!
Step Functions 已建立您的工作流程和IAM角色。現在,您已準備好啟動狀態機器。
步驟 2 - 啟動您的狀態機器
建立狀態機器之後,您可以啟動執行中的工作流程。
工作流程可選擇採用可在 狀態使用的輸入、傳送至整合服務,以及傳遞至下一個狀態。
Hello World 狀態機器是獨立的,不需要輸入。
啟動狀態機器
-
輸入
hello001
以取得執行的名稱。 -
將輸入欄位保留空白。
-
選擇開始執行按鈕。
檢閱執行詳細資訊
開始之後,您應該會立即看到前兩個狀態成功。
稍候片刻,其餘狀態轉換就會執行以完成工作流程。
您是否想知道選擇狀態 (是 Hello World 範例?) 如何決定分支到等待 X 秒狀態?
-
提示:狀態機器的第一個步驟包含分支決策所需的資料
-
在圖形檢視中,您可以在執行期間監控進度,並探索每個狀態的詳細資訊。
-
選取第一個通過狀態 (命名為設定變數和狀態輸出),然後檢閱輸入/輸出標籤。
您應該會看到狀態輸入為空白,但狀態輸出包含將 值JSON設定為 IsHelloWorldExample
的 true
。
從圖形檢視切換到資料表檢視,以查看依名稱、類型和狀態列出的狀態清單。
提示
請記下先前螢幕擷取畫面中的持續時間和時間軸欄位。一目了然,您可以看到哪些狀態需要比其他狀態更長的時間。
在此執行詳細資訊頁面上還有兩個檢視可供探索:事件檢視和狀態檢視。
事件檢視是從狀態到狀態流程的詳細精細檢視。
展開事件檢視表中的第一個 PassStateEntered和 PassStateExited事件,以查看狀態如何不需要輸入、指派稱為零CheckpointCount
值的變數,以及產生您先前看到的輸出。
最後,您有類似於資料表檢視的狀態檢視。 在狀態檢視表中,您可以選擇性地展開狀態,只查看每個狀態的輸入和輸出:
恭喜您!您已執行第一個 Step Functions 狀態機器!
使用傳遞狀態將靜態資料新增至工作流程是一種常見的模式,特別是用於故障診斷。
在下一個步驟中,您將更新工作流程,以便動態設定狀態機器輸入。
步驟 3 - 處理外部輸入
將 的值IsHelloWorldExample
設定為工作流程內的常數值並不實際。您應該預期狀態機器會回應不同的輸入資料。
在此步驟中,我們將示範如何使用外部JSON資料做為工作流程的輸入:
移除硬式編碼輸入
首先,取代第一個通過狀態的輸出中的硬式編碼值。
-
選取頁面右上角的編輯狀態機器按鈕,以編輯您的 Hello World 狀態機器。
-
選取開始後的第一個通過狀態 (命名為設定變數和狀態輸出),然後選取輸出索引標籤。
-
將輸出取代為下列 JSON:
{ "IsHelloWorldExample": "{% $states.input.hello_world %}", "ExecutionWaitTimeInSeconds": "{% $states.input.wait %}" }
-
儲存狀態機器。
更新的狀態輸出將使用JSONata表達式從預留 $states 變數提取輸入資料。這些值將傳遞至下一個狀態做為輸出,以成為下一個狀態的輸入。
使用輸入資料執行更新的工作流程
接著,執行工作流程,並提供外部輸入資料做為 JSON。
-
選擇執行按鈕來執行工作流程。
-
對於名稱,請使用隨機產生的 ID。
-
針對輸入欄位使用下列JSON內容:
{ "wait" : 20, "hello_world": true }
-
選擇開始執行按鈕。
您的狀態機器執行應該等待較長的時間 (20 秒),但最終應該使用您提供的輸入成功。
在圖形檢視中,檢閱第一個通過狀態的輸入/輸出。請注意,您提供的輸入如何轉換為輸出。此外,請查看執行詳細資訊頁面頂端的執行輸入和輸出。這兩個位置都會顯示您用來啟動執行的輸入。
提示
如果您在 hello_world 設定為 false 的情況下執行新的執行,您預期會發生什麼情況? 試試看!
檢閱工作流程執行
現在您已經執行工作流程幾次,請檢閱執行詳細資訊以檢閱工作流程的執行。
檢閱執行詳細資訊
-
從導覽導覽列或左側選單中選擇狀態機器。
-
選擇您的狀態機器。
在執行索引標籤中,您應該會看到執行的清單,類似下列螢幕擷取畫面:
最後備註:工作流程執行名稱必須是唯一的,且不能重複使用。雖然我們在本教學課程中建議簡短名稱 (hello001
),但我們建議您使用 命名慣例,該慣例將永遠對您的生產工作負載是唯一的。
提示
恭喜您!您已修改工作流程,以處理外部輸入,這些輸入會在每次執行工作流程時有所不同。
步驟 4 - 整合服務
Step Functions 狀態機器可以使用 AWS SDK integrations 呼叫超過 220 個 AWS 服務。 AWS services 為您的狀態機器提供超過 10,000 個潛在API動作。
在此步驟中,您將整合 Amazon Comprehend 任務以進行情緒分析,以處理您的狀態機器輸入。
服務整合使用三種服務整合模式之一:
-
請求回應 (預設) - 等待HTTP回應,然後立即繼續下一個狀態。
-
執行任務 (.sync) - 先等待任務完成,再移至下一個步驟。
-
等待回呼 (.waitForTaskToken) - 暫停工作流程,直到外部程序傳回任務字符。
對於您的第一次整合,您將使用請求回應 (預設) 整合模式。
整合如何運作?
任務狀態代表狀態機器執行的單一工作單位。狀態機器中所有工作都是由任務完成。
任務通常會透過將輸入傳遞至其他 服務API的動作來執行工作,然後執行自己的工作。您可以使用多個欄位來指定任務的執行方式,包括:Credentials
、TimeoutSeconds
、Retry
Catch
、 等。您可以在 中進一步了解任務任務工作流程狀態。
若要使用 AWS SDK整合,您可以指定 服務名稱和 API 來呼叫 。有些整合也需要參數。
您可以使用 Amazon States Language 在任務狀態的資源欄位中指定 AWS API動作。您可以選擇性地將服務整合類型新增至服務名稱。
若要指定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
狀態呼叫另一個服務時,預設模式為請求回應。使用請求回應整合模式,Step Functions 會呼叫服務、接收回應,並立即進入下一個狀態。
步驟 4.1 - 新增情緒分析狀態
-
編輯您的MyFirstStateMachine狀態機器。
-
在狀態瀏覽器的動作面板中,搜尋
DetectSentiment
。 -
將 Comprehend DetectSentiment 拖放至選擇狀態的預設分支。
-
選取並刪除失敗狀態。
-
從狀態瀏覽器中的流程索引標籤中,在 之後拖曳成功狀態DetectSentiment。
步驟 4.2 - 設定情緒分析狀態
-
選取 Comprehend 步驟,以在檢查器面板中設定它。
-
選取引數和輸出索引標籤,然後使用下列 取代引數JSON:
{ "LanguageCode": "en", "Text": "{% %}" }
-
將游標放在百分比符號之間:
{% %}
和 類型:$
-
在編輯器中使用自動完成來選擇
states
、然後輸入
.
並選擇context
,然後輸入
.
並選擇Execution
,然後輸入
.
並選擇Input
,最後,輸入 從內容物件
.feedback_comment
擷取初始輸入。
選擇這些自動完成選項後,您應該JSON針對狀態引數擁有下列項目:
{ "LanguageCode": "en", "Text": "{% $states.context.Execution.Input.feedback_comment %}" }
使用編輯器自動完成
透過自動完成編輯器,您可以探索您的選項。
自動完成會列出您的變數、包含內容物件的預留 $states 變數,以及具有其定義的可用函數!
步驟 4.3 - 設定身分政策
您必須先建立角色和政策,以允許狀態機器對外部服務執行API呼叫,然後才能執行工作流程。
為 Step Functions 建立 IAM角色
-
前往新標籤中的IAM主控台,然後選取角色。
-
選擇 Create a new role (建立新角色)。
-
針對信任的實體類型,選擇
AWS Service
。 -
針對使用案例選擇
Step Functions
。 -
針對新增許可,選擇下一步以接受預設政策。建立角色後,您將新增 Comprehend 的政策。
-
針對名稱,輸入
HelloWorldWorkflowRole
。 -
選擇建立角色。
將政策新增至 Amazon Comprehend HelloWorldWorkflowRole的
-
選取並編輯HelloWorldWorkflowRole角色。
-
選擇新增許可,然後選擇建立內嵌政策。
-
選取服務的 Comprehend。
-
在讀取中選擇 DetectSentiment,然後選擇下一步
-
針對政策名稱輸入
DetectSentimentPolicy
,然後建立政策。您應該已將政策建立為 JSON,如下所示:{ "Version": "2012-10-17", "Statement": [ { "Action": [ "comprehend:DetectSentiment" ], "Resource": [ "*" ], "Effect": "Allow" } ] }
將IAM角色連接至 Step Functions 狀態機器
-
返回編輯您的狀態機器,然後選取組態索引標籤。
-
從執行角色下拉式清單中,選擇
HelloWorldWorkflowRole
。 -
儲存您的狀態機器。
步驟 4.4 - 執行您的狀態機器
使用下列JSON輸入項目開始執行您的狀態機器:
{ "hello_world": false, "wait": 42, "feedback_comment" : "This getting started with Step Functions workshop is a challenge!" }
如果沒有正確的政策,您將收到許可錯誤,如下所示:
User: arn:aws:sts::123456789012: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 - 情緒。
考慮請求回應整合的一種方式是回應通常僅代表對請求的認可。不過,在某些整合中,例如情緒分析,確認實際上代表任務的完成。
金鑰學習是 Task
狀態,不會在請求回應整合中等待基礎任務。若要等待回應,您需要探索執行任務 (.sync) 服務整合模式。
恭喜您!
您已建立第一個狀態機器,並使用請求回應模式整合情緒分析任務。
清除資源
採取下列步驟來清除您建立的資源:
-
導覽至 AWS 主控台中的步驟函數
頁面。 -
從左側的導覽窗格中選取狀態機器。
-
選擇 MyFirstStateMachine
-
刪除IAM角色
1 - 依照IAM角色的連結前往新標籤中的IAM角色頁面。刪除自訂相關角色。
2 - 在IAM角色中,搜尋包含 的自動產生角色
MyFirstStateMachine
。刪除自動產生的角色。 -
返回您的 Step Functions 主控台索引標籤,然後選取動作下拉式清單,然後選取刪除以刪除狀態機器。
現在應該成功刪除您的狀態機器和相關角色。