View a markdown version of this page

對 Step Functions 中的問題進行故障診斷 - AWS Step Functions

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

對 Step Functions 中的問題進行故障診斷

如果您在使用 Step Functions 時遇到困難,請使用下列疑難排解資源。

下列主題提供與 Step Functions 狀態機器、服務整合、活動和工作流程相關的錯誤和問題的疑難排解建議。如果您發現未列在此處的問題,您可以使用此頁面上的 Feedback (意見回饋) 按鈕來報告。

如需更多故障診段建議和常見支援問題的解答,請瀏覽 AWS 知識中心

一般性問題的故障診斷

我無法建立狀態機器。

與狀態機器相關聯的 IAM 角色可能沒有足夠的許可。檢查 IAM 角色的許可,包括 AWS 服務整合任務、X-Ray 和 CloudWatch 記錄。.sync 任務狀態需要其他許可。

我無法使用 JsonPath 來參考先前任務的輸出。

對於 JsonPath,JSON 金鑰必須以 結尾.$。這表示 JsonPath 只能用於鍵值對。如果您想要使用 JsonPath 其他位置,例如 陣列,您可以使用內部函數。例如,您可以使用類似下列內容:

任務 A 輸出:

{ "sample": "test" }

任務 B:

{ "JsonPathSample.$": "$.sample" }

狀態轉換發生延遲。

對於標準工作流程,狀態轉換的數量有限制。當您超過狀態轉換限制時,Step Functions 會延遲狀態轉換,直到配額的儲存貯體填滿為止。您可以透過檢閱 CloudWatch ExecutionThrottled 指標頁面 執行指標區段中的 指標來監控狀態轉換限制限流。

當我啟動新的標準工作流程執行時,它們會失敗並顯示ExecutionLimitExceeded錯誤。

Step Functions 對每個 AWS 帳戶 中的每個 都有 1,000,000 個開放執行的限制 AWS 區域。如果您超過此限制,Step Functions 會擲回ExecutionLimitExceeded錯誤。此限制不適用於快速工作流程。您可以使用 OpenExecutionCount來追蹤何時接近 ,OpenExecutionLimit並建立警示,在該事件中主動通知您。 OpenExecutionCount是開啟的工作流程的大致數量。如需詳細資訊,請參閱執行指標

處於平行狀態的一個分支上的失敗會導致整個執行失敗。

這是預期的行為。為了避免在使用平行狀態時遇到失敗,請設定 Step Functions 以擷取從每個分支擲出的錯誤

對服務整合進行故障診斷

我的任務已在下游服務中完成,但在 Step Functions 中,任務狀態會保持「進行中」或延遲完成。

對於.sync服務整合模式,Step Functions 使用 EventBridge 規則、下游 APIs 或兩者的組合來偵測下游任務狀態。對於某些服務,Step Functions 不會建立要監控的 EventBridge 規則。例如,對於 AWS Glue 服務整合, Step Functions 會glue:GetJobRun呼叫 ,而不是使用 EventBridge 規則。由於 API 呼叫的頻率,下游任務完成與 Step Functions 任務完成時間之間存在差異。Step Functions 需要 IAM 許可來管理 EventBridge 規則和呼叫下游服務。如需執行角色的許可不足如何影響任務完成的詳細資訊,請參閱 使用 .sync 的任務的其他許可

我想要從巢狀狀態機器執行傳回 JSON 輸出。

Step Functions 有兩個 Step Functions 同步服務整合: startExecution.syncstartExecution.sync:2。兩者都等待巢狀狀態機器完成,但會傳回不同的Output格式。您可以使用 startExecution.sync:2 在 下傳回 JSON 輸出Output

我無法從另一個帳戶叫用 Lambda 函數。

使用跨帳戶支援存取 Lambda 函數

如果您的區域可以使用跨帳戶存取 AWS 資源,請使用下列方法從另一個帳戶叫用 Lambda 函數。

