【问题标题】:Constructing an object async using Node.js使用 Node.js 异步构造对象
【发布时间】:2017-06-17 00:53:26
【问题描述】:

我正在尝试使用 AWS Lambda 函数使用 AWS Key Management Service (KMS) 解密一些环境变量,然后使用解密的凭证发布推文。但是,在我使用 Twitter 对象之前,环境变量并没有被解密。这会导致身份验证失败。

如何确保 Twitter 对象(在下面的代码中)在调用其成员函数之前已完全实例化/初始化?我应该改用 Promise 吗?

var AWS = require('aws-sdk');
var Twitter = require('twitter');
var s3 = new AWS.S3();
var kms = new AWS.KMS();

function DecryptEnvironmentVariable(creds, varname) {
    console.log(`Decrypting environment variable named ${varname}`);
    console.log(process.env[varname]);

    params = {
        CiphertextBlob: process.env[varname]
    }
    kms.decrypt(params, function (err, data) {
        if (err) {
            console.log(err);
        }
        else {
            console.log("Successfully decrypted envrionment variable.");
            return data.Plaintext;
        }
    });
}

exports.tweet = function (event, context) {
    // Instantiate the Twitter object
    var twitterclient = new Twitter({
        consumer_key: DecryptEnvironmentVariable('TWITTER_CONSUMER_KEY'),
        consumer_secret: DecryptEnvironmentVariable('TWITTER_CONSUMER_SECRET'),
        access_token_key: DecryptEnvironmentVariable('TWITTER_ACCESS_TOKEN_KEY'),
        access_token_secret: DecryptEnvironmentVariable('TWITTER_ACCESS_TOKEN_SECRET'),
    })

    // Post a new tweet
    twitterclient.post('statuses/update', { status: "messagegoeshere" })
    .then(function(tweet) {
        console.log("Tweet was successfully posted!");
    })
    .catch(function(error) {
        console.log("Error occurred while posting tweet. :(");
        console.log(error);
    });
}

【问题讨论】:

    标签: node.js


    【解决方案1】:

    DecryptEnvironmentVariable 实际上并没有返回任何东西,所以你不能真正按照你想要的方式使用它。

    由于您需要获取多个异步操作的结果,因此最直接的方法可能是使用Promise.all(假设您使用的是当前版本的 nodejs):

    var AWS = require('aws-sdk');
    var Twitter = require('twitter');
    var s3 = new AWS.S3();
    var kms = new AWS.KMS();
    
    function DecryptEnvironmentVariable(creds, varname) {
      return new Promise(function (resolve, reject) {
        console.log(`Decrypting environment variable named ${varname}`);
        console.log(process.env[varname]);
    
        params = {
          CiphertextBlob: process.env[varname]
        }
        kms.decrypt(params, function (err, data) {
          if (err) {
            console.log(err);
            reject(err);
          }
          else {
            console.log("Successfully decrypted envrionment variable.");
            resolve(data.Plaintext);
          }
        });
      });
    }
    
    exports.tweet = function (event, context) {
      // Instantiate the Twitter object
      var tasks = [
        DecryptEnvironmentVariable('TWITTER_CONSUMER_KEY'),
        DecryptEnvironmentVariable('TWITTER_CONSUMER_SECRET'),
        DecryptEnvironmentVariable('TWITTER_ACCESS_TOKEN_KEY'),
        DecryptEnvironmentVariable('TWITTER_ACCESS_TOKEN_SECRET')
      ];
    
      return Promise.all(tasks).then(function (keys) {
    
        var twitterclient = new Twitter({
          consumer_key: keys[0],
          consumer_secret: keys[1],
          access_token_key: keys[2],
          access_token_secret: keys[3]
        });
    
        // Post a new tweet
        return twitterclient.post('statuses/update', { status: "messagegoeshere" });
      })
      .then(function(tweet) {
        console.log("Tweet was successfully posted!");
      })
      .catch(function(error) {
        console.log("Error occurred while posting tweet. :(");
        console.log(error);
      });
    }
    

    【讨论】:

    • 仅供参考,AWS SDK 现在支持 Promise,因此您可以在 DecryptEnvironmentVariable 函数中执行类似 return kms.decrypt(params).promise() 的操作,而不是将整个内容包装在新的 Promise 中。
    • 很好,当我检查文档时我没看到,但我又没看太难
    • 文档有点隐藏。本质上,KMS.decrypt() 返回一个 AWS.Request 实例,而该实例又具有一个 promise() method
    【解决方案2】:

    AWS Lambda supports environment variables natively。因此,您真的不需要使用 KMS 自己加密/解密它们。使用内置环境变量可以让您更轻松地同步使用它们,只需在它们通常所在的位置访问它们:process.env.TWITTER_CONSUMER_KEY

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-10
      • 1970-01-01
      • 1970-01-01
      • 2013-01-06
      • 2018-09-07
      • 2014-10-10
      • 2015-05-15
      • 2017-05-16
      相关资源
      最近更新 更多