探索 Step Functions 中的服務整合模式 - AWS Step Functions

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

探索 Step Functions 中的服務整合模式

AWS Step Functions 直接與 Amazon States 語言中的 服務整合。您可以使用三種服務整合模式來控制這些 AWS 服務。

  • 呼叫 服務,並讓 Step Functions 在收到HTTP回應後立即進入下一個狀態。

  • 呼叫 服務,並讓 Step Functions 等待任務完成。

  • 使用任務權杖呼叫服務,並讓 Step Functions 等到該權杖與承載一起傳回。

這些服務整合模式都由您在任務定義 "Resource" URI欄位中建立 的方式控制。

如需設定整合式服務的 AWS Identity and Access Management (IAM) 相關資訊,請參閱 Step Functions 式如何為整合式服務產生IAM原則

整合模式支援

標準工作流程和快速工作流程支援相同的整合,但不支援相同的整合模式

  • 標準工作流程支援請求回應整合。某些服務支援執行任務 (.sync)等待回呼 (.waitForTaskToken),在某些情況下則支援兩者。如需詳細資訊,請參閱下列最佳化整合資料表。

  • Express Workflows 僅支援請求回應整合。

若要協助決定這兩種類型,請參閱 在 Step Functions 中選擇工作流程類

AWS SDK Step Functions 中的 整合

整合服務 請求回應 執行任務 - .sync 等待回呼 - .waitForTaskToken
超過兩百項服務 標準 & Express 不支援 標準

Step Functions 中的最佳化整合

整合服務 請求回應 執行任務 - .sync 等待回呼 - .waitForTaskToken
Amazon API Gateway 標準 & Express 不支援 標準
Amazon Athena 標準 & Express 標準 不支援
AWS Batch 標準 & Express 標準 不支援
Amazon Bedrock 標準 & Express 標準 標準
AWS CodeBuild 標準 & Express 標準 不支援
Amazon DynamoDB 標準 & Express 不支援 不支援
Amazon ECS/Fargate 標準 & Express 標準 標準
Amazon EKS 標準 & Express 標準 標準
Amazon EMR 標準 & Express 標準 不支援
Amazon EMR on EKS 標準 & Express 標準 不支援
Amazon EMR Serverless 標準 & Express 標準 不支援
Amazon EventBridge 標準 & Express 不支援 標準
AWS Glue 標準 & Express 標準 不支援
AWS Glue DataBrew 標準 & Express 標準 不支援
AWS Lambda 標準 & Express 不支援 標準
AWS Elemental MediaConvert 標準 & Express 標準 不支援
Amazon SageMaker AI 標準 & Express 標準 不支援
Amazon SNS 標準 & Express 不支援 標準
Amazon SQS 標準 & Express 不支援 標準
AWS Step Functions 標準 & Express 標準 標準

請求回應

當您在任務狀態的"Resource"字串中指定服務,而且您提供資源時,Step Functions 會等待HTTP回應,然後繼續下一個狀態。Step Functions 不會等待任務完成。

下列範例示範如何發佈 Amazon SNS主題。

"Send message to SNS": { "Type":"Task", "Resource":"arn:aws:states:::sns:publish", "Parameters": { "TopicArn":"arn:aws:sns:us-east-1:123456789012:myTopic", "Message":"Hello from Step Functions!" }, "Next":"NEXT_STATE" }

此範例參考 Amazon API的發佈SNS。呼叫 後,工作流程會進展到下一個狀態PublishAPI。

提示

若要部署使用請求回應服務整合模式的範例工作流程到您的 AWS 帳戶,請參閱單元 2 - 研討會的請求回應 AWS Step Functions

執行任務 (.sync)

對於整合的服務,例如 AWS Batch 和 Amazon ECS,Step Functions 可以等待請求完成,然後再進入下一個狀態。若要讓 Step Functions .sync 等待,請指定任務狀態定義中的"Resource"欄位,並在資源 後面附加尾碼URI。

例如,提交 AWS Batch 任務時,請使用 狀態機器定義中的 "Resource" 欄位,如本範例所示。

"Manage Batch task": { "Type": "Task", "Resource": "arn:aws:states:::batch:submitJob.sync", "Parameters": { "JobDefinition": "arn:aws:batch:us-east-2:123456789012:job-definition/testJobDefinition", "JobName": "testJob", "JobQueue": "arn:aws:batch:us-east-2:123456789012:job-queue/testQueue" }, "Next": "NEXT_STATE" }

.sync部分附加至資源 Amazon Resource Name (ARN) 表示 Step Functions 會等待任務完成。呼叫 AWS Batch submitJob 之後,工作流程會暫停。當任務完成時,Step Functions 會進入下一個狀態。如需詳細資訊,請參閱 AWS Batch 範例專案:使用 管理批次任務 AWS Batch 以及 Amazon SNS

