列出 AWS 机密,然后迭代返回每个机密值

list AWS secrets and then iterate returning each secret value

该任务是一个 Azure Function App,它 运行 作为计时器触发器检索具有特定标签的所有 AWS 机密,然后列出这些机密。代码有效,

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

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

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_Ids有匹配的标签。 “待定”表示同步问题。但是如果我按照

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

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

所以退一步说,我如何调用与特定标签匹配的 listSecrets 并获取每个 secretId 的秘密值?

你能不能通过更改以下代码行来尝试:

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);
}

好的,我让代码按如下方式工作:使用 .then.catch 列出 SecretId,然后 await/promise 获取每个 ID 的秘密。

        listAwsSecrets(client, params).then(function (data) {
            data.SecretList.forEach(async (item) => {                 
                const secret = await client.getSecretValue({ SecretId: item.Name }).promise();
                console.log('Id=', item.Name, secret);
            });
        }).catch(err=> {
        console.log("Error listing secrets", err);
        })
}


function listAwsSecrets(client, params) {
    return new Promise(function (resolve, reject) {
        client.listSecrets(params, (err, data) => {
            if (err) {
                return reject(err);
            } else {
                resolve(data);
            }
        });
    });
  }