AWS Lambda自定义错误消息实现求助:执行失败时拼接输入值与错误信息并存储异常
解决AWS Lambda自定义错误消息与异常存储问题
我来帮你搞定这个自定义错误消息的需求,同时把异常和输入值的存储逻辑也加上,先看Node.js的具体实现:
Node.js 解决方案
首先先修复你原代码里的一个小问题:scan操作不支持KeyConditionExpression,这个参数是给query用的,保留会直接报错,先去掉。然后在错误分支里完成自定义消息拼接和异常存储:
var AWS = require('aws-sdk'); var mydocumentClient = new AWS.DynamoDB.DocumentClient(); exports.handler = function (event, context, callback) { // 先提取输入的关键数据,做好空值兜底避免额外报错 const inputData = { EventID: event.WorkflowDetail?.EventID || '未知ID', DataflowID: event.WorkflowDetail?.DataflowID || '未知数据流ID' }; var params = { TableName: 'TransactionLog', FilterExpression : 'EventID = :EventID and Status = :Status', ExpressionAttributeValues: { ":EventID": inputData.EventID, ":Status": "progress" }, ProjectionExpression: "EventID,DataflowID,Status" }; mydocumentClient.scan(params, function (err, data){ if (err) { // 1. 拼接自定义错误消息 const customError = new Error(`${err.message} "${JSON.stringify(inputData)}"`); // 2. 把异常和输入值存储到错误日志表(需提前创建ErrorLog表,主键设为ErrorID) const errorLogParams = { TableName: 'ErrorLog', Item: { ErrorID: context.awsRequestId, // 用Lambda请求ID做唯一标识 InputData: inputData, OriginalErrorMessage: err.message, Timestamp: new Date().toISOString(), FullErrorDetails: JSON.stringify(err) } }; // 执行错误日志存储,无论存储成功与否都返回自定义错误 mydocumentClient.put(errorLogParams, (putErr) => { if (putErr) { console.error('存储错误日志失败:', putErr); } callback(customError, null); }); } else { callback(null, data); } }); }
关键说明
- 用
JSON.stringify(inputData)把输入的EventID和DataflowID直接拼到错误消息里,和你期望的格式一致 - 新增了
ErrorLog表存储错误信息,包含输入数据、原始错误、时间戳等,方便后续排查问题 - 给输入数据加了空值兜底,避免因为
event.WorkflowDetail不存在导致额外报错 - 修复了原代码中
scan使用KeyConditionExpression的错误
Python 实现建议
如果后续想转用Python,思路是一样的,用try-except捕获异常,拼接消息并存储日志:
import boto3 import json from datetime import datetime # 初始化DynamoDB客户端 dynamodb = boto3.resource('dynamodb') transaction_log_table = dynamodb.Table('TransactionLog') error_log_table = dynamodb.Table('ErrorLog') def lambda_handler(event, context): try: # 提取输入数据,做好空值处理 input_data = { 'EventID': event.get('WorkflowDetail', {}).get('EventID', '未知ID'), 'DataflowID': event.get('WorkflowDetail', {}).get('DataflowID', '未知数据流ID') } # 执行扫描操作 response = transaction_log_table.scan( FilterExpression='EventID = :event_id and Status = :status', ExpressionAttributeValues={ ':event_id': input_data['EventID'], ':status': 'progress' }, ProjectionExpression='EventID, DataflowID, Status' ) return { 'statusCode': 200, 'body': response['Items'] } except Exception as e: # 拼接自定义错误消息 custom_error_msg = f"{str(e)} {json.dumps(input_data)}" # 存储错误日志 try: error_log_table.put_item( Item={ 'ErrorID': context.aws_request_id, 'InputData': input_data, 'OriginalErrorMessage': str(e), 'Timestamp': datetime.utcnow().isoformat(), 'FullErrorDetails': str(e) } ) except Exception as put_e: print(f"存储错误日志失败: {str(put_e)}") # 抛出自定义异常,返回给调用方 raise Exception(custom_error_msg)
额外注意事项
- 确保Lambda的执行角色有
ErrorLog表的PutItem权限,否则存储日志会失败 - 如果你的
TransactionLog表数据量较大,scan操作会比较低效,建议改用query(如果EventID是分区键的话) - 可以根据需求调整
ErrorLog表的字段,比如添加Lambda函数名、请求上下文等信息
内容的提问来源于stack exchange,提问作者SQLMike
相关产品推荐
相关产品推荐

