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 |