node.js - 列出 AWS key ,然后迭代返回每个 key 值

标签 node.js amazon-web-services azure async-await azure-functions

该任务是一个作为计时器触发器运行的 Azure 函数应用程序,用于检索具有特定标签的所有 AWS key ,然后列出这些 key 。代码有效,

  1. 我可以使用特定标签检索 SecretId,但我希望它获取 secret 值。
  2. 如果我硬编码 SecretId,我可以获得 secret 值。

我认为这是一个嵌套异步函数问题。

module.exports = async function awsconnect(context, accessKey, accessSecret) {

    // Load the AWS SDK
    var AWS = require('aws-sdk'),
        params = {
            Filters: [
                {
                  Key: "tag-key",
                  Values: [
                    'AZ_PIPELINE',
                  ]
                },
              ]
            };

    AWS.config.update({
        accessKeyId: accessKey,
        secretAccessKey: accessSecret,
        region: "ap-southeast-2",
      });

    // Create a Secrets Manager client
    var client = new AWS.SecretsManager();

    let listSecret = await listAwsSecrets(context, client, params)

}

async function listAwsSecrets(context, client, params) {
    return new Promise(function (resolve, reject) {
        client.listSecrets(params, (err, data) => {
            if (err) {
                context.log('Error getting credentials', err);
                return reject(err);
            } else {
                data.SecretList.forEach(function (item) {                 
                    const secret = client.getSecretValue({ SecretId: item.Name }).promise();
                    context.debug('Id=', item.Name, secret);
                });
                return resolve();
            }
        });
    });
}

如果我在 Kudu 中运行上面的代码。我得到以下内容

AWSConnect timer trigger function ran! 2022-03-08T04:27:09.048Z
Id= S3_SIT Promise { <pending> }
Id= App-SIT-V2 Promise { <pending> }
Id= APP-JOHN_DOE-V2 Promise { <pending> }

上面的三个 Secret_Id 具有匹配的标签。 “待处理”表示存在同步问题。但是如果我按照

把await放在前面
const secret = await client.getSecretValue({ SecretId: item.Name }).promise();

它告诉我 await 仅在异步函数中有效,如果我将此行包装在异步函数中,我也会收到此错误。

那么退一步,我如何调用与特定标签匹配的listSecrets并获取每个secretId的 secret 值?

最佳答案

您可以尝试更改以下代码行吗:

data.SecretList.forEach(function (item) {                 
    const secret = client.getSecretValue({ SecretId: item.Name }).promise();
    context.debug('Id=', item.Name, secret);
});

data.SecretList.forEach(async function (item) {                 
    const secret = await client.getSecretValue({ SecretId: item.Name });
    context.debug('Id=', item.Name, secret);
});

for (let i=0; i<data.SecretList.length; i++) {
  const item = data.SecretList[i];
  const secret = await client.getSecretValue({ SecretId: item.Name });
  context.debug('Id=', item.Name, secret);
}

关于node.js - 列出 AWS key ,然后迭代返回每个 key 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71390201/

相关文章:

azure - Azure 搜索索引中的异步或同步复制?

node.js - Node MongoDB批量查找?

JavaScript: Node cron 和 Node 调度作业立即执行,而不是在将来执行

java - 如何减少代码中的 Lambda 冷启动时间?

c# - 将现有应用程序移植到 Microsoft Azure 面临哪些挑战?

sql - 在 SQL Server 中创建用户并在 web.config 文件中使用该用户?

Node.js - 从 EventEmitter 继承

javascript - 在 Node/Javascript 中链接 HTTP 请求时出现问题

amazon-web-services - 通过 Cloudformation 模板具有 lambda 目标的 AWS ALB

api - 用于确定视频是否在 Prime 即时视频上可用的 AWS API