服务集成故障排除 - Amazon Step Functions
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

服务集成故障排除

在下游服务中,我的作业已经完成,但在 Functions 中,任务状态仍为“进行中”或延迟完成。

对于 .sync 服务集成模式,Step Functions 使用 EventBridge 规则、下游 API 或两者的组合来检测下游作业状态。对于某些服务,Step Functions 不会创建 EventBridge 规则进行监控。例如,对于 Amazon Glue 服务集成,Step Functions 不使用 EventBridge 规则,而是进行 glue:GetJobRun 调用。由于 API 调用的频率,下游任务完成时间与 Step Functions 任务完成时间存在差异。Step Functions 需要 IAM 权限才能管理 EventBridge 规则和调用下游服务。有关执行角色权限不足如何影响任务完成的详细信息,请参阅使用“运行作业”模式执的任务附加权限

我想从嵌套状态机执行中返回 JSON 输出。

Step Functions 有两个同步服务集成:startExecution.syncstartExecution.sync:2。两者都将等待嵌套状态机完成,但它们返回不同的 Output 格式。您可以使用 startExecution.sync:2Output 下返回 JSON 输出。

我无法从另一个账户调用 Lambda 函数。

通过跨账户支持访问 Lambda 函数

如果您所在区域提供 Amazon 资源的跨账户存取,请使用以下方法从另一个帐户调用 Lambda 函数。

要在工作流中调用跨账户资源,请执行以下操作:

  1. 在包含资源的目标账户中创建 IAM 角色。此角色向包含状态机的源账户授予访问目标账户资源的权限。

  2. Task 状态的定义中,指定在调用跨账户资源之前由状态机担任的目标 IAM 角色。

  3. 修改目标 IAM 角色中的信任策略来允许源账户临时担任此角色。信任策略必须包含源账户中定义的状态机的 Amazon 资源名称(ARN)。此外,还要在目标 IAM 角色中定义调用 Amazon 资源的相应权限。

  4. 更新源账户的执行角色,使其包含担任目标 IAM 角色所需的权限。

有关示例,请参阅教程:访问跨账户资源 Amazon

注意

您可以配置状态机承担一个 IAM 角色,以便从多个 Amazon Web Services 账户访问资源。但是,状态机在给定时间只能承担一个 IAM 角色。

有关指定跨账户资源的 Task 状态定义示例,请参阅

在没有跨账户支持的情况下访问 Lambda 函数

如果您所在区域不提供 Amazon 资源的跨账户存取,请使用以下方法从另一个帐户调用 Lambda 函数。

Task 状态的 Resource 字段中,使用 arn:aws:states:::lambda:invoke 并传递参数中的 FunctionArn。与状态机关联的 IAM 角色必须拥有调用跨账户 Lambda 函数的正确权限:lambda:invokeFunction

{ "StartAt":"CallLambda", "States":{ "CallLambda":{ "Type":"Task", "Resource":"arn:aws:states:::lambda:invoke", "Parameters":{ "FunctionName":"arn:aws:lambda:us-west-2:123456789012:function:my-function" }, "End":true } } }

我无法看到从 .waitForTaskToken 状态传递的任务令牌。

您必须在 Task 状态的 Parameters 字段中传递任务令牌。例如,您可以使用与以下代码类似的内容。

{ "StartAt":"taskToken", "States":{ "taskToken":{ "Type":"Task", "Resource":"arn:aws:states:::lambda:invoke.waitForTaskToken", "Parameters":{ "FunctionName":"get-model-review-decision", "Payload":{ "token.$":"$$.Task.Token" }, }, "End":true } } }
注意

您可以尝试在任何 API 操作中使用 .waitForTaskToken。不过,有些 API 没有合适的参数。