Step Functions处理特定sdb文件时任务提交后失败排查
问题背景
- 刚接触Step Functions,若问题表述存在歧义可随时补充细节信息
- 实现目标:搭建文件上传后自动触发Step Functions、调用Lambda函数执行处理任务的工作流
- 故障现象:Step Functions关联的Lambda处理其他类型/名称的文件均运行正常,仅处理名为
xyz.sdb的特定文件时,任务提交后立即失败
已完成操作
- 已从控制台获取任务提交、任务失败两个阶段的运行日志
任务提交阶段日志:
{ "resourceType": "lambda", "resource": "invoke.waitForTaskToken", "output": { "ExecutedVersion": "$LATEST", "Payload": null, "SdkHttpMetadata": { "AllHttpHeaders": { "X-Amz-Executed-Version": [ "$LATEST" ], "x-amzn-Remapped-Content-Length": [ "0" ], "Connection": [ "keep-alive" ], "x-amzn-RequestId": [ "xxxxxxxxx" ], "Content-Length": [ "4" ], "Date": [ "Thu, 14 Jul 2022 02:41:08 GMT" ], "X-Amzn-Trace-Id": [ "root=1-xxxxxx-xxxxxa3e5ed0cb1d6ff;sampled=0" ], "Content-Type": [ "application/json" ] }, "HttpHeaders": { "Connection": "keep-alive", "Content-Length": "4", "Content-Type": "application/json", "Date": "Thu, 14 Jul 2022 02:41:08 GMT", "X-Amz-Executed-Version": "$LATEST", "x-amzn-Remapped-Content-Length": "0", "x-amzn-RequestId": "xxxxxx-d73a-499f-8e3c-f9ca904f94a0", "X-Amzn-Trace-Id": "root=1-xxxx-4f64750d7ea3e5ed0cb1d6ff;sampled=0" }, "HttpStatusCode": 200 }, "SdkResponseMetadata": { "RequestId": "xxxxxxxxx-d73a-499f-8e3c-xxxxxx" }, "StatusCode": 200 }, "outputDetails": { "truncated": false } }
任务失败阶段日志:
{ "resourceType": "lambda", "resource": "invoke.waitForTaskToken", "error": null, "cause": null }
- 所有Step Functions相关资源通过AWS CDK部署,核心部署代码如下:
const sdbWholeFileExtractionFunction = new LambdaFunction( this, 'SdbWholeFileExtractionFunction', { functionProps: { code: lambda.Code.fromAsset('dist/workflow/task'), handler: 'sdb-whole-file-extraction.handle', environment: { CLUSTER: cluster.clusterArn, SUBNET_IDS: JSON.stringify(subnetIds), TASK_DEFINITION: taskDefinition.family, CONTAINER_NAME: container.containerName, }, }, targetTopic: props.targetTopic, } ) runTaskPolicy.attachToRole( sdbWholeFileExtractionFunction.lambdaFunction.role! ) const sdbWholeFileExtractionInvocation = new tasks.LambdaInvoke( this, 'SdbWholeFileExtractionInvocation', { lambdaFunction: sdbWholeFileExtractionFunction.lambdaFunction, integrationPattern: sfn.IntegrationPattern.WAIT_FOR_TASK_TOKEN, payload: sfn.TaskInput.fromObject({ bookId: sfn.JsonPath.stringAt('$.bookData.bookId'), prefix: sfn.JsonPath.stringAt('$.bookData.prefix'), isDiffPackageUploaded: sfn.JsonPath.stringAt( '$.bookData.isDiffPackageUploaded' ), token: sfn.JsonPath.taskToken, }), } )
- 已查阅相关公开技术讨论,暂无法确认讨论中提及的CDK权限配置问题是否为本次
xyz.sdb文件处理失败的诱因。
排查指引
你当前使用的是WAIT_FOR_TASK_TOKEN集成模式,该模式下Step Functions标记任务失败且error、cause均为空,基本可以归为三类原因:Lambda启动后执行逻辑崩溃未发送回调、Lambda未正确获取到Task Token、回调请求发送失败。由于其他文件处理全量正常,可直接排除全局配置类问题,按以下优先级排查即可:
- 优先排查Lambda执行日志,不要仅依赖Step Functions控制台输出
- 打开Lambda控制台找到对应
sdb-whole-file-extraction函数,切到监控页签,筛选处理xyz.sdb的对应时间段,查看是否有调用错误、超时、内存溢出、临时存储不足类的指标异常 - 点进异常调用对应的CloudWatch日志逐行排查执行栈:当前Step Functions拿到200状态码说明Lambda已经成功启动,大概率是代码处理sdb文件的分支逻辑遇到特定格式/大小/命名的文件时,抛出了未捕获异常,进程退出前既没拿到Task Token,也没向Step Functions发送回调,等Lambda执行结束后Step Functions等不到回调就会标记任务失败,且错误字段全为空
- 重点核对代码逻辑:是否有针对sdb文件的硬编码文件名/格式校验规则,遇到不符合预期的文件直接抛出异常但未做捕获;是否
xyz.sdb文件大小、结构超出代码预设的处理阈值,导致进程直接崩溃。
- 打开Lambda控制台找到对应
- 核对Task Token的传递与回调逻辑
- 你当前的Payload是把Token放在
token字段下,确认Lambda代码中解析Task Token的路径是否正确,是否存在字段名写错、Payload结构解析失败,导致拿不到Token、后续回调逻辑直接走异常分支的情况 - 核对代码所有异常分支:只要代码逻辑中能拿到Token,所有失败分支都应该调用
SendTaskFailure接口且传入明确的error、cause参数,当前日志中两个字段全为空,要么是没走到回调逻辑,要么是回调时未传这两个参数。
- 你当前的Payload是把Token放在
- 兜底核对配置项(其他文件正常时该类问题概率极低)
- 确认Lambda绑定的执行角色是否包含
states:SendTaskSuccess、states:SendTaskFailure、states:SendTaskHeartbeat权限 - 如果Lambda部署在VPC内,确认VPC是否配置了NAT网关或Step Functions服务VPC端点,保证Lambda可以正常发送回调请求
- 确认Lambda绑定的执行角色是否包含
- 最快定位方式:将出问题的
xyz.sdb下载到本地,用和Lambda完全一致的运行时、内存配置直接运行处理逻辑,可快速复现代码层面的崩溃问题。
你初步判断故障为Lambda处理特定sdb文件时异常导致的方向完全正确,这类仅特定文件触发的故障,问题点一定在单文件处理的分支逻辑中,和工作流全局配置无关。
内容的提问来源于stack exchange,提问作者Jatin Mehrotra
相关产品推荐
相关产品推荐

