AWS Step Functions Lambda错误处理无法传递objectKey至S3任务
解决Step Functions错误处理中objectKey传递失败的问题
问题根源分析
从报错信息和errorInfo结构可以明确两个核心问题:
- Lambda抛出的自定义错误对象被Step Functions自动序列化后,
objectKey被包裹在字符串格式的Cause字段中,而非直接作为顶级属性存在 ErrorPass状态的InputPath和ResultPath配置错误,导致后续状态丢失了原始上下文,且无法正确解析Cause中的JSON字符串
修复步骤
1. 修正Lambda错误抛出逻辑
Lambda抛出错误时,需确保自定义字段能被Step Functions正确识别。不要直接抛出普通对象,而是创建Error实例并附加自定义属性:
export async function processRecords(event: { bucket: string, objectKey: string }): Promise<ExternalSubmissionContent> { // ... 业务逻辑 ... catch (error) { console.error(`Error processing S3 event: ${error}`); const errorMessage = error instanceof Error ? error.message : JSON.stringify(error); // 创建自定义Error实例,附加objectKey属性 const customError = new Error(`Error processing S3 event: ${errorMessage}`); customError.name = "ProcessingError"; // 自定义错误类型 (customError as any).objectKey = event.objectKey; // 附加目标objectKey throw customError; } }
2. 调整Step Functions的Error Pass状态配置
移除错误的InputPath,改用ResultSelector解析Cause中的JSON字符串,同时保留原始上下文:
"Error": { "Type": "Pass", "ResultSelector": { "originalContext.$": "$", "errorDetails.$": "States.StringToJson($.errorInfo.Cause)" }, "ResultPath": "$", "Next": "CopyObjectToFailed" },
3. 修正CopyObjectToFailed任务的参数引用
通过解析后的errorDetails获取objectKey,确保S3 CopyObject的参数格式正确:
"CopyObjectToFailed": { "Type": "Task", "Parameters": { "Bucket": "processing-bucket", "CopySource.$": "States.Format('processing-bucket/Pending/{}', $.errorDetails.objectKey)", "Key.$": "States.Format('Failed/{}', $.errorDetails.objectKey)" }, "Resource": "arn:aws:states:::aws-sdk:s3:copyObject", "Next": "FailureDeleteObjectFromPending" },
备选方案(无需修改Lambda)
如果无法调整Lambda代码,可直接在Step Functions中解析Cause字符串:
// 调整Error状态,移除InputPath "Error": { "Type": "Pass", "ResultPath": "$", "Next": "CopyObjectToFailed" }, // 修正CopyObjectToFailed的参数 "CopyObjectToFailed": { "Type": "Task", "Parameters": { "Bucket": "processing-bucket", "CopySource.$": "States.Format('processing-bucket/Pending/{}', States.StringToJson($.errorInfo.Cause).objectKey)", "Key.$": "States.Format('Failed/{}', States.StringToJson($.errorInfo.Cause).objectKey)" }, "Resource": "arn:aws:states:::aws-sdk:s3:copyObject", "Next": "FailureDeleteObjectFromPending" },
验证要点
- 触发错误流程后,检查
CopyObjectToFailed状态的输入是否包含正确解析的objectKey - 确认S3文件能成功从
Pending目录复制到Failed目录
内容的提问来源于stack exchange,提问作者Sara N
相关产品推荐
相关产品推荐

