【发布时间】:2018-09-14 19:06:41
【问题描述】:
我在为 AWS lambda 解密 nodejs 中的多个环境变量时遇到了困难。我查看了控制台中提供的代码示例以及以下两个相关问题:
我已经能够通过他们的代码示例成功解密单个环境变量,但是,当我尝试通过使用 Promise(上述问题中概述的方法)应用更简洁的方法时,我在测试控制台中的 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;
}
【问题讨论】:
-
请发布您的破解代码示例。您能否检查“第一个参数”的类型并确认它实际上是请求的类型之一(字符串、缓冲区等)?
-
我已经添加了一些示例代码。传入的参数是“... new Buffer(...”
标签: javascript node.js amazon-web-services aws-lambda aws-kms