|
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'})
|