Step Functions 中的疑難排解問 - AWS Step Functions

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

Step Functions 中的疑難排解問

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

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

如需更多疑難排解建議和常見支援問題的解答,請造訪 AWS 知識中心

一般性問題的故障診斷

我無法創建狀態機。

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

我無法使用 a JsonPath 來引用前一個任務的輸出。

對於 a JsonPath,JSON金鑰必須以結尾.$。這意味著 a 只 JsonPath 能在鍵值對中使用。如果你想使用 JsonPath 其他地方,比如一個數組,你可以使用在函數。例如,您可以使用類似以下內容的內容:

任務 A 輸出:

{ "sample": "test" }

任務 B:

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

狀態轉換有延遲。

對於標準工作流程,狀態轉換的數目有限制。當您超過狀態轉換限制時,Step Functions 會延遲狀態轉換,直到滿足配額的值區為止。您可以複查 執行指標ExecutionThrottled測 CloudWatch 量結果」頁面段落中的測量結果,來監督狀態轉換限制節流。

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

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

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

這是預期的行為。若要避免在使用 parallel 狀態時發生失敗,請設定「Step Functions」以 catch 從每個分支擲回的錯誤

疑難排解服務整

我的工作已在下游服務中完成,但在「Step Functions」中,任務狀態仍為「進行中」或其完成延遲。

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

我想從嵌套狀態機執行返回一個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 資源名稱 (ARN)。此外,請在目標IAM角色中定義適當的權限,以呼叫 AWS 資源。

  4. 更新來源帳戶的執行角色,以包含假設目標IAM角色所需的權限。

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

注意

您可以將狀態機配置為擔任從多個訪問資源的IAM角色 AWS 帳戶。 但是,狀態機在給定時間只能承擔一個IAM角色。

如需指定跨帳號資源的Task狀態定義範例,請參閱作業狀態的證明資料欄位範例

存取 Lambda 函數,而不需要跨帳戶支援

如果跨帳戶訪問 AWS 您的區域中無法使用資源,請使用下列方法從其他帳戶叫用 Lambda 函數。

Task州/省的Resource字段中,使用arn:aws:states:::lambda:invoke並傳遞 FunctionArn in 參數。與狀態機器相關聯的IAM角色必須具有正確的權限,才能叫用跨帳戶 Lambda 函數:lambda:invokeFunction

{ "StartAt":"CallLambda", "States":{ "CallLambda":{ "Type":"Task", "Resource":"arn:aws:states:::lambda:invoke", "Parameters":{ "FunctionName":"arn:aws:lambda:us-west-2:123456789012: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沒有任何合適的參數。

疑難排解活

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

除非您使用動作輪詢任務 Token,否則活動任務狀態不會啟GetActivityTaskAPI動。最佳作法是新增工作層級逾時,以避免卡住的執行。如需詳細資訊,請參閱使用逾時來避免卡住的 Step Functions 工作流程執行

如果您的狀態機卡在ActivityScheduled事件中,則表示您的活動工作者叢集有問題或規模不足。您應該監視指ActivityScheduleTime CloudWatch 標並在該時間增加時設置警報。但是,若要逾時狀態未轉換為狀態的任何卡住Activity狀態機器執行,請在ActivityStarted狀態機器層級定義逾時。若要執行此操作,請在狀態機定義的開頭指定TimeoutSeconds欄位,在States欄位之外。

我的活動工作者在等待任務令牌時超時。

Worker 會使用ARN此GetActivityTaskAPI動作來擷取具有排定由執行中狀態機器執行之指定活動的任務。 GetActivityTask啟動長輪詢,所以服務保持HTTP連接打開,並在任務變為可用時立即響應。服務在回應之前保留要求的時間上限為 60 秒。如果 60 秒內沒有任務可用,則輪詢返回一taskToken個空字符串。為了避免此超時,請配置客戶端套接字,其超時至少為 65 秒 AWS SDK或者在您用來撥API打電話的客戶端中。

排解快速工作流

我的應用程序在收到來自StartSyncExecutionAPI呼叫的響應之前超時。

配置客戶端通訊端超時 AWS SDK或您用來撥打API電話的客戶端。若要接收回應,逾時值必須高於「快速工作流程」執行的持續時間。

我無法看到執行歷程記錄,以便疑難排解 Express 工作流程失敗。

Express 工作流程不會在中記錄執行歷史記錄 AWS Step Functions。 相反地,您必須開啟 CloudWatch 記錄功能。開啟記錄之後,您可以使用 CloudWatch 日誌深入解析查詢來檢閱 Express 工作流程執行。如果您選擇「執行」標籤中的「啟用」按鈕,也可以在「Step Functions」主控台上檢視 Express Workflow 執行的執行歷史記錄。如需詳細資訊,請參閱在 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 desc

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

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