使用 SNS 的 Kinesis 触发器的 AWS Lambda 错误处理
AWS Lambda Error Handling for Kinesis Trigger using SNS
我已将 SNS 作为我的 Lambda 函数中 Kinesis 数据流触发器失败时的目标。在任何类型的失败中,我都会收到一封格式如下的电子邮件:
{"requestContext":{"requestId":"xxx","functionArn":"xxx","condition":"RetryAttemptsExhausted","approximateInvokeCount":2},"responseContext":{"statusCode":200,"executedVersion":"$LATEST","functionError":"Unhandled"},"version":"1.0","timestamp":"2021-06-30T15:19:20.847Z","KinesisBatchInfo":{"shardId":"shardId-xxx","startSequenceNumber":"xxx","endSequenceNumber":"xxxx","approximateArrivalOfFirstRecord":"xxx","approximateArrivalOfLastRecord":"xxx","batchSize":100,"streamArn":"xxx"}}
在这里,我收到 functionError
作为 Unhandled
。而我想知道 Lambda 失败的确切原因。此 SNS 消息既不包含错误消息,也不包含 lambda 执行 ARN 或我可以查看以了解错误详细信息的日志流。在我的 Lambda 代码中,我正在执行如下操作:
def lambda_handler(event, context):
try:
for record in event['Records']:
#Kinesis data is base64 encoded so decoding here
payload = base64.b64decode(record["kinesis"]["data"])
except Exception as e:
print(e)
raise e
堆栈 trace/error 确实打印在 CloudWatch Logs 中,但 SNS 消息不包含任何错误信息。有人可以指导我如何在此 SNS 消息中包含错误详细信息,或者是否需要对代码进行一些更改以将错误信息包含在 SNS 消息中。感谢您在这方面的任何帮助!
您需要自己动手。您必须自己在代码中发送此类消息,而不是使用内置 lambda 目标。因此,在您的 except
块中,您必须向队列提供 sns 消息:
except Exception as e:
print(e)
# "manually" publish msg with the error to your SNS.
raise e
我已将 SNS 作为我的 Lambda 函数中 Kinesis 数据流触发器失败时的目标。在任何类型的失败中,我都会收到一封格式如下的电子邮件:
{"requestContext":{"requestId":"xxx","functionArn":"xxx","condition":"RetryAttemptsExhausted","approximateInvokeCount":2},"responseContext":{"statusCode":200,"executedVersion":"$LATEST","functionError":"Unhandled"},"version":"1.0","timestamp":"2021-06-30T15:19:20.847Z","KinesisBatchInfo":{"shardId":"shardId-xxx","startSequenceNumber":"xxx","endSequenceNumber":"xxxx","approximateArrivalOfFirstRecord":"xxx","approximateArrivalOfLastRecord":"xxx","batchSize":100,"streamArn":"xxx"}}
在这里,我收到 functionError
作为 Unhandled
。而我想知道 Lambda 失败的确切原因。此 SNS 消息既不包含错误消息,也不包含 lambda 执行 ARN 或我可以查看以了解错误详细信息的日志流。在我的 Lambda 代码中,我正在执行如下操作:
def lambda_handler(event, context):
try:
for record in event['Records']:
#Kinesis data is base64 encoded so decoding here
payload = base64.b64decode(record["kinesis"]["data"])
except Exception as e:
print(e)
raise e
堆栈 trace/error 确实打印在 CloudWatch Logs 中,但 SNS 消息不包含任何错误信息。有人可以指导我如何在此 SNS 消息中包含错误详细信息,或者是否需要对代码进行一些更改以将错误信息包含在 SNS 消息中。感谢您在这方面的任何帮助!
您需要自己动手。您必须自己在代码中发送此类消息,而不是使用内置 lambda 目标。因此,在您的 except
块中,您必须向队列提供 sns 消息:
except Exception as e:
print(e)
# "manually" publish msg with the error to your SNS.
raise e