getSecretValue 回调在 AWS Lambda 中不起作用

kzr*_*sal 7 javascript amazon-web-services aws-lambda aws-kms aws-secrets-manager

我正在尝试使用 aws-sdk for Javascript 从 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');

};

Run Code Online (Sandbox Code Playgroud)

输出:

开始

结束

jar*_*mod 6

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

exports.handler = function(event, context, callback) {
  // ...
}
Run Code Online (Sandbox Code Playgroud)

代码在getSecretValue()函数完成之前退出,并有机会进行回调。并且因为您的函数是async并且您没有返回 Promise,所以 Lambda 运行时不会等待。

我会远离旧的回调式代码,转而使用较新的异步/等待式代码,例如:

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();
};
Run Code Online (Sandbox Code Playgroud)