[[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);
};
}}


トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS