AWS Lambda の関数から Lambda の関数を呼ぶ

2019年7月5日

はじめに

AWS Lambda の関数から別の Lambda の関数を呼びたい。

Lambda の関数から Lambda の関数を呼ぶ

まずは、AWS Lambda で 2 つ関数を作る。ここではそれぞれの関数を "helloWorld"、"helloWorld2" とし、一方が与えた文字列をもう一方が 2 回繰り返して返すものとする。

helloWorld

const AWS = require('aws-sdk');

exports.handler = function(event, context) {
    const lambda = new AWS.Lambda();

    const params = {
        FunctionName: 'helloWorld2',
        InvocationType: 'RequestResponse',
        LogType: 'Tail',
        Payload: '{ "data" : "にゃーん" }'
    };

    lambda.invoke(params, function(err, data) {
        if (err) {
            context.fail(err);
        } else {
            context.succeed(data.Payload);
        }
    });
};

helloWorld2

exports.handler = function(event, context) {
    context.succeed(event.data + "、" + event.data);
};

helloWorld のロールにポリシーを追加する必要がある。インラインポリシーで Lambda の invokeFunction を選択し、helloWorld2 の ARN を指定する。呼び出す関数を直接指定することで、非 VPC の Lambda 関数から VPC の Lambda 関数を呼べたりする。

ポリシーの追加にはたぶん "iam:AttachRolePolicy"、"iam:PutRolePolicy"、"iam:ListPolicies" あたりのロールが必要。

helloWorld を実行して "にゃーん、にゃーん" と返って来れば OK。

別の書き方

helloWorld の Lambda 関数呼び出しを関数化しようとすると、次のようになる。

function duplicate(str) {
    const lambda = new AWS.Lambda();

    const params = {
        FunctionName: 'helloWorld2',
        InvocationType: 'RequestResponse',
        LogType: 'Tail',
        Payload: `{ "data" : "${str}" }`
    };

    return lambda.invoke(params).promise();
}

exports.handler = function(event, context) {
    const promise = duplicate("にゃーん");

    promise.then(data => {
        context.succeed(data.Payload);
    });
};

あるいは、呼び出し部分は次のようにも書ける。

exports.handler = async function(event, context) {
    const data = await duplicate("にゃーん");
    context.succeed(data.Payload);
};