選取您的 Cookie 偏好設定

我們使用提供自身網站和服務所需的基本 Cookie 和類似工具。我們使用效能 Cookie 收集匿名統計資料,以便了解客戶如何使用我們的網站並進行改進。基本 Cookie 無法停用,但可以按一下「自訂」或「拒絕」以拒絕效能 Cookie。

如果您同意,AWS 與經核准的第三方也會使用 Cookie 提供實用的網站功能、記住您的偏好設定,並顯示相關內容,包括相關廣告。若要接受或拒絕所有非必要 Cookie,請按一下「接受」或「拒絕」。若要進行更詳細的選擇,請按一下「自訂」。

Step Functions 的最佳實務

焦點模式
Step Functions 的最佳實務 - AWS Step Functions

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

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

管理狀態和轉換資料

Step Functions 最近新增了變數,並JSONata管理狀態和轉換資料。

了解如何使用變數傳遞資料,以及使用 轉換資料JSONata

下列主題是最佳實務,可協助您管理和最佳化 Step Functions 工作流程。

使用 Express Workflows 最佳化成本

Step Functions 會根據您用來建置狀態機器的工作流程類型,決定標準和快速工作流程的定價。若要最佳化無伺服器工作流程的成本,您可以遵循下列任一或兩項建議:

如需選擇標準或快速工作流程類型如何影響帳單的資訊,請參閱AWS Step Functions 定價

標準工作流程中的 Nest Express 工作流程

Step Functions 會執行具有有限持續時間和步驟數量的工作流程。有些工作流程可能會在短時間內完成執行。其他可能需要長時間執行和 high-event-rate工作流程的組合。透過 Step Functions,您可以從多個更小、更簡單的工作流程中建置大型、複雜的工作流程。

例如,若要建置訂單處理工作流程,您可以將所有非等冪動作納入標準工作流程。這可能包括動作,例如透過人工互動核准訂單和處理付款。然後,您可以在 Express 工作流程中結合一系列等冪動作,例如傳送付款通知和更新產品庫存。您可以在標準工作流程中將此 Express 工作流程巢狀化。在此範例中,標準工作流程稱為父系狀態機器。巢狀 Express 工作流程稱為子狀態機器

將標準工作流程轉換為 Express 工作流程

如果現有標準工作流程符合下列需求,您可以將它們轉換為快速工作流程:

  • 工作流程必須在五分鐘內完成其執行。

  • 工作流程符合at-least-once執行模型。這表示工作流程中的每個步驟可能會執行超過一次。

  • 工作流程不使用 .waitForTaskToken.sync或服務整合模式。

重要

Express 工作流程使用 Amazon CloudWatch Logs 記錄執行歷史記錄。使用 CloudWatch 日誌時,您將產生額外費用。

使用主控台將標準工作流程轉換為快速工作流程
  1. 開啟 Step Functions 主控台

  2. 狀態機器頁面上,選擇要開啟的標準類型狀態機器。

    提示

    任何類型下拉式清單中,選擇標準以篩選狀態機器清單,並僅檢視標準工作流程。

  3. 選擇複製到新的

    Workflow Studio 會在設計模式顯示您所選狀態機器的工作流程時開啟。

  4. (選用) 更新工作流程設計。

  5. 為您的狀態機器指定名稱。若要這樣做,請選擇預設狀態機器名稱 旁的編輯圖示MyStateMachine。然後,在狀態機器組態中,在狀態機器名稱方塊中指定名稱。

  6. (選用) 在狀態機器組態中,指定其他工作流程設定,例如狀態機器類型及其執行角色。

    請確定針對 Type,您選擇 Express。在狀態機器設定上保留所有其他預設選項。

    注意

    如果您要轉換先前在 AWS CDK或 中定義的標準工作流程 AWS SAM,則必須變更 TypeResource名稱的值。

  7. 確認角色建立對話方塊中,選擇確認以繼續。

    您也可以選擇檢視角色設定以返回狀態機器組態

    注意

    如果您刪除 Step Functions 建立的角色,Step Functions 稍後無法重新建立該IAM角色。同樣地,如果您修改角色 (例如,從IAM政策中的主體移除 Step Functions),Step Functions 稍後無法還原其原始設定。

