【问题标题】:How to trace a lambda invokes a lambda with AWS X-Ray?如何使用 AWS X-Ray 跟踪 lambda 调用 lambda?
【发布时间】:2021-06-11 07:05:50
【问题描述】:

我有一个由 API Gateway 事件触发的 AWS Lambda 函数。 API 网关配置为使用 X-Ray。

由于 Lambda 跟踪配置默认为 PassTrough,它也显示在 X-Ray 中(服务地图等)。

调用的 Lambda 使用 node.js aws-sdk 调用另一个 lambda。如果我理解正确,则必须将跟踪 ID 传递给下一次调用,以便在 X-Ray 中也显示此 Lambda。在API of the SDK 中我没有找到这个选项。

const result = await lambda
        .invoke(lambdaParamsCreateUser)
        .promise()

我怎样才能做到这一点?如何跟踪原始请求的调用?

根据@Balu Vyamajala 的提示,我将 AWS-SDK 导入更改为以下内容:

import AWS from "aws-sdk";

import AwsXRay from "aws-xray-sdk-core";
const aws = AwsXRay.captureAWS(AWS);
export default aws;

我在为我的第二个功能开票时使用它:

import AWS from "aws";
const Lambda = AWS.Lambda;
// ...
const lambda = new Lambda({ region: "eu-central-1" });
const lambdaPromise = lambda
        .invoke({
            FunctionName: AUTH_CREATE_USER_FUNC,
            InvocationType: "RequestResponse",
            Qualifier: AUTH_CREATE_USER_FUNC_VERSION,
            Payload: JSON.stringify({
                eMail: eMail,
                device: device,
                customerId: customerId,
            }),
            LogType: "Tail",
        })
        .promise()

但是在 X-Ray 中没有调用链 :-(

https://imgur.com/wDMlNzb

我犯错了吗?

【问题讨论】:

    标签: node.js amazon-web-services aws-lambda aws-xray


    【解决方案1】:

    如果我们为两个 Lambda 函数启用 X-Ray,trace-id 会自动传递,并且对于两个 Lambda 都是相同的。

    在代码中,我们只需将 X-Ray 包裹在 aws-sdk 周围即可启用它

    JavaScript:

    const AWSXRay = require("aws-xray-sdk-core");
    const AWS = AWSXRay.captureAWS(require("aws-sdk"));    
    

    打字稿:

    import AWSXRay from 'aws-xray-sdk';
    import aws from 'aws-sdk';
    const AWS = AWSXRay.captureAWS(aws)
    

    这里有一个样本测试来确认。

    balu-test >> sample-test

    Lambda 1(balu-test):

    const AWSXRay = require("aws-xray-sdk-core");
    const AWS = AWSXRay.captureAWS(require("aws-sdk"));    
    const lambda = new AWS.Lambda();
    
    exports.handler = async function (event, context) {
      var params = {
        FunctionName: "sample-test",
        InvocationType: "RequestResponse",
        Payload: '{ "name" : "foo" }',
      };
      
      const response = await lambda.invoke(params).promise();
      console.log('response',response);
    
      return "sucess";
    };
    

    Lambda 2(样本测试):

    const AWSXRay = require("aws-xray-sdk-core");
    const AWS = AWSXRay.captureAWS(require("aws-sdk"));    
    let region = "us-east-1"
    let secretName = "SomeSecret"
    let secret
    let decodedBinarySecret    
    var client = new AWS.SecretsManager({
      region: region,
    });
    
    exports.handler = (event, context, callback) => {
      client.getSecretValue({ SecretId: secretName }, function (err, data) {
        if (err) {
          callback(err);
        } else {
          if ("SecretString" in data) {
            secret = data.SecretString;
          } else {
            let buff = new Buffer(data.SecretBinary, "base64");
            decodedBinarySecret = buff.toString("ascii");
          }
          callback(null, secret);
        }
      });
    };
    

    两个 Lambda 调用的 TraceId 相同,并且 X-Ray 指向相同的图。当从 Api-Gateway 调用第一个 api 时,也会发生同样的事情。首次生成 trace-id 并将其作为 http 标头传递给下游进程。

    【讨论】:

    • 嘿巴鲁。感谢您的回答。回到笔记本电脑后,我会立即检查。你知道如何用打字稿做到这一点吗?或者我必须自己弄清楚☺️
    • 我为打字稿添加了几行。 @thopaw
    • 非常感谢。我能够按照您描述的方式使用已检测的一种方式更改 AWS 开发工具包。但是调用的 lambda 没有显示在 X 射线中 :-( imgur.com/wDMlNzb
    • 用您建议的一些更改更新了我的问题
    • @thopaw 看起来不错,你对两个 lambda 函数都这样做了吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-29
    • 2021-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多