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

时间:2018-06-15 02:53:16

标签: amazon-web-services aws-lambda aws-sam-cli aws-xray

有没有办法使用sam invoke local

使用X-Ray调用lambda

根据the idea which PaulMaddox mentioned, 我已经尝试了下面的步骤,我不知道我是否误解了:

  1. 按照document
  2. 在本地运行X-Ray守护程序(0.0.0.0:2000)
  3. 在我的lambda的template.yaml中设置ENV AWS_XRAY_DAEMON_ADDRESS: 0.0.0.0:2000
  4. 调用该函数,但仍然出现错误Missing AWS Lambda trace data for X-Ray. Expected _X_AMZN_TRACE_ID to be set
  5. 以下是template.yaml设置的一部分,我使用环境变量来设置AWS_XRAY_DAEMON_ADDRESS

    enter image description here

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

1 个答案:

答案 0 :(得分:1)

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

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

Lambda在其启动代码中启动该段,记录时间和异常等信息,并将该段发送到X射线服务。然后,它通过设置_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

如果要通过守护程序将跟踪发送到X射线服务,您需要弄清楚如何让SAM最初构建此Lambda段并在导入SDK之前设置_X_AMZN_TRACE_ID。

由于SDK自动检测Lambda的存在(据我所知,SAM模仿),​​您必须在导入SDK之前设置_X_AMZN_TRACE_ID变量。其中,有点像catch-22,因为你需要导入SDK(在非Lambda模式下)来构造Lambda段,然后才能填充_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 /父ID /采样加载到_X_AMZN_TRACE_ID然后关闭该段)然后清除之后缓存/重新导入SDK,那应该可以。

否则,我怀疑在SAM端可能有一些工作要内置它。但是,希望这可以解决这个问题。