如需管理工作流程的成本最佳化時最佳實務和指導方針的詳細資訊,請參閱建置符合成本效益的 AWS Step Functions 工作流程

在 Step Functions 中標記狀態機器和活動

AWS Step Functions 支援標記狀態機器 (標準和快速) 和活動。標籤可協助您追蹤和管理 資源,並在您的 AWS Identity and Access Management (IAM) 政策中提供更好的安全性。標記 Step Functions 資源之後,您可以使用 來管理它們 AWS Resource Groups。若要了解如何操作,請參閱 AWS Resource Groups 使用者指南

對於標籤型授權,如下列範例所示的狀態機器執行資源會繼承與狀態機器相關聯的標籤。

arn:<partition>:states:<Region>:<account-id>:execution:<StateMachineName>:<ExecutionId>

當您呼叫 DescribeExecution 或APIs指定執行資源 的其他 時ARN,Step Functions 會使用與狀態機器相關聯的標籤,在執行標籤型授權時接受或拒絕請求。這可協助您允許或拒絕存取狀態機器層級的狀態機器執行。

若要查看資源標記的相關限制,請參閱 與標記相關的限制

進行標記以分配成本

您可以使用成本分配標籤來識別狀態機器的目的,並在 AWS 帳單中反映該組織。註冊以取得 AWS 您的帳戶帳單,以包含標籤索引鍵和值。如需設定報告的詳細資訊,請參閱 使用者指南中的設定每月成本分配報告。 AWS Billing

例如,您可以新增代表您的成本中心和 Step Functions 資源用途的標籤,如下所示。

資源 金鑰
StateMachine1 Cost Center 34567
Application Image processing
StateMachine2 Cost Center 34567
Application Rekognition processing

針對安全進行標記

IAM 支援以標籤控制資源的存取。若要根據標籤控制存取,請在 IAM 政策的條件 (condition) 元素中,提供您資源標籤的資訊。

例如,您可以限制對所有 Step Functions 資源的存取,其中包含具有 金鑰environment和 值 的標籤production

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": [ "states:TagResource", "states:DeleteActivity", "states:DeleteStateMachine", "states:StopExecution" ], "Resource": "*", "Condition": { "StringEquals": {"aws:ResourceTag/environment": "production"} } } ] }

如需詳細資訊,請參閱IAM《 使用者指南》中的使用標籤控制存取

在 Step Functions 主控台中管理標籤

您可以在 Step Functions 主控台中檢視和管理狀態機器的標籤。從狀態機器的 Details (詳細資訊) 頁面,選擇 Tags (標籤)

使用 Step Functions API動作管理標籤

若要使用 Step Functions 管理標籤API,請使用下列API動作:

使用逾時以避免停滯的 Step Functions 工作流程執行

根據預設,Amazon States Language 不會為狀態機器定義指定逾時。如果沒有明確的逾時,Step Functions 通常僅依賴活動工作者的回應,以得知任務已完成。如果發生錯誤,且 TimeoutSeconds 欄位未指定 ActivityTask 狀態,則執行會卡在等待永遠不會出現的回應。

若要避免這種情況,請在 狀態機器Task中建立 時指定合理的逾時。例如:

"ActivityState": { "Type": "Task", "Resource": "arn:aws:states:us-east-1:123456789012:activity:HelloWorld", "TimeoutSeconds": 300, "Next": "NextState" }

如果您搭配任務字符 (.waitForTaskToken) 使用回呼,建議您使用活動訊號,並在Task狀態定義中新增 HeartbeatSeconds 欄位。您可以將 HeartbeatSeconds 設定為小於任務逾時,因此,如果您的工作流程失敗並出現活動訊號錯誤,則您知道這是由於任務失敗,而不是任務需要很長時間才能完成。

{ "StartAt": "Push to SQS", "States": { "Push to SQS": { "Type": "Task", "Resource": "arn:aws:states:::sqs:sendMessage.waitForTaskToken", "HeartbeatSeconds": 600, "Parameters": { "MessageBody": { "myTaskToken.$": "$$.Task.Token" }, "QueueUrl": "https://sqs.us-east-1.amazonaws.com/123456789012/push-based-queue" }, "ResultPath": "$.SQS", "End": true } } }

