在AWS Lambda handler中调用SQS时,在发送的消息中添加保留头X-Amzn-Trace-Id以启用分布式请求跟踪。但是,有时可能会遇到以下错误消息:“Message contains reserved attribute name 'X-Amzn-Trace-Id'”. 这是由于AWS SDK将该头部视为保留头部,不能在发送的消息中添加。此错误会影响AWS Lambda函数与SQS队列之间的通信。要解决此问题,请在发送消息时,使用MessageAttributes参数代替MessageBody参数,示例如下:
import boto3
sqs = boto3.resource('sqs')
def handler(event, context):
queue = sqs.get_queue_by_name(QueueName='QUEUE_NAME')
message = {
'MessageAttributes': {
'X-Amzn-Trace-Id': {
'DataType': 'String',
'StringValue': 'TRACE_ID_HERE'
}
},
'MessageBody': 'BODY_TEXT'
}
response = queue.send_message(MessageBody='', MessageAttributes=message['MessageAttributes'])
return response
在这个示例中,我们创建了一个名为message的字典,其中包含了传递到SQS的消息内容以及MessageAttributes。这个字典传递给了send_message()方法,并且MessageBody参数被改为一个空字符串,而MessageAttributes包含了X-Amzn-Trace-Id保留头。这样,在AWS SDK中就不会将X-Amzn-Trace-Id视为保留头部了,从而避免了此错误的出现。