问题描述
我有一个 lambda 函数来建立与 atlas 的连接。连接字符串被加密为环境变量。在测试建立连接时,我收到以下错误:
2021-06-07T22:48:31.303Z 01ab146e-734f-4f06-a5e9-acfb5635bc3b INFO Decrypt error: InvalidCiphertextException: null
at Request.extractError (/var/task/node_modules/aws-sdk/lib/protocol/json.js:52:27)
at Request.callListeners (/var/task/node_modules/aws-sdk/lib/sequential_executor.js:106:20)
at Request.emit (/var/task/node_modules/aws-sdk/lib/sequential_executor.js:78:10)
at Request.emit (/var/task/node_modules/aws-sdk/lib/request.js:688:14)
at Request.transition (/var/task/node_modules/aws-sdk/lib/request.js:22:10)
at AcceptorStateMachine.runTo (/var/task/node_modules/aws-sdk/lib/state_machine.js:14:12)
at /var/task/node_modules/aws-sdk/lib/state_machine.js:26:10
at Request.<anonymous> (/var/task/node_modules/aws-sdk/lib/request.js:38:9)
at Request.<anonymous> (/var/task/node_modules/aws-sdk/lib/request.js:690:12)
at Request.callListeners (/var/task/node_modules/aws-sdk/lib/sequential_executor.js:116:18) {
code: 'InvalidCiphertextException',time:
requestId:
statusCode: 400,retryable: false,retryDelay: 62.95362625619481
}
'use strict'
var MongoClient = require('mongodb').MongoClient;
const AWS = require('aws-sdk');
let atlas_connection_uri;
let cachedDb = null;
exports.handler = (event,context,callback) => {
var uri = process.env['MONGODB_ATLAS_CLUSTER_URI'];
if (atlas_connection_uri != null) {
processEvent(event,callback);
}
else {
const kms = new AWS.KMS();
kms.decrypt({ CiphertextBlob: new Buffer(uri,'base64') },(err,data) => {
if (err) {
console.log('Decrypt error:',err);
return callback(err);
}
atlas_connection_uri = data.Plaintext.toString('ascii');
processEvent(event,callback);
});
}
};
我认为问题可能是因为 Buffer 已被弃用,但我不确定。
如果您提供任何帮助,我们将不胜感激。
解决方法
TLDR:Lambda 更新了如何加密环境变量。
找到解决方案here
这里是分解:
Lambda 将函数名称作为加密上下文传递给 AWS KMS。对于在此更改之前创建的解密函数,您必须更新解密代码并将 Lambda 函数名称作为加密上下文传递。
要获取带有加密上下文的特定开发工具包的 AWS KMS 解密调用代码,请执行以下步骤:
-
打开 Lambda 控制台,然后选择函数。
-
在函数名称中,选择 Lambda 函数。
-
在环境变量中,选择编辑,然后选择添加 环境变量。
-
输入密钥和值,然后展开加密配置。
-
选择启用传输中加密的帮助程序,然后选择 加密。
-
展开解密秘密片段,复制并粘贴类似于以下内容的片段:
解密 = boto3.client('kms').decrypt( CiphertextBlob=b64decode(ENCRYPTED),EncryptionContext={'LambdaFunctionName': os.environ['AWS_LAMBDA_FUNCTION_NAME']} )['明文'].decode('utf-8')
使用此代码片段解密使用加密助手加密的新环境变量。