如需詳細資訊,請參閱任務工作流程狀態《Amazon States 語言文件中的 。

注意

您可以使用 Amazon States 語言定義中的 TimeoutSeconds 欄位,為您的狀態機器設定逾時。如需詳細資訊,請參閱Step Functions 工作流程的 Amazon States 語言狀態機器結構

在 Step Functions 中使用 Amazon S3 ARNs而非傳遞大型承載

在狀態之間傳遞大型資料承載的執行作業可能會被終止。如果您要在狀態之間傳遞的資料可能超過 256 KiB,請使用 Amazon Simple Storage Service (Amazon S3) 來存放資料,並在 Payload 參數中剖析儲存貯體的 Amazon Resource Name (ARN),以取得儲存貯體名稱和金鑰值。或者,調整您的實作,以便在您的執行作業中傳遞較小的承載。

在下列範例中,狀態機器會將輸入傳遞至 AWS Lambda 函數,該函數會處理 Amazon S3 儲存貯體中的JSON檔案。執行此狀態機器後,Lambda 函數會讀取JSON檔案的內容,並將檔案內容傳回為輸出。

建立 Lambda 函式

下列名為 的 Lambda 函數會pass-large-payload讀取存放在特定 Amazon S3 儲存貯體中的JSON檔案內容。

注意

建立此 Lambda 函數之後,請確定您為其IAM角色提供適當的許可,以便從 Amazon S3 儲存貯體讀取。例如,將 AmazonS3ReadOnlyAccess 許可連接到 Lambda 函數的角色。

import json import boto3 import io import os s3 = boto3.client('s3') def lambda_handler(event, context): event = event['Input'] final_json = str() s3 = boto3.resource('s3') bucket = event['bucket'].split(':')[-1] filename = event['key'] directory = "/tmp/{}".format(filename) s3.Bucket(bucket).download_file(filename, directory) with open(directory, "r") as jsonfile: final_json = json.load(jsonfile) os.popen("rm -rf /tmp") return final_json
建立狀態機器

下列狀態機器會叫用您先前建立的 Lambda 函數。

{ "StartAt":"Invoke Lambda function", "States":{ "Invoke Lambda function":{ "Type":"Task", "Resource":"arn:aws:states:::lambda:invoke", "Parameters":{ "FunctionName":"arn:aws:lambda:us-east-2:123456789012:function:pass-large-payload", "Payload":{ "Input.$":"$" } }, "OutputPath": "$.Payload", "End":true } } }

您可以將該資料儲存在 Amazon S3 儲存貯體中,並在 Payload 參數中傳遞儲存貯體的 Amazon Resource Name (ARN),而不是在輸入中傳遞大量資料,以取得儲存貯體名稱和索引鍵值。然後,您的 Lambda ARN 函數可以使用該函數直接存取資料。以下是狀態機器執行的範例輸入,其中資料存放在名為 的 Amazon S3 儲存貯data.json體中amzn-s3-demo-large-payload-json

{ "key": "data.json", "bucket": "arn:aws:s3:::amzn-s3-demo-large-payload-json" }

開始新的執行,以避免達到 Step Functions 中的歷史記錄配額

AWS Step Functions 執行事件歷史記錄中有 25,000 個項目的硬配額。當執行達到 24,999 個事件時,它會等待下一個事件發生。

  • 如果事件編號 25,000 為 ExecutionSucceeded,則執行會成功完成。

  • 如果事件編號 25,000 不是 ExecutionSucceeded,則會記錄ExecutionFailed事件,且狀態機器執行會因為達到歷史記錄限制而失敗

若要避免長時間執行達到此配額,您可以嘗試下列其中一個解決方法:

處理暫時性 Lambda 服務例外狀況

AWS Lambda 偶爾會發生暫時性服務錯誤。在此情況下,叫用 Lambda 會導致 500 錯誤,例如 ClientExecutionTimeoutExceptionAWSLambdaExceptionServiceExceptionSdkClientException。最佳實務是主動處理 狀態機器中的這些例外狀況,以Retry叫用 Lambda 函數或 Catch錯誤。

