SQS队列绑定Lambda触发场景下如何捕获函数执行的error trace
SQS触发Lambda同步执行场景错误Trace捕获方案
方案1:函数内手动捕获异常投递自定义死信
- 在Lambda函数中增加全局异常捕获逻辑,捕获执行错误时构造包含三类信息的自定义消息:
- 原始SQS消息的全部元信息(
messageId、receiptHandle、消息体等) - 完整错误栈、错误类型、发生时间
- Lambda执行上下文信息(请求ID、函数版本、内存配置等)
- 原始SQS消息的全部元信息(
- 调用SQS SDK将自定义消息发送到预先创建的专用错误死信队列,之后再抛出异常触发SQS原生红rive策略即可。原生DLQ可作为备份,业务侧直接消费自定义死信队列即可获取完整错误信息
- 权限要求:需为Lambda执行角色添加对应SQS队列的
sqs:SendMessage权限
方案2:基于CloudWatch Logs关联错误与原始消息
- Lambda执行日志默认上报到CloudWatch Logs,错误栈会默认输出到日志流中
- 改造Lambda日志为结构化输出,打印错误日志时主动携带当前处理的SQS消息
messageId,输出示例:{ "level": "ERROR", "sqs_message_id": "<原始SQS消息唯一ID>", "error_trace": "<完整错误栈内容>", "lambda_request_id": "<Lambda执行请求ID>" } - 配置CloudWatch Logs订阅过滤器,匹配ERROR级别的日志,自动将携带
messageId的错误日志转存到目标存储或队列,后续可通过messageId与原生DLQ中的原始消息做关联匹配,获取完整的请求+错误信息。
方案3:利用批量失败响应携带错误摘要
如果开启了SQS事件源映射的ReportBatchItemFailures功能,可在返回批量失败项时,将错误信息编码后放到itemIdentifier字段透传:
- 开启配置:在
AWS::Lambda::EventSourceMapping资源中设置FunctionResponseTypes = ["ReportBatchItemFailures"] - 代码示例(Python):
import traceback def lambda_handler(event, context): batch_failures = [] for record in event["Records"]: try: # 业务处理逻辑 process_record(record) except Exception as e: # 拼接消息ID和错误栈,注意处理换行符 error_content = f"{record['messageId']}|{traceback.format_exc().replace('\\n', ' ')}" batch_failures.append({"itemIdentifier": error_content}) return {"batchItemFailures": batch_failures} - 该方案受限于
itemIdentifier字段最大1024字符的限制,适合错误栈较短的场景,超出长度需做截断处理。
内容的提问来源于stack exchange,提问作者Justin
相关产品推荐
相关产品推荐

