本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
探索 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。呼叫 後,工作流程會進展到下一個狀態Publish
API。
提示
若要部署使用請求回應服務整合模式的範例工作流程到您的 AWS 帳戶,請參閱單元 2 - 研討會的請求回應
執行任務 (.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 StopExecution
API動作。不過,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 在任務完全完成之前繼續您的工作流程。您可以使用與使用使用任務權杖等待回呼服務整合模式相同的方式來達成此目標。若要執行此作業,請將任務權杖傳遞給您的任務,然後使用 SendTaskSuccess
或 SendTaskFailure
API呼叫傳回任務權杖。Step Functions 將使用您在該呼叫中提供的資料來完成任務、停止監控任務,並繼續工作流程。
使用任務權杖等待回呼
回呼任務可讓工作流程暫停,直到任務字符傳回。任務可能需要等候人員核准、與第三方進行整合,或者呼叫舊版系統。對於這類任務,您可以暫停 Step Functions,直到工作流程執行達到一年的服務配額 (請參閱 與狀態調節相關的配額),並等待外部程序或工作流程完成。在這些情況下,Step Functions 可讓您將 AWS SDK任務字符傳遞給服務整合,以及一些最佳化服務整合。這時任務會暫停等候,直到其收到 SendTaskSuccess
或 SendTaskFailure
呼叫傳回的任務字符。
如果使用回呼任務字符Task
的狀態逾時,會產生新的隨機字符。您可以從內容物件存取任務權杖。
注意
任務字符必須至少包含一個字元,且不得超過 1024 個字元。
若要.waitForTaskToken
搭配 AWS SDK整合使用 ,API您使用的 必須具有參數欄位,才能放置任務權杖。
注意
您必須從相同 AWS 帳戶中的主體傳遞任務權杖。如果您從不同 AWS 帳戶中的委託人傳送權杖,則權杖將無法運作。
提示
若要部署使用回呼任務字符服務整合模式的範例工作流程到您的 AWS 帳戶,請參閱模組 4 - 使用研討會的任務字符等待回呼
若要查看支援等候任務字符的整合服務清單 (.waitForTaskToken
) 的詳細資訊,請參閱將 服務與 Step Functions 整合。
任務字符範例
在此範例中,Step Functions 工作流程需要與外部微服務整合,才能在核准工作流程中執行額度檢查。Step Functions 會發佈 Amazon SQS 訊息,其中包含任務權杖做為訊息的一部分。外部系統與 Amazon 整合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"
欄位,就能存取該任務字符。初始 $$.
會指定路徑存取內容物件,並取得執行中執行中目前任務的任務權杖。
完成之後,外部服務會呼叫 SendTaskSuccess
或 SendTaskFailure
,其中包含 taskToken
。工作流程只有在此時才會繼續進入下一個狀態。
注意
若要避免當程序無法隨著 SendTaskSuccess
或 SendTaskFailure
傳送任務字符而造成無限期等候的情況,請參閱設定活動訊號逾時為正在等候的任務。
從內容物件取得權杖
內容物件是包含執行相關資訊的內部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 建立回呼模式範例。