如果使用此 (.sync) 服務整合模式的任務遭到中止,且 Step Functions 無法取消任務,您可能會從整合服務產生額外費用。如果出現下列情況,則可以中止任務:

  • 狀態機器執行會停止。

  • 平行狀態的不同分支會失敗,並出現未攔截的錯誤。

  • 對應狀態的反覆運算失敗,並出現未攔截的錯誤。

Step Functions 會盡力取消任務。例如,如果 Step Functions states:startExecution.sync任務中止,它會呼叫 Step Functions StopExecutionAPI動作。不過,Step Functions 可能無法取消任務。原因包括但不限於:

  • 您的IAM執行角色缺少發出對應API呼叫的許可。

  • 發生暫時性服務中斷。

當您使用.sync服務整合模式時,Step Functions 會使用消耗您指派配額和事件的輪詢來監控任務的狀態。對於相同帳戶中的.sync調用,Step Functions 會使用 EventBridge 事件並輪詢APIs您在 Task 狀態中指定的 。對於跨帳戶.sync調用,Step Functions 只會使用輪詢。例如,對於 states:StartExecution.sync,Step Functions 會在 上執行輪詢,DescribeExecutionAPI並使用您指派的配額。

提示

若要部署使用執行任務 (.sync) 服務整合模式的範例工作流程到您的 AWS 帳戶,請參閱 AWS Step Functions 研討會的單元 3 - 執行任務 (.sync)

若要查看支援等候工作完成的整合服務清單 (.sync) 的詳細資訊,請參閱將 服務與 Step Functions 整合

注意

使用 .sync.waitForTaskToken 模式的服務整合需要額外IAM許可。如需詳細資訊,請參閱Step Functions 式如何為整合式服務產生IAM原則

在某些情況下,您可能會希望 Step Functions 在任務完全完成之前繼續您的工作流程。您可以使用與使用使用任務權杖等待回呼服務整合模式相同的方式來達成此目標。若要執行此作業,請將任務權杖傳遞給您的任務,然後使用 SendTaskSuccessSendTaskFailureAPI呼叫傳回任務權杖。Step Functions 將使用您在該呼叫中提供的資料來完成任務、停止監控任務,並繼續工作流程。

使用任務權杖等待回呼

回呼任務可讓工作流程暫停,直到任務字符傳回。任務可能需要等候人員核准、與第三方進行整合,或者呼叫舊版系統。對於這類任務,您可以暫停 Step Functions,直到工作流程執行達到一年的服務配額 (請參閱 與狀態調節相關的配額),並等待外部程序或工作流程完成。在這些情況下,Step Functions 可讓您將 AWS SDK任務字符傳遞給服務整合,以及一些最佳化服務整合。這時任務會暫停等候,直到其收到 SendTaskSuccessSendTaskFailure 呼叫傳回的任務字符。

如果使用回呼任務字符Task的狀態逾時,會產生新的隨機字符。您可以從內容物件存取任務權杖。

注意

任務字符必須至少包含一個字元,且不得超過 1024 個字元。

若要.waitForTaskToken搭配 AWS SDK整合使用 ,API您使用的 必須具有參數欄位,才能放置任務權杖。

注意

您必須從相同 AWS 帳戶中的主體傳遞任務權杖。如果您從不同 AWS 帳戶中的委託人傳送權杖,則權杖將無法運作。

提示

若要部署使用回呼任務字符服務整合模式的範例工作流程到您的 AWS 帳戶,請參閱模組 4 - 使用研討會的任務字符等待回呼 AWS Step Functions

若要查看支援等候任務字符的整合服務清單 (.waitForTaskToken) 的詳細資訊,請參閱將 服務與 Step Functions 整合

任務字符範例

在此範例中,Step Functions 工作流程需要與外部微服務整合,才能在核准工作流程中執行額度檢查。Step Functions 會發佈 Amazon SQS 訊息,其中包含任務權杖做為訊息的一部分。外部系統與 Amazon 整合SQS,並從佇列中提取訊息。完成後,它會傳回結果和原始任務字符。步驟函數接著會繼續其工作流程。

SQS 等待任務權杖傳回的任務

參考 Amazon 的任務定義"Resource"欄位SQS包含.waitForTaskToken附加到結尾。

"Send message to SQS": { "Type": "Task", "Resource": "arn:aws:states:::sqs:sendMessage.waitForTaskToken", "Parameters": { "QueueUrl": "https://sqs.us-east-2.amazonaws.com/123456789012/myQueue", "MessageBody": { "Message": "Hello from Step Functions!", "TaskToken.$": "$$.Task.Token" } }, "Next": "NEXT_STATE" }

