本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
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.sync
和startExecution.sync:2
。兩者都等待嵌套狀態機完成,但它們返回不同的Output
格式。您可以使startExecution.sync:2
用返回下的JSON輸出Output
。
我無法從另一個帳戶叫用 Lambda 函數。
透過跨帳戶支援存取 Lambda 函數
如果跨帳戶訪問 AWS 資源可在您的區域中使用,請使用以下方法從另一個帳戶調用 Lambda 函數。
若要在工作流程中叫用跨帳號資源,請執行下列動作:
在包含資源的目標帳號中建立IAM角色。此角色會授與包含狀態機器的來源帳戶存取目標帳戶資源的權限。
在
Task
狀態的定義中,指定狀態機器在呼叫跨帳號資源之前要採用的目標IAM角色。修改目標IAM角色中的信任原則,以允許來源帳戶暫時擔任此角色。信任政策必須包含來源帳戶中定義之狀態機器的 Amazon 資源名稱 (ARN)。此外,請在目標IAM角色中定義適當的權限,以呼叫 AWS 資源。
更新來源帳戶的執行角色,以包含假設目標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打電話的客戶端中。
排解快速工作流
我的應用程序在收到來自StartSyncExecution
API呼叫的響應之前超時。
配置客戶端通訊端超時 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"]