解密多个环境。变量nodejs - AWS Lambda

时间:2018-04-05 04:34:51

标签: javascript node.js amazon-web-services aws-lambda aws-kms

我在解析AWS lambda的nodejs中的多个环境变量时遇到困难。我查看了控制台中提供的代码示例以及以下两个相关问题:

Question 1Question 2

我已经能够通过代码示例成功解密单个环境变量,但是,当我尝试通过使用promises(上述问题中概述的方法)应用更清晰的方法时,我在测试时遇到此错误控制台中的lambda函数:

  

TypeError:第一个参数必须是字符串,Buffer,ArrayBuffer,   数组或类似数组的对象。

我想知道是否有人之前有过这个问题以及如何解决它?

编辑: 我已在下面的代码中添加了一些示例

const AWS = require('aws-sdk');
const mysql = require('mysql');
let connection;

const encrypted = {
    username: process.env.username,
    password: process.env.password,
    database: process.env.database,
    host: process.env.host
};

let decrypted = {};

const encryptedEnvVars = [process.env.username, process.env.password, process.env.database, process.env.host ];


exports.handler = (event, context, callback) => {
    if (isEnvVarsDecrypted()) {
        processEvent(event, context);
    } else {  
        Promise.all(encryptedEnvVars.map(decryptKMS))
        .then(decryptEnvVars)
        .catch(console.log);
    }
};

function decryptKMS(key) {
    return new Promise((resolve, reject) => {
      const kms = new AWS.KMS()

      kms.decrypt({ CiphertextBlob: new Buffer(key, 'base64') }, (err, data) => {
        if(err) { reject(err); }
        else { resolve(data.Plaintext.toString('ascii')); }
      });
    });
  }

var decryptEnvVars = data =>  {
    return new Promise((resolve, reject) => {
        console.log(data);
        decrypted.username = data[0].Plaintext.toString('ascii');
        decrypted.password = data[1].Plaintext.toString('ascii');
        decrypted.database = data[2].Plaintext.toString('ascii');
        decrypted.host = data[3].Plaintext.toString('ascii');
        resolve();
    });
};

var isEnvVarsDecrypted = () => {
    return decrypted.username && decrypted.password && decrypted.database && decrypted.host;
}

1 个答案:

答案 0 :(得分:0)

如果keynull,则new Buffer(key, 'base64')将因您描述的错误而失败。

当我自己运行代码时:

  • 如果缺少任何环境变量,则发生错误
  • 声明所有环境变量后,错误停止

因此,您应该确认您引用的环境变量实际已定义。

其他几点:

  • 无论成功/失败,确保始终致电lambda callback;这就是你向执行结束的lambda环境发出信号的方式。
  • 致电decryptEnvVars后,您应致电processEvent函数