AWSメモ > AWS LambdaからLambdaを呼ぶ AWS LambdaからLambdaを呼ぶ †Node.js †呼び出し元(親) †parentFunc 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); // } // }); }; 呼び出し先(子) †childFunc 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); }; Python †呼び出し元 †参考 https://boto3.readthedocs.io/en/latest/reference/services/lambda.html#Lambda.Client.invoke from __future__ import print_function import boto3 import json def lambda_handler(event, context): request = { "body" : { "var1" : "Test1" } } print("### CALL START ###") client = boto3.client('lambda') response = client.invoke( FunctionName='childFunc', InvocationType='RequestResponse', # 'Event'|'RequestResponse'|'DryRun', #LogType='None'|'Tail', #ClientContext='string', Payload=json.dumps(request) # b'bytes'|file, #Qualifier='string' ) print("### CALL END ###") print("### response START ###") if response["Payload"]: streaming_body = response["Payload"] encoded = streaming_body.read(); response_data = encoded.decode('utf-8') print (response_data) else: print (response) print("### response END ###") return json.dumps({'msg': 'Hello from Lambda'}) |