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

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

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

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

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

  • 呼叫服務並讓 Step Functions 等待工作完成。

  • 使用任務令牌調用服務,並讓 Step Functions 等待,直到該令牌與有效負載一起返回。

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

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

整合模式支援

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

  • 標準工作流程支援請求回應整合。某些服務支援執行 Job (.sync) 或等待回呼 (. waitForTask令牌),以及在某些情況下。如需詳細資訊,請參閱下列最佳化整合表。

  • Express 工作流程僅支援「請求回應」整合。

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

AWS SDKStep Functions 中的整合

綜合服務 請求回應 執行 Job-.sync 等待回調-。 waitForTask令牌
超過二百項服務 標準 & 快遞 不支援 標準

Step Functions 中的最佳化整合

綜合服務 請求回應 執行 Job-.sync 等待回調-。 waitForTask令牌
Amazon API Gateway 標準 & 快遞 不支援 標準
Amazon Athena 標準 & 快遞 標準 不支援
AWS Batch 標準 & 快遞 標準 不支援
Amazon Bedrock 標準 & 快遞 標準 標準
AWS CodeBuild 標準 & 快遞 標準 不支援
Amazon DynamoDB 標準 & 快遞 不支援 不支援
Amazon ECS/Fargate 標準 & 快遞 標準 標準
Amazon EKS 標準 & 快遞 標準 標準
Amazon EMR 標準 & 快遞 標準 不支援
Amazon EMR on EKS 標準 & 快遞 標準 不支援
Amazon EMR Serverless 標準 & 快遞 標準 不支援
Amazon EventBridge 標準 & 快遞 不支援 標準
AWS Glue 標準 & 快遞 標準 不支援
AWS Glue DataBrew 標準 & 快遞 標準 不支援
AWS Lambda 標準 & 快遞 不支援 標準
AWS Elemental MediaConvert 標準 & 快遞 標準 不支援
Amazon SageMaker 標準 & 快遞 標準 不支援
Amazon SNS 標準 & 快遞 不支援 標準
Amazon SQS 標準 & 快遞 不支援 標準
AWS Step Functions 標準 & 快遞 標準 標準

請求回應

當您在工作狀態的"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。工作流程會在呼叫之後進行到下一個狀態。Publish API

提示

若要將使用要求回應服務整合模式的範例工作流程部署至 AWS 帳戶,請參閱模組 2-要求回應 AWS Step Functions 工作坊

執行任務 (.sync)

對於綜合服務,例如 AWS Batch 和 AmazonECS,Step Functions 可以等待請求完成,然後再進入下一個狀態。若要讓「Step Functions」等候,請在任務狀態定義中指定"Resource"欄位,並在資源後面加上.sync尾碼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 資源名稱 (ARN) 表示 Step Functions 等待任務完成。打電話後 AWS Batch submitJob,工作流程會暫停。當工作完成時,Step Functions 進展到下一個狀態。如需詳細資訊,請參閱 AWS Batch 示例項目:使用 管理批次任務 AWS Batch 以及 Amazon SNS

如果使用 this (.sync) 服務整合模式的工作中止,而 Step Functions 無法取消工作,則整合式服務可能會產生額外費用。在下列情況下,工作可以中止:

  • 狀態機執行已停止。

  • 平行狀態的不同分支失敗,並顯示未捕獲的錯誤。

  • Map 狀態的迭代失敗,並顯示未捕獲的錯誤。

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 僅使用輪詢。例如,「Step Functions」會對「」執行輪詢states:StartExecution.syncDescribeExecutionAPI並使用您指派的配額。

提示

若要將使用執行作業 (.sync) 服務整合模式的範例 Job 流程部署至您的 AWS 帳戶,請參閱模組 3-執行 Job (.sync) AWS Step Functions 工作坊

若要查看支援等候工作完成的整合服務清單 (.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您使用的必須有一個參數欄位,才能在其中放置任務 Token。

注意

您必須從相同的主體傳遞任務權杖 AWS 帳戶。如果您從不同的校長發送令牌,則令牌將不起作用 AWS 帳戶。

提示

若要將使用回呼工作 Token 服務整合模式的範例工作流程部署至您的 AWS 帳戶,請參閱模組 4-使 AWS Step Functions 工作坊

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

任務字符範例

在此範例中,「Step Functions」工作流程需要與外部微服務整合,才能在核准工作流程中執行信用檢查。Step Functions 會發佈 Amazon SQS 訊息,其中包含任務權杖做為訊息的一部分。外部系統與 Amazon 集成SQS,並將消息從隊列中提取出來。完成後,它將返回結果和原始任務令牌。Step Functions 接著會繼續其工作流程。

SQS等待任務令牌返回的任務

引用 Amazon SQS 包括的任務定義"Resource"字段.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" }

如需詳細資訊,請參閱本指南中處理輸入和輸出一節的內容物件

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

正在等候任務字符的任務將會等候,直到執行到達一年的服務配額 (請參閱與狀態節流有關的配額)。為了避免執行發生停滯,您可以設定在狀態機器定義中設定活動訊號逾時間隔。使用 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 的錯誤。

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