任務 - 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 工作語法的相關資訊,請參閱呼叫第三方 API

在「任務」狀態定義中,將下列語法中的斜體文字取代為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 不支援跨分割區或區域參考 ARN。例如,不aws-cn能調用aws分區中的任務,反之亦然。

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

活動

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

活動 Resource ARN 會使用以下語法。

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

您必須先建立具有 Step Functions 的活動 (使用CreateActivity、API 動作或 Step Functions 主控台),才能首次使用步驟函數。

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

Lambda 函數

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

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

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

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

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

"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 Functions 會直接呼叫支援服務的 API 動作。在 Resource 欄位中指定服務和動作。

已連線的服務 Resource ARN 會使用以下語法。

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

若要對已連線的資源建立同步連線,請將 .sync 附加到 ARN 中的 APIname 項目。如需詳細資訊,請參閱使用其他 服務

例如:

{ "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 (必要)

URI,特別是能夠唯一識別要執行特定任務的 ARN。

Parameters (選用)

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

Credentials (選用)

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

如需在Task狀態中使用此欄位的範例,請參閱作業狀態的證明資料欄位範例。如需使用此欄位從狀態機存取跨帳號AWS資源的範例,請參閱教學課程:存取跨帳戶 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 } } }

將 JSON 路徑指定為 IAM 角色 ARN

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

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

將內建函數指定為 IAM 角色 ARN

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

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