You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS Step Functions Lambda错误处理无法传递objectKey至S3任务

解决Step Functions错误处理中objectKey传递失败的问题

问题根源分析

从报错信息和errorInfo结构可以明确两个核心问题:

  1. Lambda抛出的自定义错误对象被Step Functions自动序列化后,objectKey被包裹在字符串格式的Cause字段中,而非直接作为顶级属性存在
  2. Error Pass状态的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 03:13:20