簡體   English   中英

如何使用 AWS X-Ray 跟蹤 lambda 調用 lambda?

[英]How to trace a lambda invokes a lambda with AWS X-Ray?

我有一個由 API 網關事件觸發的 AWS Lambda function。 API 網關配置為使用 X-Ray。

由於 Lambda 跟蹤配置默認為 PassTrough,因此它也顯示在 X-Ray 中(服務 map 等)。

調用的 Lambda 使用 node.js aws-sdk 調用另一個 lambda。 如果我理解正確,則必須將跟蹤 ID 傳遞給下一次調用,以便在 X 射線中也顯示此 Lambda。 SDK 的 API 中,我沒有找到任何選項。

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;

我在為我的第二個 function 開具發票時使用它,如下所示:

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

我犯錯了嗎?

如果我們為兩個 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"));    

Typescript:

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

這是一個樣本測試來確認。

balu-test >> sample-test

Lambda 1(巴魯測試):

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);
    }
  });
};

TraceId 是相同的,並且 X-Ray 對於 Lambda 調用都指向相同的圖形。 當從 Api-Gateway 調用第一個 api 時,也會發生同樣的事情。 第一次生成跟蹤 ID 並作為 http header 傳遞到下游進程。

在此處輸入圖像描述

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM