工作流程狀態 - AWS Step Functions

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

工作流程狀態

Task 狀態 ("Type": "Task") 代表狀態機器執行的一個工作單位。任務通過使用活動或 AWS Lambda 函數來執行工作,通過與其他支持的集成 AWS 服務,或者通過調用第三方API(例如 Stripe)來執行工作。

Amazon 州語言代表任務,方法是將州的類型設定為,Task並提供活動的 Amazon 資源名稱 (ARN)、Lambda 函數或第三方API端點。下列工作狀態定義會叫用名為HelloFunction的 Lambda 函數。

"Lambda Invoke": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "Parameters": { "Payload.$": "$", "FunctionName": "arn:aws:lambda:us-east-2:123456789012:function:HelloFunction:$LATEST" }, "End": true }

工作類型

「Step Functions」支援您可在「工作」狀態定義中指定的下列工作類型:

您可以在任務狀態定義的Resource欄位ARN中提供任務類型來指定任務類型。下列範例顯示Resource欄位的語法。除了調用第三方API的任務類型之外的所有任務類型都使用以下語法。如需有關「HTTP工作」語法的資訊,請參閱APIs在 Step Functions 工作流程中呼叫第

在「任務」狀態定義中,將下列語法中的斜體文字取代為 AWS 資源特定的資訊。

arn:partition:service:region:account:task_type:name

下列清單說明此語法中的個別元件:

  • partition是最常使用的 AWS Step Functions 分割區aws

  • service表示 AWS 服務 用來執行工作,且可以是下列其中一個值:

    • states對於一項活動

    • lambda對於一個 Lambda 函數。如果您與其他 AWS 服務(例如 Amazon SNS 或亞馬遜 DynamoDB) 整合,請使用sns或. dynamodb

  • region是已建立 Step Functions 數活動或狀態機器類型、Lambda 函數或任何其他 AWS 資源的AWS 區域代碼。

  • account是您在其中定義資源的 AWS 帳戶 ID。

  • task_type 是要執行的任務類型。它可能是以下其中一個數值:

  • name是已註冊的資源名稱 (活動名稱、Lambda 函數名稱或服務API動作)。

注意

Step Functions 不支援ARNs跨分割區或區域的參考。例如,不aws-cn能調用aws分區中的任務,反之亦然。

下列各節會提供每個任務類型的詳細資訊。

活動

活動代表由您實作和託管並可執行特定任務的工作者 (程序或執行緒)。活動僅受到標準工作流程支援,不受快速工作流程支持。

活動ResourceARNs使用以下語法。

arn:partition:states:region:account:activity:name
注意

在第一次使用 Step Functions 之前,您必須使用步驟函數 (使用CreateActivity、API動作或 Step Functions 主控台) 建立活動。

如需建立活動及實作工作者的詳細資訊,請參閱活動

Lambda 函數

Lambda 工作會使用 AWS Lambda. 若要指定 Lambda 函數,請使ARN用Resource欄位中的 Lambda 函數。

根據您用來指定 Lambda 函數的整合類型 (最佳化AWSSDK整合或整合),Lambda 函數Resource欄位的語法會有所不同。

下列Resource欄位語法是與 Lambda 函數進行最佳化整合的範例。

"arn:aws:states:::lambda:invoke"

下列Resource欄位語法是與 Lambda 函數 AWS SDK整合的範例。

"arn:aws:states:::aws-sdk:lambda:invoke"

下列Task狀態定義顯示與名為的 Lambda 函數進行最佳化整合的範例HelloWorld

"LambdaState": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "OutputPath": "$.Payload", "Parameters": { "Payload.$": "$", "FunctionName": "arn:aws:lambda:us-east-1:function:HelloWorld:$LATEST" }, "Next": "NextState" }

Resource欄位中指定的 Lambda 函數完成後,其輸出會傳送至Next欄位 (」NextState「) 中識別的狀態。

一個支持 AWS 服務

當您參考連線的資源時,Step Fun API ctions 會直接呼叫支援服務的動作。在 Resource 欄位中指定服務和動作。

連接的服務ResourceARNs使用以下語法。

arn:partition:states:region:account:servicename:APIname
注意

若要建立與已連線資源的同步連線,.sync請附加至 APIname 中的項目ARN。如需詳細資訊,請參閱整合其他服務

例如:

{ "StartAt": "BATCH_JOB", "States": { "BATCH_JOB": { "Type": "Task", "Resource": "arn:aws:states:::batch:submitJob.sync", "Parameters": { "JobDefinition": "preprocessing", "JobName": "PreprocessingBatchJob", "JobQueue": "SecondaryQueue", "Parameters.$": "$.batchjob.parameters", "RetryStrategy": { "attempts": 5 } }, "End": true } } }

工作狀態欄位

除了常見狀態欄位以外,Task 狀態還有下列欄位。

Resource (必要)

AURI,尤其是唯ARN一標識要執行的特定任務。

Parameters (選用)

用於將資訊傳遞給已連線資源的API動作。這些參數可以混合使用靜態JSON和 JsonPath. 如需詳細資訊,請參閱將參數傳遞給 Step Functions 數API中的服務

Credentials (選用)

指定狀態機器的執行角色必須承擔的目標角色,然後再呼叫指Resource定的角色。或者,您也可以指定JSONPath值或內建函數,ARN在執行階段根據執行輸入解析為IAM角色。如果您指定一個JSONPath值,則必須在其前面加上$.符號。

