首页 > 解决方案 > 节点:被其他 lambda 函数调用时请求上下文

问题描述

我正在构建一个由多个 lambda 函数组成的应用程序,它将成为现有应用程序环境的一部分。

我对此的问题:我不知道如何以一种简单的方式使用唯一的跟踪 id 扩展我的日志,以便所有关于一个事务的日志都使用相同的 id 记录。

要对其中一个过程提供一些见解:

所以整个流程:some other app--Request with TraceID--> ApiGateway-> lambda #1-> SQS-> lambda #2-> lambda #1

到目前为止 ,我正在使用request-context来跟踪请求。但是,如果你有一个有效的请求上下文,那就行了。lambda #1因此,在最后阶段调用它之后,我无法使用正确的跟踪 id 登录lambda #2(即在其请求中提交跟踪 id)。

的调用点lambda #1如下所示:

export function handler(event: any, context: any) {
  if (event.targetAction) {
    switch (event.targetAction as TargetAction) {
      // invocation by lambda #2 will end up here
      // we got no request context for express
      case TargetAction.FINISH_TRANSACTION:
        /** do some other work **/
        return;
      default:
      /** **/
    }
  }
  return awsServerlessExpress.proxy(server, event, context);
}

在这种情况下,如何将我的 trace-id 获取到日志中?

其他想法

对于这方面的每一个帮助或想法,我都感到非常高兴,即使它指向了我完全不同的方向。

编辑

现在我正在使用运行良好的解决方法。我创建了一个供内部使用的路由器。如果有人感兴趣,这就是处理程序的样子:

export function handler(event: any, context: any) {
if (event.targetAction) {
  switch (event.targetAction as TargetAction) {
     case TargetAction.UPDATE_TRANSACTION:
        const updateEvent: ExpressProxyEvent = {
           path: '/internal/update-transaction',
           headers: {
              'Content-Type': 'application/json',
              'x-trace-id': event.xtraceId,
              'x-internal-router-secret': Constants.INTERNAL_ROUTER_SECRET
           },
           body: JSON.stringify(event),
           httpMethod: 'POST'
         };
         event = updateEvent;
         break;
      case /** **/
    }
    return awsServerlessExpress.proxy(server, event, context);
}

这样,当由另一个 lambda 函数直接调用时,traceId 可以在请求上下文中间件中设置(事件也可以在 中正确创建lambda #2,但它需要知道内部路由器的路径和方法lambda #1)。

尽管如此,我仍然对独立解决方案感兴趣。

标签: node.jsexpressaws-lambda

解决方案


推荐阅读