AWS lambda nodejs показывает ошибку при использовании X-RAY

У меня есть следующий код:

var AWSXRay = require('aws-xray-sdk');
    var AWS = AWSXRay.captureAWS(require('aws-sdk'));
    const client = AWSXRay.captureAWSClient(new AWS.DynamoDB.DocumentClient({region : 'eu-west-1'}));
    exports.handler = function(event, context, callback) {

        AWSXRay.captureFunc('annotations', function(subsegment){
        subsegment.addAnnotation('User', **);
        subsegment.addAnnotation('Name', **);
      });

         var params = {
            TableName: "****",
            ** all params **
            };
     client.query(params, function(err, data) {
       if (err) console.log(err, err.stack); // an error occurred
       else{
            callback(null,data);
            }
        });
    }

При выполнении приведенного выше кода возникает следующая ошибка:

Response:
{
  "errorMessage": "service.customizeRequests is not a function",
  "errorType": "TypeError",
  "stackTrace": [
    "Object.<anonymous> (/var/task/index.js:5:24)",
    "Module._compile (module.js:570:32)",
    "Object.Module._extensions..js (module.js:579:10)",
    "Module.load (module.js:487:32)",
    "tryModuleLoad (module.js:446:12)",
    "Function.Module._load (module.js:438:3)",
    "Module.require (module.js:497:17)",
    "require (internal/module.js:20:19)"
  ]
}

Ниже приведены журналы работы:

Function Logs:
START RequestId: Version: $LATEST
module initialization error: TypeError
    at Object.captureAWSClient (/var/task/node_modules/aws-xray-sdk-core/lib/patchers/aws_p.js:55:11)
    at Object.<anonymous> (/var/task/index.js:5:24)
    at Module._compile (module.js:570:32)
    at Object.Module._extensions..js (module.js:579:10)
    at Module.load (module.js:487:32)
    at tryModuleLoad (module.js:446:12)
    at Function.Module._load (module.js:438:3)
    at Module.require (module.js:497:17)
    at require (internal/module.js:20:19)
END

Как мне решить эту проблему?


person ABCD    schedule 30.10.2018    source источник
comment
Это может быть проблема, вызванная тем, как клиент документа DynamoDB создает экземпляр реального клиента низкого уровня. Вы видите ту же ошибку, если меняете клиента на другую службу, например S3 или EC2? Если нет, существует обходной путь, который потенциально может сработать для вас, но сообщите мне, если это не так: forum.aws.amazon.com/thread.jspa?messageID=821510󈤆   -  person haotian465    schedule 31.10.2018
comment
да, спасибо, что у меня сработало .... Спасибо .... @ haotian465   -  person ABCD    schedule 01.11.2018


Ответы (3)


Публикация краткосрочного обходного пути здесь для лучшей наглядности.

const ddbClient = AWSXray.captureAWSClient(new AWS.DynamoDB({...}));
const client = new AWS.DynamoDB.DocumentClient({
  service: ddbClient
});
client.service = ddbClient;

См. Некоторые аргументы и обсуждение здесь https://forums.aws.amazon.com/thread.jspa?messageID=821510󈤆

person haotian465    schedule 05.11.2018

клиент не имеет общедоступной переменной .service. Тем не менее, это работает для меня:

import * as AWS  from 'aws-sdk'
import * as AWSXRay from 'aws-xray-sdk'
import { DocumentClient } from 'aws-sdk/clients/dynamodb'

export class DynDBAccess {
    private readonly docClient: DocumentClient // = new AWS.DynamoDB.DocumentClient(),

    constructor(
        private enableAWSX:boolean,      
    ){
        if(this.enableAWSX)
        {
           logger.info('AWSX: enable')
           const ddbClient = AWSXRay.captureAWSClient(new AWS.DynamoDB({
            ////Uncomment below to use serverless-dynamodb-local
            //region: 'localhost',
            //endpoint: 'http://localhost:8001',
            //accessKeyId: 'DEFAULT_ACCESS_KEY',  // needed if you don't have aws credentials at all in env
            //secretAccessKey: 'DEFAULT_SECRET',
           }));
           this.docClient = new AWS.DynamoDB.DocumentClient({
            service: ddbClient
          });

        }
...

person martin    schedule 30.05.2020
comment
Обходной путь, упомянутый в ответе, все еще работает. Согласно - person Prashant Srivastava; 01.06.2020

Решения здесь не сработали для меня. Хотя они удалили ошибку, я не видел никаких вызовов DynamoDB, зарегистрированных в AWS X-Ray.

Вместо того, чтобы пытаться обновить DocumentClient, чтобы настроить инструментальную службу, я попытался захватить все, и у меня это сработало.

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

const client = new AWS.DynamoDB.DocumentClient();
await client.put({ TableName: "helloTable", Item: { "_id": (new Date()).toISOString() }}).promise();
person a-h    schedule 01.07.2020