Lambdas будут стрелять, проблема в том, что вы не ждете окончания вызовов. Ваш Lambda async
, но вы на самом деле не используете await
, и, учитывая, что lambda.invoke
является вызовом, связанным с вводом / выводом, в вашем коде нет ничего, что заставило бы Lambda ждать завершения каждого вызова.
Вот способ, которым вы можете поставить в очередь внутренние вызовы и заставить свою лямбду ждать результатов:
module.exports.getUserListFromCrowd = async event => {
console.log('GetUserListFunction')
const crowdUserGroupOptions = {
method: 'GET',
uri: process.env.uri,
auth: {
user: process.env.user,
pass: process.env.pass,
sendImmediately: false
},
json: true,
headers: {
Accept: 'application/json'
}
};
const { users } = await rp(crowdUserGroupOptions);
console.log('Request Sent')
const requests = users.map(u =>
new Promise((resolve, reject) => {
const url = `${u.link.href}&expand=attributes`;
const params = {
FunctionName: 'applicationName-stageName-getUserDetailsFromCrowd',
InvocationType: 'Event',
Payload: requestLink,
LogType: 'Tail',
}
console.log('Calling Lambda');
lambda.invoke(params, (err, data) => err ? reject(err) : resolve(data));
})
);
console.log(`Waiting for ${requests.length} requests to finish...`);
const results = await Promise.all(requests);
console.log('Lambda results');
results.forEach((x, i) => console.log(`Request ${i+1} returned ${x}`));
};