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