本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
服务集成故障排除
在下游服务中,我的作业已经完成,但在 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.sync
和 startExecution.sync:2
。两者都将等待嵌套状态机完成,但它们返回不同的 Output
格式。您可以使用 startExecution.sync:2
在 Output
下返回 JSON 输出。
我无法从另一个账户调用 Lambda 函数。
通过跨账户支持访问 Lambda 函数
如果您所在区域提供 Amazon 资源的跨账户存取,请使用以下方法从另一个帐户调用 Lambda 函数。
要在工作流中调用跨账户资源,请执行以下操作:
在包含资源的目标账户中创建 IAM 角色。此角色向包含状态机的源账户授予访问目标账户资源的权限。
在
Task
状态的定义中,指定在调用跨账户资源之前由状态机担任的目标 IAM 角色。修改目标 IAM 角色中的信任策略来允许源账户临时担任此角色。信任策略必须包含源账户中定义的状态机的 Amazon 资源名称(ARN)。此外,还要在目标 IAM 角色中定义调用 Amazon 资源的相应权限。
更新源账户的执行角色,使其包含担任目标 IAM 角色所需的权限。
有关示例,请参阅教程:访问跨账户资源 Amazon。
注意
您可以配置状态机承担一个 IAM 角色,以便从多个 Amazon Web Services 账户访问资源。但是,状态机在给定时间只能承担一个 IAM 角色。
在没有跨账户支持的情况下访问 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 没有合适的参数。