如何在 AWS Lambda 中使用加密的环境变量?
How to use encrypted environment variables in AWS Lambda?
我正在尝试在 Node.js 4.3 中的 AWS Lambda 函数 运行ning 中使用加密的环境变量,但是在尝试解密变量时代码挂起。我没有收到任何错误消息,它只是超时。这是我尝试过的:
我在与 Lambda 相同的区域创建了加密密钥,并确保 Lambda 运行s 的角色可以访问该密钥。 (我什至尝试过让角色完全控制密钥。)
创建 Lambda 时,我启用了加密助手,select 我的加密密钥,并加密了环境变量:
接下来我单击 "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
当我运行函数时,它超时了。我看到它打印所有日志语句直到 "got blob" 然后它就停止了。除了超时之外没有错误消息。我已经尝试增加 Lambda 的超时和内存,但这只会让它在超时前等待更长时间。
当我从不告诉应用程序使用什么解密密钥时,解密应该如何工作? documentation for decrypt
没有提到告诉它什么解密密钥的任何方法使用。而且我没有收到任何错误消息,告诉我它不知道要使用什么键或任何东西。
我已经尝试过 this tutorial but it just tells me to do the same thing I've already done. I've also read all of the environment variables documentation,但它说我正在做的应该可以。
解密环境变量需要 API 调用 KMS 服务。为此,您的 Lambda 函数必须能够访问互联网,因为 KMS 没有 VPC 终端节点。因此,如果您的 Lambda 在 VPC 中 运行,请确保为 VPC 配置了 NAT,以允许您的 Lambda 函数调用 KMS。
我正在尝试在 Node.js 4.3 中的 AWS Lambda 函数 运行ning 中使用加密的环境变量,但是在尝试解密变量时代码挂起。我没有收到任何错误消息,它只是超时。这是我尝试过的:
我在与 Lambda 相同的区域创建了加密密钥,并确保 Lambda 运行s 的角色可以访问该密钥。 (我什至尝试过让角色完全控制密钥。)
创建 Lambda 时,我启用了加密助手,select 我的加密密钥,并加密了环境变量:
接下来我单击 "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
当我运行函数时,它超时了。我看到它打印所有日志语句直到 "got blob" 然后它就停止了。除了超时之外没有错误消息。我已经尝试增加 Lambda 的超时和内存,但这只会让它在超时前等待更长时间。
当我从不告诉应用程序使用什么解密密钥时,解密应该如何工作? documentation for decrypt
没有提到告诉它什么解密密钥的任何方法使用。而且我没有收到任何错误消息,告诉我它不知道要使用什么键或任何东西。
我已经尝试过 this tutorial but it just tells me to do the same thing I've already done. I've also read all of the environment variables documentation,但它说我正在做的应该可以。
解密环境变量需要 API 调用 KMS 服务。为此,您的 Lambda 函数必须能够访问互联网,因为 KMS 没有 VPC 终端节点。因此,如果您的 Lambda 在 VPC 中 运行,请确保为 VPC 配置了 NAT,以允许您的 Lambda 函数调用 KMS。