若要在工作流程中叫用跨帳戶資源,請執行下列動作:

  1. 在包含 資源的目標帳戶中建立 IAM 角色。此角色會授予來源帳戶存取目標帳戶資源的許可,其中包含狀態機器。

  2. Task狀態的定義中,指定要由狀態機器擔任的目標 IAM 角色,然後再叫用跨帳戶資源。

  3. 修改目標 IAM 角色中的信任政策,以允許來源帳戶暫時擔任此角色。信任政策必須包含來源帳戶中定義之狀態機器的 Amazon Resource Name (ARN)。此外,在目標 IAM 角色中定義適當的許可來呼叫 AWS 資源。

  4. 更新來源帳戶的執行角色,以包含擔任目標 IAM 角色所需的許可。

如需範例,請參閱教學在 Step Functions 中存取跨帳戶 AWS 資源課程中的 。

注意

您可以將狀態機器設定為擔任 IAM 角色,以從多個 存取資源 AWS 帳戶。不過,狀態機器在特定時間只能擔任一個 IAM 角色。

如需指定跨帳戶資源Task的狀態定義範例,請參閱 任務狀態的登入資料欄位範例

在沒有跨帳戶支援的情況下存取 Lambda 函數

如果您的區域無法使用跨帳戶存取 AWS 資源,請使用下列方法從另一個帳戶叫用 Lambda 函數。

Task狀態的 Resource欄位中,使用 arn:aws:states:::lambda:invoke並在參數FunctionArn中傳遞 。與狀態機器相關聯的 IAM 角色必須具有適當的許可,才能叫用跨帳戶 Lambda 函數:lambda:invokeFunction

{ "StartAt":"CallLambda", "States":{ "CallLambda":{ "Type":"Task", "Resource":"arn:aws:states:::lambda:invoke", "Parameters":{ "FunctionName":"arn:aws:lambda:region:account-id:function:my-function" }, "End":true } } }

我看不到從.waitForTaskToken狀態傳遞的任務權杖。

Task狀態的 Parameters欄位中,您必須傳遞任務字符。例如,您可以使用類似下列程式碼的內容。

{ "StartAt":"taskToken", "States":{ "taskToken":{ "Type":"Task", "Resource":"arn:aws:states:::lambda:invoke.waitForTaskToken", "Parameters":{ "FunctionName":"get-model-review-decision", "Payload":{ "token.$":"$$.Task.Token" }, }, "End":true } } }
注意

您可以嘗試.waitForTaskToken搭配任何 API 動作使用 。不過,有些 APIs沒有任何適當的參數。

對活動進行故障診斷

我的狀態機器執行卡在活動狀態。

在您使用 GetActivityTask API 動作輪詢任務字符之前,活動任務狀態不會啟動。最佳實務是新增任務層級逾時,以避免執行停滯。如需詳細資訊,請參閱使用逾時以避免停滯的 Step Functions 工作流程執行

如果您的狀態機器卡在 ActivityScheduled 事件中,表示您的活動工作者機群有問題或規模不足。您應該監控 ActivityScheduleTime CloudWatch 指標,並在該時間增加時設定警示。不過,若要逾時Activity狀態不會轉換為 ActivityStarted 狀態的任何停滯狀態機器執行,請在狀態機器層級定義逾時。若要這樣做,請在TimeoutSeconds欄位外的狀態機器定義開頭指定States欄位。

我的活動工作者在等待任務字符時逾時。

工作者使用 GetActivityTask API 動作,以執行中狀態機器排程執行的指定活動 ARN 擷取任務。 會GetActivityTask啟動長輪詢,因此服務會保持 HTTP 連線開啟,並在任務可用時立即回應。服務在回應之前保留請求的時間上限為 60 秒。如果 60 秒內沒有可用的任務,輪詢會傳回taskToken具有 null 字串的 。若要避免此逾時,請在 AWS SDK 或您用來進行 API 呼叫的用戶端中,設定逾時至少為 65 秒的用戶端端通訊端。

快速工作流程疑難排解

我的應用程式在收到 StartSyncExecution API 呼叫的回應之前逾時。

在您用來進行 API 呼叫的 AWS SDK 或用戶端中設定用戶端通訊端逾時。若要接收回應,逾時的值必須高於快速工作流程執行的持續時間。

我看不到執行歷史記錄,無法對快速工作流程失敗進行故障診斷。

Express Workflows 不會記錄其中的執行歷史記錄 AWS Step Functions。反之,您必須開啟 CloudWatch 記錄。開啟記錄後,您可以使用 CloudWatch Logs Insights 查詢來檢閱您的快速工作流程執行。如果您在執行索引標籤中選擇啟用按鈕,也可以在 Step Functions 主控台上檢視快速工作流程執行的執行歷史記錄。如需詳細資訊,請參閱在 Step Functions 主控台中檢視執行詳細資訊

根據持續時間列出執行:

fields ispresent(execution_arn) as exec_arn | filter exec_arn | filter type in ["ExecutionStarted", "ExecutionSucceeded", "ExecutionFailed", "ExecutionAborted", "ExecutionTimedOut"] | stats latest(type) as status, tomillis(earliest(event_timestamp)) as UTC_starttime, tomillis(latest(event_timestamp)) as UTC_endtime, latest(event_timestamp) - earliest(event_timestamp) as duration_in_ms by execution_arn | sort duration_in_ms desc

若要列出失敗和已取消的執行:

fields ispresent(execution_arn) as isRes | filter type in ["ExecutionFailed", "ExecutionAborted", "ExecutionTimedOut"]

對分散式地圖進行故障診斷

我的地圖執行卡住。

開啟的映射執行數目上限有服務配額。一旦此配額用盡,其他映射執行會等待其他映射執行完成時提供更多配額可用。待處理的映射執行會在MapRunStarted事件中等待,然後再讀取其輸入,因此您會看到映射執行的待處理項目計數保持為 0。一旦待處理的映射執行能夠取得配額,就會開始讀取其輸入。然後,您會看到待處理項目計數增加,而且映射執行會在其生命週期的剩餘時間內繼續正常執行。當配額可用時,在待處理映射執行之間分配的方式並無特定順序。

使用巢狀貼圖執行時會有死結的風險。在這種情況下,您有一個包含「父」映射執行的父工作流程執行,然後啟動一個包含「子」映射執行的子工作流程執行,然後啟動一個孫子工作流程執行。如果在子工作流程執行啟動其子映射執行時,開啟的映射執行配額未達上限,則該子映射執行將予以待處理。如果父映射執行耗用整個配額,且所有子映射執行都已待處理,則群組都無法進行進度,而且它們將保持死鎖狀態,直到配額再次可用為止。當其父執行終止時,映射執行將中止並使其配額再次可用,例如透過逾時、由於未攔截的錯誤而失敗,或由於 StopExecution API 呼叫。

在工作流程設計中考慮使用巢狀映射執行時,請估計您預期的開啟映射執行次數是否超過開啟映射執行配額上限,並讓您面臨延遲或死結的風險。如果是這樣,您可以考慮替代設計。例如,您可以改為使用映射執行中的LOAD_AND_FLATTEN轉換,在單一映射執行中ReaderConfig執行這兩個操作,而不是使用父映射執行來逐一查看 Amazon S3 物件清單和子映射執行來讀取其內容。另一個常見的模式是包含預先處理步驟,例如 Lambda 函數,它會反覆運算巢狀資料,並產生可用作映射執行輸入的檔案。

您可以使用 CloudWatch 中的 ApproximateOpenMapRunCountOpenMapRunLimitApproximateMapRunBacklogSize指標,監控開啟映射執行配額上限的使用量