【问题标题】:Get secrets in AWS lambda node.js在 AWS lambda node.js 中获取秘密
【发布时间】:2020-05-15 08:27:01
【问题描述】:

谁能提供一个简单、完整的 node.js lambda 函数,让我可以从秘密管理器获取秘密并使用它?我正在努力处理异步/等待过程。我已经尝试了其他帖子的几个建议,但最后,所有这些建议都不能真正使用 main 函数中的秘密。 例如,我有一个 main 函数并调用第二个函数来检索秘密:

xxx = retrieve_secret('mysecret');

然后,在retrieve_secret 函数中,我可以检索秘密,我可以使用console.log 打印它,但是当我尝试在主函数中使用它时,它会显示“Promise”。

请帮忙。 提前致谢!

【问题讨论】:

  • 听起来像添加等待可以解决这个问题。所以xxx = await retrieve_secret('mysecret'); 这使得该行的函数是异步的,所以它需要async 关键字。
  • 对。我尝试过这个。但它没有用。看起来有点复杂,因为在retrieve_secret函数内部我们需要调用secrets api(client.getSecretValue),那么这个也应该是异步的吗?我在几篇文章之后尝试了几件事,但没有一篇能完全解决这个问题。

标签: node.js amazon-web-services aws-lambda secret-manager


【解决方案1】:

所以,经过几天的努力,我终于能够解决它:) 这是对我有用的代码:

exports.handler = async (event, context, callback) => {

   // Get Secret
   var AWS       = require('aws-sdk');
   var MyPromise = new AWS.SecretsManager();

   var Vsecret   = await MyPromise.getSecretValue({
      SecretId: 'enter-the-secret-id-here'
      }).promise();

   var MyOpenSecret = JSON.parse(Vsecret.SecretString);

   // From here, we can use the secret:
   var Vhost     = MyOpenSecret.host;
   var Vuser     = MyOpenSecret.username;
   var Vpassword = MyOpenSecret.password; 
   var Vdatabase = .....

【讨论】:

    【解决方案2】:

    查看您的问题,您似乎无法读取retrieve_secret('mysecret') 方法的响应,因为您提到它返回promise,您可以在promise 后使用.then() 来读取它。尝试这样做 -

    xxx.then(res => {
        console.log(res)
    })
    

    或者这里是调用获取您的秘密详细信息的代码:

    import AWS from "aws-sdk";
    
    getSecretValue(secretName: string): Promise<string> {
            const client = new AWS.SecretsManager({ 
                region: '',
                accessKeyId: '',
                secretAccessKey: '',
            });
            const secretId = "secretName";
            return new Promise((resolve, reject) =>
                client.getSecretValue({ SecretId: secretId }, (err, data) => {
                    if (err) {
                        reject(err);
                    } else {
                        resolve(data.SecretString);
                    }
                })
            );
        }
    

    【讨论】:

    • 您好 Abhishek,感谢您的回答。我有 2 个问题:1)对于您给出的 xxx 示例 - 秘密值会返回到 xxx 变量吗?如果我做console.log(xxx),我会看到秘密吗? 2) 抱歉,我只是 node.js 的初学者——我刚刚复制/粘贴了您的代码,上面写着“意外的令牌”。我需要更换一些东西吗?这是一个功能吗?如何将要检索的秘密名称传递给此函数?谢谢!
    • 另外:尝试实现xxx.then,收到如下错误:“errorMessage”:“xxx.then is not a function”,
    • xxx = retrieve_secret('mysecret'); xxx 是您在其中分配了您的 retrieve_Secret('mysecret') 函数的变量的名称。如果您使用我的代码,请添加“区域”、“accessKeyId”、“secretAccessKey”的详细信息。也代替“secretName”给出你的秘密名称。
    • 但是,如果我们从 lambda 运行它,为什么我们需要提供“accessKeyId”和“secretAccessKey?lambda 函数已经具有附加角色所需的权限。至少,对于秘密以外的其他服务,我不需要提供。
    猜你喜欢
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-16
    • 1970-01-01
    • 2019-05-27
    相关资源
    最近更新 更多