8

我正在尝试使用适用于 Javascript 的 aws-sdk 从 AWS Secret Manager 检索秘密值,我正在使用 Secret Manager 提供的代码片段,我已将此代码包含在 Lambda 函数中,但我看不到任何定义的控制台日志回调函数内部。这是 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');

};

输出:

开始

结束了

4

1 回答 1

8

问题是您已将函数处理程序指定为async. 如果要使用回调,请使用旧式函数处理程序:

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

代码在函数完成之前退出getSecretValue()并有机会进行回调。而且由于您的函数是async并且您没有返回 Promise,因此 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();
};
于 2020-04-08T13:06:00.380 回答