【问题标题】:Decrypt multiple env. variables nodejs - AWS Lambda解密多个环境。变量 nodejs - AWS Lambda
【发布时间】:2018-09-14 19:06:41
【问题描述】:

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

Question 1, Question 2

我已经能够通过他们的代码示例成功解密单个环境变量,但是,当我尝试通过使用 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


【解决方案1】:

如果keynull,那么new Buffer(key, 'base64') 将失败并出现您描述的错误。

当我自己运行你的代码时:

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

所以,你应该确认你引用的环境变量是真实定义的。

其他几个指针:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-16
    • 2017-12-17
    • 2019-12-22
    • 2018-07-07
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    相关资源
    最近更新 更多