在 SQS 消息触发的 Lambda 处跟踪 AWS API 网关 request_id
Track AWS API Gateway request_id at Lambda triggered by SQS message
我们有一个 AWS API 网关端点,其唯一目的是在 SQS 主题中创建一条最终由 Lambda 函数处理的消息。所以:
API 网关端点处理程序 -> SQS 主题消息 -> SQS Lambda 处理程序
我们想开始关联 activity API 网关端点处理程序和 Lambda,方法是记录来自 API 网关处理程序的 context.aws_request_id SQS Lambda 处理程序。问题是如何最好地将 API 网关的 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 网关处理程序中找到嵌入额外 'event' 或 'context' 信息的方法,然后最终由 SQS lambda 处理程序读取?
谢谢
这几乎是 REST api 上请求转换的教科书用例。基本上,您可以将模板转换应用于传入请求,例如,可以向包含 header 值的消息 body 添加一个键,以便它们继续通过 sqs 将其传递到 lambda
有关详细信息,请参阅 https://docs.aws.amazon.com/apigateway/latest/developerguide/rest-api-data-transformations.html
我们有一个 AWS API 网关端点,其唯一目的是在 SQS 主题中创建一条最终由 Lambda 函数处理的消息。所以:
API 网关端点处理程序 -> SQS 主题消息 -> SQS Lambda 处理程序
我们想开始关联 activity API 网关端点处理程序和 Lambda,方法是记录来自 API 网关处理程序的 context.aws_request_id SQS Lambda 处理程序。问题是如何最好地将 API 网关的 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 网关处理程序中找到嵌入额外 'event' 或 'context' 信息的方法,然后最终由 SQS lambda 处理程序读取?
谢谢
这几乎是 REST api 上请求转换的教科书用例。基本上,您可以将模板转换应用于传入请求,例如,可以向包含 header 值的消息 body 添加一个键,以便它们继续通过 sqs 将其传递到 lambda
有关详细信息,请参阅 https://docs.aws.amazon.com/apigateway/latest/developerguide/rest-api-data-transformations.html