Обратный вызов getSecretValue не работает в AWS Lambda

Я пытаюсь получить секретное значение из AWS Secret Manager с помощью aws-sdk для Javascript, я использую фрагмент кода, предоставленный Secret Manager, я включил этот код в функцию Lambda, но я не вижу никаких определенных журналов консоли внутри функции обратного вызова. Вот лямбда-код:

exports.handler = async (event, context) => {
    const AWS = require('aws-sdk');
    const client = new AWS.SecretsManager({ region: "eu-west-2" });
    let secret;
    let decodedBinarySecret;

    console.log('STARTED');

    client.getSecretValue({ SecretId: "MagellanDev" }, function (err, data) {
        if (err) {
            console.log('Got Error: ', err.code);
            throw err;
        }
        else {
            if ('SecretString' in data) {
                secret = data.SecretString;
            } else {
                let buff = new Buffer(data.SecretBinary, 'base64');
                decodedBinarySecret = buff.toString('ascii');
            }
        }

        console.log("SECRET: ", secret);
        console.log("DECODEBINARYSECRET: ", decodedBinarySecret)
    });

    console.log('ended');

};

Выход:

Начал

закончился


person kzrfaisal    schedule 08.04.2020    source источник
comment
Есть ошибки в журналах CloudWatch?   -  person Marcin    schedule 08.04.2020
comment
Я ожидал, что в журналах сразу же появится надпись «Начато», за которой следует «завершено». Это следствие того, как работают асинхронные / обратные вызовы JavaScript. Вы видите какие-либо журналы CloudWatch после 'finish' и до 'END RequestId: xxx'?   -  person jarmod    schedule 08.04.2020
comment
нет журнала до конца запроса   -  person kzrfaisal    schedule 08.04.2020
comment
нет ошибок в cloudwatch   -  person kzrfaisal    schedule 08.04.2020
comment
Лямбда была прервана через 3 секунды с таймаутом?   -  person jarmod    schedule 08.04.2020
comment
таймаут 1 мин.   -  person kzrfaisal    schedule 08.04.2020


Ответы (1)


Проблема в том, что вы указали обработчик функции как async. Если вы хотите использовать обратные вызовы, используйте обработчик функций в более старом стиле:

exports.handler = function(event, context, callback) {
  // ...
}

Код завершился до того, как функция getSecretValue() завершила работу и получила возможность выполнить обратный вызов. И поскольку ваша функция async и вы не вернули обещание, среда выполнения Lambda не ждет.

Я бы отошел от старого кода в стиле обратного вызова и перешел к новому коду в стиле async / await, например:

const AWS = require('aws-sdk');
const client = new AWS.SecretsManager({region: 'us-east-1'});

exports.handler = async (event, context) => {
    const params = {SecretId: secretName};
    return client.getSecretValue(params).promise();
};
person jarmod    schedule 08.04.2020
comment
Я не уверен, где определяется decode_secret, но вы можете просто использовать let result = await rc; вернуть результат; вместо. - person nachbar; 21.06.2020
comment
@nachbar Дайте другой ответ с вашим подходом? - person rainabba; 19.03.2021
comment
@rainabba, прошло некоторое время с тех пор, как я смотрел на это, но взгляните на предыдущие версии этого ответа (щелкните отредактированную ссылку в ответе), чтобы узнать, что я предлагал. - person nachbar; 26.03.2021