[[AWSメモ]] > AWS LambdaからLambdaを呼ぶ * AWS LambdaからLambdaを呼ぶ [#zfd75dd8] #setlinebreak(on); #contents ** 親関数の作成 [#w4d8c4e7] parentFunc #mycode2(){{ var aws = require('aws-sdk'); exports.handler = (event, context, callback) => { var innerEvent = {}; // 親イベントが受け取った情報をそのまま子に渡す(eventをそのまま渡すとコケる場合がある)※詳細は未調査 innerEvent.body = event.body || {}; innerEvent.headers = event.headers || {}; innerEvent.queryStringParameters = event.queryStringParameters || null; innerEvent.pathParameters = event.pathParameters || null; innerEvent.requestContext = event.requestContext || null; innerEvent.body = event.body || {}; innerEvent.exampleData = { "var1" : "data001" }; // 親が受け取ったデータ以外の情報を追加で渡す場合 innerEvent = JSON.stringify(innerEvent); var lambda = new aws.Lambda({apiVersion: '2015-03-31'}); var params = { FunctionName: "childFunc", // InvocationType: "Event", // 非同期呼出 // InvokeArgs: JSON.stringify({ // "key_1": 'var_A', // "key_2": 'var_B', // "key_3": 'var_C' // }), InvocationType: "RequestResponse", //同期呼出 Payload: innerEvent }; //lambda.invokeAsync(params, function(err, data){ lambda.invoke(params, function(err, data){ if(err) { context.done(err, err); } else { // 子から受け取ったレスポンスをそのまま返す var result = { "statusCode" : 502 }; var childRes = data.Payload || data || {}; if (childRes && typeof(childRes) === "string"){ childRes = JSON.parse(childRes); } if (childRes.statusCode) { result.statusCode = childRes.statusCode; } if (childRes.headers) { result.headers = childRes.headers; } if (childRes.body) { result.body = childRes.body; } console.log("data: "); console.log(data); console.log("result: "); console.log(result); callback(null, result); //context.done(null, ''); } }); /** * コールバックを指定しない場合は、明示的にAWS.Request.send を呼ぶ必要がある */ // var awsReq = lambda.invokeAsync(params); // // var awsReq = lambda.invoke(params); // awsReq.on('error', function(response) { // console.log("error!!"); // console.log(response); // }).on('complete', function(response) { // console.log("complete!!"); // console.log(response); // }).on('success', function(response) { // console.log("success!!"); // console.log(response); // //console.log(response.httpResponse.stream.rawHeaders); // //console.log(response.httpResponse.body.toString("utf-8")); // //console.log(response.httpResponse.buffer); // }).send(function(err, data){ // if (err) { // console.log("Error!!"); // callback(err, err); // } else { // console.log("callback data :"); // console.log(data); // callback(null, data); // } // }); }; }} &br; ** 子関数の作成 [#bea6a55c] childFunc #mycode2(){{ exports.handler = (event, context, callback) => { console.log("event:"); console.log(event); var var1 = "unknown"; if (event.exampleData && event.exampleData.user) { var1 = event.exampleData.var1; } var body = { "var1": var1, "var2": "Child Response", "event": event }; // Lambdaプロキシ統合を使用する場合のレスポンス var res = { "statusCode": 200, "headers": { "Additional-Headr1": "1234" }, "body": JSON.stringify(body), }; callback(null, res); //context.done(null, res); //return JSON.stringify(res); }; }}