如需在Task狀態中使用此欄位的範例,請參閱作業狀態的證明資料欄位範例。如需使用此欄位從狀態機存取跨帳號 AWS 資源的範例,請參閱教學課程:存取 Step Functions 中的跨帳戶 AWS 資源

注意
ResultPath (選用)

指定要將執行 Resource 中所指定任務的結果放置於何處 (在輸入中)。輸入會先依據 OutputPath 欄位 (如果有的話) 所指定篩選,而後做為狀態的輸出。如需詳細資訊,請參閱輸入和輸出處理

ResultSelector (選用)

傳遞鍵值對的集合,其中值是靜態的或從結果中選擇的。如需詳細資訊,請參閱ResultSelector

Retry (選用)

稱為 Retrier 的物件陣列,這類物件可定義狀態發生執行時間錯誤時的重試政策。如需詳細資訊,請參閱使用重試和使用 Catch 的狀態機示例

Catch (選用)

稱為 Catcher 的物件陣列,可定義後援狀態。如果狀態遇到執行時間錯誤並且其重試政策耗盡或未定義,則執行此狀態。如需詳細資訊,請參閱備用狀態

TimeoutSeconds (選用)

指定活動或工作在因States.Timeout錯誤而失敗而逾時之前可以執行的時間上限。逾時值必須是正的非零整數。預設值為 99999999

逾時計數會在工作啟LambdaFunctionStarted動後開始,例如,在執行事件歷程記錄中記錄ActivityStarted或事件時。對於活動,計數會在GetActivityTask收到權杖時開始計數,並ActivityStarted記錄在執行事件歷程記錄中。

當任務啟動時,Step Functions 會在指定的TimeoutSeconds持續時間內等待任務或活動 Worker 的成功或失敗回應。如果任務或活動 Worker 無法在此時間內回應,「Step Functions」會將工作流程執行標記為失敗。

TimeoutSecondsPath (選用)

如果您想要使用參考路徑從狀態輸入動態提供逾時值,請使用TimeoutSecondsPath。解析後,參考路徑必須選取值為正整數的欄位。

注意

Task態不能同時包含TimeoutSecondsTimeoutSecondsPath

HeartbeatSeconds (選用)

決定活動 Worker 在執行任務期間傳送的活動訊號頻率。活動訊號表示工作仍在執行中,需要更多時間才能完成。活動訊號可防止活動或工作在持續時TimeoutSeconds間內逾時。

HeartbeatSeconds必須是小於欄位值的正非零整數TimeoutSeconds值。預設值為 99999999。如果工作的活動訊號之間經過的時間超過指定秒數,則工作狀態會失敗並顯示錯誤。States.Timeout

對於活動,計數會在GetActivityTask收到權杖時開始計數,並ActivityStarted記錄在執行事件歷程記錄中。

HeartbeatSecondsPath (選用)

如果您想要使用參考路徑從狀態輸入動態提供活動訊號值,請使用HeartbeatSecondsPath。解析後,參考路徑必須選取值為正整數的欄位。

注意

Task態不能同時包含HeartbeatSecondsHeartbeatSecondsPath

如果狀態結束執行,則 Task 狀態必須將 End 欄位設定為 true,或必須在 Task 狀態完成時於 Next 欄位中提供執行的狀態。

工作狀態定義範例

下列範例顯示如何根據您的需求指定 Task 狀態定義。

工作狀態逾時和活動訊號間隔

這是針對長時間執行的活動設定逾時值和活動訊號間隔的最佳實務。這可以透過指定逾時值和活動訊號值,或透過動態設定來完成。

靜態逾時和活動訊號通知範例

HelloWorld 完成時,將會執行下一個狀態 (這裡稱為 NextState)。

如果這個任務無法在 300 秒內完成,或者未在 60 秒的間隔內傳送活動訊號通知,則任務會被標示為 failed

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

動態工作逾時和活動訊號通知範例

在此範例中,當工 AWS Glue 作完成時,將執行下一個狀態。

如果此工作無法在工作動態設定的間隔內完成,則會將 AWS Glue 工作標記為failed

"GlueJobTask": { "Type": "Task", "Resource": "arn:aws:states:::glue:startJobRun.sync", "Parameters": { "JobName": "myGlueJob" }, "TimeoutSecondsPath": "$.params.maxTime", "Next": "NextState" }

作業狀態的證明資料欄位範例

指定硬式編碼角色 IAM ARN

下列範例會指定狀態機器的執行IAM角色必須假設的目標角色,才能存取名為Echo的跨帳戶 Lambda 函數。在此範例中,目標角色會指定ARN為硬式編碼值。

{ "StartAt": "Cross-account call", "States": { "Cross-account call": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "Credentials": { "RoleArn": "arn:aws:iam::111122223333:role/LambdaRole" }, "Parameters": { "FunctionName": "arn:aws:lambda:us-east-2:111122223333:function:Echo" }, "End": true } } }

指定JSONPath為IAM角色 ARN

下列範例會指定一個JSONPath值,這個值會ARN在執行階段解析為IAM角色。

{ "StartAt": "Lambda", "States": { "Lambda": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "Credentials": { "RoleArn.$": "$.roleArn" }, ... } } }

指定一個內在函數作為角色 IAM ARN

下列範例會使用States.Format內建函式,ARN在執行階段解析為IAM角色。

{ "StartAt": "Lambda", "States": { "Lambda": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "Credentials": { "RoleArn.$": "States.Format('arn:aws:iam::{}:role/ROLENAME', $.accountId)" }, ... } } }