繁体   English   中英

解密多个环境。 AWS Lambda中的变量

Decrypting multiple env. variables in AWS Lambda

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我需要在AWS Lambda函数中解密许多加密的环境变量。 他们给出了一些示例代码,但我不想为我需要解密的每个值运行一个巨大的块:

const AWS = require('aws-sdk');

const encrypted = process.env['my_password'];
let decrypted;


function processEvent(event, context, callback) {
    // TODO handle the event here
}

exports.handler = (event, context, callback) => {
    if (decrypted) {
        processEvent(event, context, callback);
    } else {
        // 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();
        kms.decrypt({ CiphertextBlob: new Buffer(encrypted, 'base64') }, (err, data) => {
            if (err) {
                console.log('Decrypt error:', err);
                return callback(err);
            }
            decrypted = data.Plaintext.toString('ascii');
            processEvent(event, context, callback);
        });
    }
};

我想知道AWS SDK是否包含一个允许我一次解密多个值的函数。 如果不这样做,有没有办法优雅地将这些调用链接在一起,这样他们就不会占用我这个简单功能的~75行?

2 个回复

您可以使用promises来实现此目的。 请参阅下面的示例,以通过KMS解密用户名和密码。 您可以根据需要向decryptPromises数组添加尽可能多的其他解密承诺:

const AWS = require('aws-sdk');

    const encrypted = {
        username: process.env.username,
        password: process.env.password
    };

    let decrypted = {};

    function processEvent(event, context, callback) {
        //do work
    }

    exports.handler = (event, context, callback) => {
        if ( decrypted.username && decrypted.password ) {
            processEvent(event, context, callback);
        } else {
            const kms = new AWS.KMS();

            const decryptPromises = [
                kms.decrypt( { CiphertextBlob: new Buffer(encrypted.username, 'base64') } ).promise(),
                kms.decrypt( { CiphertextBlob: new Buffer(encrypted.password, 'base64') } ).promise()
            ];

            Promise.all( decryptPromises ).then( data => {
                decrypted.username = data[0].Plaintext.toString('ascii');
                decrypted.password = data[1].Plaintext.toString('ascii');

                processEvent(event, context, callback);
            }).catch( err => {
                console.log('Decrypt error:', err);
                return callback(err);
            });
        }
    };

您可以在SDK文档的Support for Promises中找到有关如何为AWS SDK实现promises的更多信息。

我创建了一个类来解密亚马逊lambda中的变量。 它使用async await而不是Promises.all。 您不需要导入lodash库。 您可以修改波纹管类以不使用它(使用forEach)。

 var _ = require('lodash/core'); const AWS = require('aws-sdk'); class EnvVarsDecryptor { constructor(encryptedVariables) { this.encryptedVariables = encryptedVariables; this.decrypted = {}; } isDecrypted() { return _.every(this.encryptedVariables, (e) => this.decrypted[e] != undefined && this.decrypted[e] != null); } async decryptVars() { const kms = new AWS.KMS(); try { for ( let index = 0; index < this.encryptedVariables.length; index++) { const encrypted = this.encryptedVariables[index]; const data = await kms.decrypt({CiphertextBlob: new Buffer(process.env[encrypted], 'base64') }).promise(); this.decrypted[encrypted] = data.Plaintext.toString('ascii'); } } catch( e) { console.error(e); } return this.decrypted; } } module.exports = EnvVarsDecryptor; 

这是一个说明如何使用该功能的示例:

 exports.handler = async (event) => { if (!decryptor.isDecrypted()) { await decryptor.decryptVars(); } console.log(decryptor.decrypted); return `Successfully processed ${event.Records.length} messages.`; }; 

1 解密多个环境。 变量nodejs-AWS Lambda

我在解密AWS Lambda的nodejs中的多个环境变量时遇到困难。 我看了控制台中提供的代码示例以及以下两个相关问题: 问题1 , 问题2 我已经能够通过其代码示例成功解密单个环境变量,但是,当我尝试通过使用Promise(上述问题中概述的方法)应用更简洁的方法时,在测试Lam ...

3 Docker 环境。 env 文件中变量的同义词?

假设我有一个 env 文件 以及期望的 docker 命令 有没有办法从 env 文件中取出 DB_PW 并将其分配给命令行中的 MYSL_ROOT_PASSWORD ? (显然不必使用显式分配向 env 文件添加一行)我一直在这里和那里阅读,但我不确定这是否可能或在哪里记录。 ...

6 使用环境。 变量作为启动配置中的VM参数

我有一个eclipse项目,该项目基于启动配置中传递的VM参数连接到不同的环境。 为了实现这一目标,我设置了环境。 “启动配置-&gt;环境”中的变量,然后尝试将其作为VM参数传递,但由于eclipse无法解决这些环境而出现错误。 变量。 关于如何实现这一目标的任何指导? ...

7 通过环境 作业失败后,下游作业的变量

我有一个詹金斯上游工作,一旦失败,它将触发下游工作,但是我需要传递相同的环境。 下游作业中上游作业的变量。 我正在使用Powershell设置环境。 像$env:tag=$(git describe)变量,即生成我的git标签。 如何发送此环境。 下游作业中使用变量,而不在下游作业 ...

8 如何在Nant脚本中从Teamcity执行环境变量(env。)

我正在使用TeamCity使用Nant脚本构建.Net解决方案,并且如果我对解决方案路径进行硬编码,一切都可以正常工作。 我想使用TeamCity(env。)中的环境变量作为解决方案路径-&gt; env.solution.path ----- Nant脚本test.build文件中的C:\\ ...

9 环境运行 Minimal Flask 应用程序时未设置变量

我正在尝试按照以下链接提供的 Windows 机器上的烧瓶文档进行操作: http : //flask.pocoo.org/docs/0.11/quickstart/#debug-mode 首先,我在 python 脚本中编写了以下代码: 我将它保存在一个名为run.py的文件中 然后在命令窗 ...

10 设置Anaconda env的良好做法是什么? 和Linux中的环境变量

最近,我在Tensorflow和Anaconda环境中进行了大量工作。 我发现为每个项目创建一个新的python环境是避免在库版本和依赖关系方面避免污染和泄漏的好方法。 我当时忽略了Linux中带有环境变量的此类实践,并且我认为当前的问题与弄乱其中的一些问题有关。 首先要问我的问题:以 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM