列出 AWS 机密,然后迭代返回每个机密值
list AWS secrets and then iterate returning each secret value
该任务是一个 Azure Function App,它 运行 作为计时器触发器检索具有特定标签的所有 AWS 机密,然后列出这些机密。代码有效,
- 我可以使用特定标签检索 SecretId,但我希望它获取秘密值。
- 如果我对 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);
}
});
});
}
该任务是一个 Azure Function App,它 运行 作为计时器触发器检索具有特定标签的所有 AWS 机密,然后列出这些机密。代码有效,
- 我可以使用特定标签检索 SecretId,但我希望它获取秘密值。
- 如果我对 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);
}
});
});
}