【发布时间】:2017-02-10 04:02:44
【问题描述】:
我尝试在 Node.js 4.3 中运行的 AWS Lambda 函数中使用加密的环境变量,但在尝试解密变量时代码挂起。我没有收到任何错误消息,它只是超时。这是我尝试过的:
我在与 Lambda 相同的区域中创建了加密密钥,并确保 Lambda 运行的角色可以访问该密钥。 (我什至尝试让角色完全控制密钥。)
在创建 Lambda 时,我启用加密助手,选择我的加密密钥并加密环境变量:
接下来,我单击“代码”按钮,它为我提供了应该在运行时处理解密的 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
当我运行该函数时,它会超时。我看到它将所有日志语句打印到“got blob”然后它就停止了。除了超时之外没有错误消息。我已经尝试增加 Lambda 的超时和内存,但这只会让它在超时之前等待更长的时间。
当我从不告诉应用使用什么解密密钥时,解密应该如何工作?documentation for decrypt 没有提到任何告诉它使用什么解密密钥的方法。而且我没有收到任何错误消息告诉我它不知道使用什么键或任何东西。
我尝试过通过this tutorial,但它只是告诉我做我已经做过的同样的事情。我也阅读了所有的environment variables documentation,但它说我正在做的应该是有效的。
【问题讨论】:
-
您的 Lambda 函数是否在 VPC 内运行?
-
@garnaat 是的,它在 VPC 中。它是能够连接到 RDS MySQL 实例的安全组和子网的一部分
-
我认为问题在于您需要访问 Internet 才能调用 KMS,因为它正在访问 KMS 端点。 KMS 没有 VPC 终端节点,因此您需要在 VPC 中设置 NAT 服务器。
-
@garnaat 是的,这就是问题所在。如果您可以将您的评论转换为我可以接受的答案。
-
旁注:根据调用 Lambda 的频率,为降低 KMS 使用成本,您可能需要考虑将对称密钥存储在 KMS 中并在处理程序之外对其进行解密。然后在处理程序中使用它来解密真实对象。
标签: node.js amazon-web-services encryption aws-lambda aws-sdk