我正在尝试在Node.js 4.3中运行的AWS Lambda函数中使用加密的环境变量,但是在尝试解密变量时代码会挂起。我没有收到任何错误消息,只是超时了。这是我尝试过的:
我在与Lambda相同的区域中创建了加密密钥,并确保Lambda运行的角色可以访问密钥。 (我甚至试图让角色完全控制钥匙。)
创建Lambda时,我启用加密助手,选择我的加密密钥,并加密环境变量:
接下来,我点击" Code"按钮,它给了我应该在运行时处理解密的javascript代码。这是代码 - 我所做的唯一更改是添加console.log
语句,我添加了一个try / catch:
"use strict";
const AWS = require('aws-sdk');
const encrypted = process.env['DBPASS'];
let decrypted;
function processEvent(event, context, callback) {
console.log("Decrypted: " + decrypted);
callback();
}
exports.handler = (event, context, callback) => {
if (decrypted) {
console.log('data is already decrypted');
processEvent(event, context, callback);
} else {
console.log('data is NOT already decrypted: ' + encrypted);
// Decrypt code should run once and variables stored outside of the function
// handler so that these are decrypted once per container
const kms = new AWS.KMS();
console.log('got kms object');
try {
var myblob = new Buffer(encrypted, 'base64');
console.log('got blob');
kms.decrypt({ CiphertextBlob: myblob }, (err, data) => {
console.log('inside decrypt callback');
if (err) {
console.log('Decrypt error:', err);
return callback(err);
}
console.log('try to get plaintext');
decrypted = data.Plaintext.toString('ascii');
console.log('decrypted: ' + decrypted);
processEvent(event, context, callback);
});
}
catch(e) {
console.log("exception: " + e);
callback('error!');
}
}
};
这是我运行该功能时得到的结果:
data is NOT already decrypted: AQECAH.....
got kms object
got blob
END RequestId: 9b7af.....
Task timed out after 30.00 seconds
当我运行该功能时,它会超时。我看到它打印所有日志语句,直到"得到blob"然后它就停止了。除超时之外没有错误消息。我已尝试增加Lambda的超时和内存,但它只是让它在超时之前等待更长时间。
当我从未告诉应用程序使用什么解密密钥时,解密应该如何工作? documentation for decrypt
没有提及告诉它使用什么解密密钥的方法。而且我没有收到任何错误消息,告诉我它不知道使用什么密钥或任何东西。
我已尝试通过this tutorial,但它只是告诉我做我已做过的同样的事情。我还阅读了所有environment variables documentation,但它说我正在做的事情应该正常工作。
答案 0 :(得分:8)
解密环境变量需要对KMS服务进行API调用。为此,您的Lambda函数必须能够访问Internet,因为KMS没有VPC端点。因此,如果您的Lambda在VPC中运行,请确保为VPC配置了NAT,以允许您的Lambda函数调用KMS。