使用AWS X-Ray在本地调用AWS Lambda

9

有没有一种方法可以使用sam invoke local调用带有X-Ray的lambda?

根据PaulMaddox提到的想法,我尝试了以下步骤,但不知道是否误解:

  1. 按照文档在本地运行X-Ray Daemon(0.0.0.0:2000)
  2. 在我的lambda的template.yaml中设置ENV AWS_XRAY_DAEMON_ADDRESS:0.0.0.0:2000
  3. 调用函数,但仍然出现错误Missing AWS Lambda trace data for X-Ray。Expected _X_AMZN_TRACE_ID to be set

这是template.yaml设置的一部分,我使用环境变量设置了AWS_XRAY_DAEMON_ADDRESS

enter image description here

如果您能提供更多信息,那就太好了。

1个回答

5

我对SAM不是很熟悉,但是...

您需要设置_X_AMZN_TRACE_ID环境变量。目前,X-Ray Node SDK通过Lambda运行时启动代码和用户代码之间的交叉通信工作。

Lambda在其启动代码中启动片段,记录诸如时间和异常等信息,并将片段发送到X-Ray服务。然后,它通过设置_X_AMZN_TRACE_ID环境变量将跟踪ID/父ID/采样决策转发给用户代码。这允许SDK创建一个单独的子段,推断与原始段的连接,在服务端上“编织”到原始段中,而不是直接相关。两者都异步地在带外发送。

_X_AMZN_TRACE_ID变量的格式与此处的跟踪标头相同,如此处所述:https://docs.aws.amazon.com/xray/latest/devguide/xray-concepts.html#xray-concepts-tracingheader

如果要通过Daemon将跟踪发送到X-Ray服务,则需要找出如何让SAM最初构建此Lambda片段并在导入SDK之前设置_X_AMZN_TRACE_ID。

由于SDK自动检测到Lambda的存在(就像我理解的那样,SAM模拟了Lambda),因此您必须在导入SDK之前设置_X_AMZN_TRACE_ID变量。这有点像一个进退两难的局面,因为您需要在构造Lambda段之前(以非Lambda模式)导入SDK才能填充_X_AMZN_TRACE_ID。

问题出在这里:https://github.com/aws/aws-xray-sdk-node/blob/master/packages/core/lib/aws-xray.js#L361

如果将SDK切换到LOG_ERROR模式(忽略Lambda错误),创建并发送Lambda段(只需手动创建一个段,将生成的ID / Parent ID / Sampling加载到_X_AMZN_TRACE_ID中,然后关闭该段),然后清除缓存/重新导入SDK,那么应该可以解决问题。

否则,我怀疑SAM端可能需要一些工作来内置此功能。但是,希望这个解决方法有效。


1
谢谢您清晰的解释!我会尝试您提供的想法,这真的是一个很大的帮助。 - willisc
请参考以下链接:https://github.com/aws/aws-xray-sdk-node/issues/383#issuecomment-861603939 - Eray

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接