

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

# 對 Step Functions 中的問題進行故障診斷
<a name="troubleshooting"></a>

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

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

如需更多故障診段建議和常見支援問題的解答，請瀏覽 [AWS 知識中心](https://aws.amazon.com/premiumsupport/knowledge-center/#AWS_Lambda)。

**Topics**
+ [一般問題](#troubleshooting-general)
+ [服務整合](#troubleshooting-service-integrations)
+ [活動](#troubleshooting-activities)
+ [快速工作流程](#troubleshooting-express-workflows)

## 一般性問題的故障診斷
<a name="troubleshooting-general"></a>

### 我無法建立狀態機器。
<a name="troubleshooting-general-unable-to-create"></a>

與狀態機器相關聯的 IAM 角色可能沒有足夠的[許可](auth-and-access-control-sfn.md#auth-and-access-control-sfn.title)。檢查 IAM 角色的許可，包括 AWS 服務整合任務、X-Ray 和 CloudWatch 記錄。`.sync` 任務狀態需要其他許可。

### 我無法使用 JsonPath 來參考先前任務的輸出。
<a name="troubleshooting-general-unable-to-use-json"></a>

對於 JsonPath，JSON 金鑰必須以 結尾`.$`。這表示 JsonPath 只能用於鍵值對。如果您想要使用 JsonPath 其他位置，例如 陣列，您可以使用[內部函數](intrinsic-functions.md)。例如，您可以使用類似下列內容：

**任務 A 輸出：**

```
{
    "sample": "test"
}
```

**任務 B：**

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

### 狀態轉換發生延遲。
<a name="troubleshooting-general-state-transition-delay"></a>

對於標準工作流程，狀態轉換的數量有限制。當您超過狀態轉換限制時，Step Functions 會延遲狀態轉換，直到配額的儲存貯體填滿為止。您可以透過檢閱 CloudWatch `ExecutionThrottled` 指標頁面 [執行指標](procedure-cw-metrics.md#cloudwatch-step-functions-execution-metrics)區段中的 指標來監控狀態轉換限制限流。

### 當我啟動新的標準工作流程執行時，它們會失敗並顯示`ExecutionLimitExceeded`錯誤。
<a name="troubleshooting-general-unable-to-start-standard-workflows"></a>

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

### 處於平行狀態的一個分支故障會導致整個執行失敗。
<a name="troubleshooting-general-branch-failure-causes-execution-failure"></a>

這是預期的行為。為了避免在使用平行狀態時遇到失敗，請設定 Step Functions 以[擷取從每個分支擲出的錯誤](concepts-error-handling.md#error-handling-fallback-states.title)。

## 對服務整合進行故障診斷
<a name="troubleshooting-service-integrations"></a>

### 我的任務在下游服務中完成，但在 Step Functions 中，任務狀態會保持「進行中」或延遲完成。
<a name="troubleshooting-service-integrations-task-delay"></a>

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

### 我想要從巢狀狀態機器執行傳回 JSON 輸出。
<a name="troubleshooting-service-integrations-json-from-nested"></a>

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

### 我無法從另一個帳戶叫用 Lambda 函數。
<a name="troubleshooting-service-integrations-invoke-lambda-from-account"></a>

**使用跨帳戶支援存取 Lambda 函數**  
如果您的區域可以使用[跨帳戶存取](concepts-access-cross-acct-resources.md) AWS 資源，請使用下列方法從另一個帳戶叫用 Lambda 函數。

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

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

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

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

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

如需範例，請參閱教學[在 Step Functions 中存取跨帳戶 AWS 資源](tutorial-access-cross-acct-resources.md)課程中的 。

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

如需指定跨帳戶資源`Task`的狀態定義範例，請參閱 [任務狀態的登入資料欄位範例](state-task.md#task-state-example-credentials)。

**在沒有跨帳戶支援的情況下存取 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`狀態傳遞的任務權杖。
<a name="troubleshooting-service-integrations-unable-to-see-task-tokens"></a>

 在`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沒有任何適當的參數。

## 對活動進行故障診斷
<a name="troubleshooting-activities"></a>

### 我的狀態機器執行卡在活動狀態。
<a name="troubleshooting-activities-stuck-state-machine"></a>

在您使用 [GetActivityTask](https://docs.aws.amazon.com/step-functions/latest/apireference/API_GetActivityTask.html) API 動作輪詢任務權杖之前，活動任務狀態不會啟動。最佳實務是新增任務層級逾時，以避免執行停滯。如需詳細資訊，請參閱[使用逾時以避免停滯的 Step Functions 工作流程執行](sfn-best-practices.md#sfn-stuck-execution)。

如果您的狀態機器卡在 [ActivityScheduled](https://docs.aws.amazon.com/step-functions/latest/apireference/API_ActivityScheduledEventDetails.html) 事件中，表示您的活動工作者機群有問題或規模不足。您應該監控 [`ActivityScheduleTime`](procedure-cw-metrics.md#cloudwatch-step-functions-activity-metrics) CloudWatch 指標，並在該時間增加時設定警示。不過，若要逾時`Activity`狀態不會轉換為 `ActivityStarted` 狀態的任何停滯狀態機器執行，請在狀態機器層級定義逾時。若要這樣做，請在`TimeoutSeconds`欄位外的狀態機器定義開頭指定`States`欄位。

### 我的活動工作者在等待任務字符時逾時。
<a name="troubleshooting-activity-worker-times-out"></a>

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

## 快速工作流程疑難排解
<a name="troubleshooting-express-workflows"></a>

### 我的應用程式在收到 `[StartSyncExecution](https://docs.aws.amazon.com/step-functions/latest/apireference/API_StartSyncExecution.html)` API 呼叫的回應之前逾時。
<a name="troubleshooting-express-workflows-timeouts"></a>

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

### 我看不到執行歷史記錄，無法對快速工作流程失敗進行故障診斷。
<a name="troubleshooting-express-workflows-no-execution-history"></a>

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

根據持續時間列出執行：

```
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"]
```