问题
I have a lambda function in node6 which has 5 env variables all encrypted with aws kms. I have the following method which takes a encrypted key and returns a decrypted key.
function decryptKMS(encryptedKey) {
console.log('inside decryptkms');
const kms = new AWS.KMS();
kms.decrypt({ CiphertextBlob: new Buffer(encryptedKey, 'base64') }, (err, data) => {
if (err) {
console.log('Decrypt error:', err);
return callback(err);
}
var result = data.Plaintext.toString('ascii');
return result;
});
}
And in my handler I'm doing this to get my decrypted keys.
decryptedkey1 = decryptKMS(encryptedkey1);
decryptedkey2 = decryptKMS(encryptedkey2);
decryptedkey3 = decryptKMS(encryptedkey3);
decryptedkey4 = decryptKMS(encryptedkey4);
decryptedkey5 = decryptKMS(encryptedkey5);
But, since node is async, the function moved to the next step before decrypting the keys. Is there anyway I can use node promises for all the keys combined, or is there any way to decrypt multiple keys at once from kms?
回答1:
Promisify your decryptKMS
and combine with Promise.all
function decryptKMS(key) {
return new Promise((resolve, reject) => {
const kms = new AWS.KMS()
kms.decrypt({}, (err, data) => {
if(err) {
reject(err)
}
else {
resolve(data.Plaintext.toString('ascii'))
}
})
})
}
const keys = [encryptedkey1, encryptedkey2, encryptedkey3]
Promise.all(keys.map(decryptKMS))
.then(([decryptedkey1, decryptedkey2, decryptedkey3]) => {
// use decryptedkeyN here
})
.catch(console.log)
来源:https://stackoverflow.com/questions/44633822/nodejs-async-issue-while-decrypting-aws-kms-keys