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

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-01-14 (日) 16:06:58 (336d)