Lambda 錯誤報告為 Lambda.ErrorName。若要重試 Lambda 服務例外狀況錯誤,您可以使用下列Retry程式碼。

"Retry": [ { "ErrorEquals": [ "Lambda.ClientExecutionTimeoutException", "Lambda.ServiceException", "Lambda.AWSLambdaException", "Lambda.SdkClientException"], "IntervalSeconds": 2, "MaxAttempts": 6, "BackoffRate": 2 } ]
注意

Lambda 中未處理的錯誤會在錯誤輸出Lambda.Unknown中報告為 。這些包括 out-of-memory錯誤和函數逾時。您可以在 Lambda.UnknownStates.ALL或 上比對 States.TaskFailed,以處理這些錯誤。當 Lambda 達到呼叫數量上限時,錯誤為 Lambda.TooManyRequestsException。如需 Lambda HandledUnhandled錯誤的詳細資訊,請參閱《 AWS Lambda 開發人員指南FunctionError》中的 。

如需詳細資訊,請參閱下列內容:

避免輪詢活動任務時的延遲

GetActivityTask API 旨在提供taskToken精確一次。如果 taskToken 在與活動工作者通訊時遺失,可以封鎖數個 GetActivityTask 請求 60 秒來等待回應,直到 GetActivityTask 逾時為止。

如果您只有少量輪詢在等待回應,則所有請求可能都會排在封鎖的請求後面並且停止。不過,如果您有大量每個活動 Amazon Resource Name (ARN) 的未處理輪詢,而且有些百分比的請求停滯等待中,則還有更多人仍然可以取得 taskToken 並開始處理工作。

對於生產系統,我們建議ARN每個時間點的每個活動 至少 100 個開放輪詢。如果有一個輪詢遭到封鎖,而且有一部分的輪詢排在其後面,則有更多請求仍會收到 GetActivityTask 以在 taskToken 請求遭到封鎖時處理工作。

若要在輪詢任務時避免這幾種延遲問題:

  • 在您的活動工作者實作中,以個別的執行緒實作您的輪詢器。

  • 每個時間點的每個活動至少有 100 ARN 個開啟的輪詢。

    注意

    擴展到每個 100 個開放輪詢ARN可能很昂貴。例如,每個 100 個 Lambda 函數輪詢的成本ARN是具有具有 100 個輪詢執行緒的單一 Lambda 函數的 100 倍。若要降低延遲將成本降至最低,請使用具有非同步 I/O 的語言,然後針對每個工作人員實作多個輪詢執行緒。如需輪詢器執行緒與工作執行緒不同的範例活動工作者,請參閱 範例:Ruby 中的活動工作者

如需活動和活動工作者的詳細資訊,請參閱 瞭解 Step Functions 中的活動

CloudWatch 記錄資源政策大小限制

當您使用記錄建立狀態機器,或更新現有狀態機器以啟用記錄時,Step Functions 必須使用您指定的日誌群組來更新您的 CloudWatch 日誌資源政策。 CloudWatch 日誌資源政策限制為 5,120 個字元。

當 CloudWatch Logs 偵測到政策接近大小限制時, CloudWatch Logs 會自動為開頭為 的日誌群組啟用記錄/aws/vendedlogs/

您可以使用 為 CloudWatch Logs 日誌群組名稱加上字首/aws/vendedlogs/,以避免 CloudWatch Logs 資源政策大小限制。如果您在 Step Functions 主控台中建立日誌群組,則建議的日誌群組名稱會加上 的字首/aws/vendedlogs/states

CloudWatch 日誌也具有每個 帳戶每個區域 10 個資源政策的配額。如果您嘗試在已為 帳戶在區域中擁有 10 CloudWatch Logs 資源政策的狀態機器上啟用記錄,將不會建立或更新狀態機器。如需記錄引號的詳細資訊,請參閱CloudWatch 記錄引號

如果您無法將日誌傳送至 CloudWatch 日誌,請參閱 Troubleshooting state machine logging to CloudWatch Logs。若要進一步了解一般記錄,請參閱從 AWS 服務啟用記錄

下一個主題:

Service Quotas

上一個主題:

故障診斷
隱私權網站條款Cookie 偏好設定
© 2025, Amazon Web Services, Inc.或其附屬公司。保留所有權利。