はじめに
lambdaからlambdaを並列で呼び出し、かついい感じに子lambdaからステータスを受け取って親lambdaが返却するやり方を知りたかったが、google先生に聞くとStepFunctionばかり出てくるのでまとめた。
こたえ
async使えばいけるぞ
parallel.js
var async = require('async');
const AWS = require('aws-sdk');
var lambda = new AWS.Lambda();
function callParallelLambda(arg) {
return function(callback2) {
var payload = {
key: 'key' + arg.id,
}
//子lambdaへのリクエストパラメータは文字列で渡す
payload = JSON.stringify(payload);
var params = {
FunctionName: 'childelambda', // 子lambdaの名前。
InvocationType: "RequestResponse", // 子lambdaの呼び方。レスポンス受けたいので同期で呼ぶ。
Payload: payload // 子lambdaへのリクエストパラメータ
};
lambda.invoke(params, function (err, data) {
// if elseでcallbackしないと、"既にcallbackが呼ばれているぞ"というエラーになる
if (err) {
callback2(null, err)
} else {
const response = {
statusCode: 200,
headers: {},
body: { "message": "呼び出せました", "data": data }
};
callback2(null, response)
}
});
}
}
exports.handler = (event, context, callback) => {
// コールバック関数の配列を作成
var callbacks = []
for (var i = 0; i < 5; ++i) {
console.log(i)
callbacks.push(callParallelLambda(i));
}
async.parallel(callbacks, function (err, results) {
console.log('error = ' + err);
console.log('results = ' + results);
callback(null, results);
});
}
注意点
- 親lambda関数のロールにlambda実行権限をつけること
- lambdaの同時実行数のデフォルトは1ルートアカウントあたり1000なので、それ以上の予定がある場合はAWSに土下座するかparallel limitを使ってlambdaの制限時間の許す限り頑張ってみてください