在 SQS 消息触发的 Lambda 上跟踪 AWS API Gateway request_id

Posted

技术标签:

【中文标题】在 SQS 消息触发的 Lambda 上跟踪 AWS API Gateway request_id【英文标题】:Track AWS API Gateway request_id at Lambda triggered by SQS message 【发布时间】:2021-12-07 10:43:03 【问题描述】:

我们有一个 AWS API Gateway 端点,其唯一目的是在 SQS 主题中创建一条消息,最终由 Lambda 函数处理。所以:

API 网关端点处理程序 -> SQS 主题消息 -> SQS Lambda 处理程序

我们希望通过在 SQS Lambda 处理程序中记录来自 API Gateway 处理程序的 context.aws_request_id 来开始关联 API Gateway 端点处理程序和 Lambda 之间的活动。问题是如何最好地将 API Gateway 的 aws_request_id 传递给 SQS Lambda?

我们有一种解决方案,当我们调用 sqs send_message 函数时,我们将 aws_request_id 作为 MessageBody 的一部分传递:

msg_body = [some data]
msg_body['aws_request_id'] = context.aws_request_id
response = queue.send_message(MessageBody=msg_body, MessageGroupId=msg_group_id, MessageDeduplicationId=msg_deduplication_id)

最后在 SQS Lambda 处理程序中,我们可以检索网关的 request_id:

def my_sqs_handler(event, context):
  records = event.get('Records')

  for record in records:
    log.info('Processing SQS message: %s', record['messageId'])
    body = json.loads(record.get('body'))
    apigw_request_id = json.loads(record.get('aws_request_id'))
    log.info('API Gateway request-id: %s', apigw_request_id)
    ...

这可行,但似乎并不干净,因为 request_id 被嵌入到 sqs 消息正文中。似乎应该有一种更简洁的机制来通过传递给 sqs lambda 处理程序的事件或上下文对象来获取它。有没有人设法在 API Gateway 处理程序中嵌入额外的“事件”或“上下文”信息,然后最终由 SQS lambda 处理程序读取?

谢谢

【问题讨论】:

【参考方案1】:

这几乎是 REST API 上请求转换的教科书用例。基本上,您可以对传入请求应用模板转换,例如,可以向包含标头值的消息正文添加一个键,以便它们继续通过 sqs 到 lambda

更多信息请见https://docs.aws.amazon.com/apigateway/latest/developerguide/rest-api-data-transformations.html

【讨论】:

以上是关于在 SQS 消息触发的 Lambda 上跟踪 AWS API Gateway request_id的主要内容,如果未能解决你的问题,请参考以下文章

消息发布到 SQS 时如何触发 lambda?

当消息存在于 SQS 队列中时触发 AWS 中的 Lambda 函数

无服务器中的 SQS 触发 lambda 存在延迟

将消息属性从 lambda 添加回 SQS DLQ

AWS Lambda 在向 SQS 发送消息之前完成

从 AWS Lambda 读取 SQS 队列