Обратный вызов getSecretValue не работает в AWS Lambda - PullRequest
0 голосов
/ 08 апреля 2020

Я пытаюсь получить Secret Value из 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');

};

Вывод:

Запущено

Завершено

1 Ответ

0 голосов
/ 08 апреля 2020

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

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

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

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

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

exports.handler = async (event, context) => {
    const params = {SecretId: secretName};
    const rc = client.getSecretValue(params).promise();
    return decode_secret(rc);
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...