如何解决如何使用 AWS X-Ray 跟踪 lambda 调用 lambda?
我有一个由 API 网关事件触发的 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 中没有调用链 :-(
我有没有搞错?
解决方法
如果我们为两个 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 >> 样品测试
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 时会发生同样的事情。第一次生成 trace-id 并作为 http 标头传递给下游进程。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。