我在解析AWS lambda的nodejs中的多个环境变量时遇到困难。我查看了控制台中提供的代码示例以及以下两个相关问题:
我已经能够通过代码示例成功解密单个环境变量,但是,当我尝试通过使用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;
}
答案 0 :(得分:0)
如果key
为null
,则new Buffer(key, 'base64')
将因您描述的错误而失败。
当我自己运行代码时:
因此,您应该确认您引用的环境变量实际已定义。
其他几点:
callback
;这就是你向执行结束的lambda环境发出信号的方式。decryptEnvVars
后,您应致电processEvent
函数