這可讓 Step Functions 暫停並等待任務字符。當您使用 .waitForTaskToken 指定資源時,使用包含特殊路徑目標 ($$.Task.Token) 之狀態定義的 "Parameters" 欄位,就能存取該任務字符。初始 $$.會指定路徑存取內容物件,並取得執行中執行中目前任務的任務權杖。

完成之後,外部服務會呼叫 SendTaskSuccessSendTaskFailure,其中包含 taskToken。工作流程只有在此時才會繼續進入下一個狀態。

注意

若要避免當程序無法隨著 SendTaskSuccessSendTaskFailure 傳送任務字符而造成無限期等候的情況,請參閱設定活動訊號逾時為正在等候的任務

從內容物件取得權杖

內容物件是包含執行相關資訊的內部JSON物件。正如狀態輸入,它可以在執行期間搭配路徑,從 "Parameters" 欄位中存取而得。從任務定義存取時,它會包含有關特定執行的資訊,包括任務字符。

{ "Execution": { "Id": "arn:aws:states:us-east-1:123456789012:execution:stateMachineName:executionName", "Input": { "key": "value" }, "Name": "executionName", "RoleArn": "arn:aws:iam::123456789012:role...", "StartTime": "2019-03-26T20:14:13.192Z" }, "State": { "EnteredTime": "2019-03-26T20:14:13.192Z", "Name": "Test", "RetryCount": 3 }, "StateMachine": { "Id": "arn:aws:states:us-east-1:123456789012:stateMachine:stateMachineName", "Name": "name" }, "Task": { "Token": "h7XRiCdLtd/83p1E0dMccoxlzFhglsdkzpK9mBVKZsp7d9yrT1W" } }

您可以使用特殊路徑,從任務定義之 "Parameters" 欄位中存取任務字符。若要存取輸入或內容物件,請先透過將 附加.$至參數名稱,指定 參數為路徑。以下指定 "Parameters"規格中輸入和內容物件的節點。

"Parameters": { "Input.$": "$", "TaskToken.$": "$$.Task.Token" },

在這兩種情況下,附加.$到參數名稱會通知 Step Functions 預期路徑。在第一個案例中,"$" 就是包括整個輸入的路徑。在第二個案例中, $$. 指定路徑將存取內容物件,並將 參數$$.Task.Token設定為執行中執行之內容物件中任務字符的值。

在 Amazon SQS範例中,.waitForTaskToken"Resource" 欄位中會通知 Step Functions 等待任務字符傳回。"TaskToken.$": "$$.Task.Token" 參數會將該字符做為 Amazon SQS 訊息的一部分傳遞。

"Send message to SQS": { "Type": "Task", "Resource": "arn:aws:states:::sqs:sendMessage.waitForTaskToken", "Parameters": { "QueueUrl": "https://sqs.us-east-2.amazonaws.com/123456789012/myQueue", "MessageBody": { "Message": "Hello from Step Functions!", "TaskToken.$": "$$.Task.Token" } }, "Next": "NEXT_STATE" }

如需內容物件的詳細資訊,請參閱本指南中的 從 Step Functions 中的內容物件存取執行資料 處理輸入和輸出一節。

設定活動訊號逾時為正在等候的任務

正在等候任務字符的任務將會等候,直到執行到達一年的服務配額 (請參閱與狀態調節相關的配額)。為了避免執行發生停滯,您可以設定在狀態機器定義中設定活動訊號逾時間隔。使用 HeartbeatSeconds 欄位,指定逾時的間隔。

{ "StartAt": "Push to SQS", "States": { "Push to SQS": { "Type": "Task", "Resource": "arn:aws:states:::sqs:sendMessage.waitForTaskToken", "HeartbeatSeconds": 600, "Parameters": { "MessageBody": { "myTaskToken.$": "$$.Task.Token" }, "QueueUrl": "https://sqs.us-east-1.amazonaws.com/123456789012/push-based-queue" }, "ResultPath": "$.SQS", "End": true } } }

在此狀態機器定義中,任務會將訊息推送至 Amazon,SQS並等待外部程序使用提供的任務字符回撥。"HeartbeatSeconds": 600 欄位會將活動訊號逾時間隔設定為 10 分鐘。任務會等待任務字符與下列其中一個API動作一起傳回:

如果等候任務沒有在 10 分鐘期間內收到有效的任務字符,則此任務就會失敗,且收到名稱 States.Timeout 的錯誤。

如需詳細資訊,請參閱回呼任務範例專案:使用 Amazon SQS、Amazon SNS和 Lambda 建立回呼模式範例