LambdaからLambdaを呼び出したい時がある。
その場合はInvokeを使うことで解決できる。
Invokeとは
これ
Lambdaクラスのメソッドの一種。
使い方
Nodeの場合。
Nodeのバージョンは8.1。
const AWS = require('aws-sdk');
const lambda = new AWS.Lambda();
// ペイロード。呼び出すLambda関数に受け渡す引数的な。
let payload = {
"number":number,
"message":"ご来場ありがとうございました"
}
// ペイロードをStringにする。
payload = JSON.stringify(payload);
// params
let params = {
FunctionName:"SendSMS",
InvocationType:"RequestResponse",
Payload:payload
}
try {
// Lambda関数呼び出し
let callLambda = await lambda.invoke(params).promise();
} catch (e) {
console.log("[ERROR]sendSMS/callLambda",e)
}
上はSMS送信するLambda関数を呼び出しているソースコード。
呼び出されるLambdaに渡す引数をString形式にしてpayloadにセットし、
呼びだす関数名(FunctionName)と、どのように呼び出すか(InvocationType)を指定して呼び出す。
補足
InvocationTypeについて
InvocationTypeはRequestResponse、Event、DryRunがある。
ドキュメントに全部書いてあるが、簡単に要約するとこんな感じ。
・RequestResponse
同期的に他の関数を呼び出す。InvocationTypeを指定しなければこれがデフォルトとなる。
呼び出した関数から何かレスポンスが返ってくるか、タイムアウトになるまで呼び出し元の関数と呼び出し先の関数の間でコネクションを張る。
戻り値として呼び出した関数から値を得ることができる。
・Event
非同期に他の関数を呼び出す。
呼び出した関数からはステータスコードのみ返却される。
試行に失敗したら複数回イベントを送信する(?)
・DryRun
呼び出しパラメーター(ペイロードのこと?)と、関数を呼び出そうとしているユーザーまたはロールについて検証を行う。
呼び出した関数から何か値を得たい場合はRequestResponse、とりあえず実行できればいいだけの場合はEvent、諸々検証したい場合はDryRun?
payloadについて
呼び出し先に渡す値はJSON形式で記述するが、引数をセットしたjsonはバッファ、配列、Blob、文字列のいずれかの型に変換する。
普通にオブジェクトでjson作って、json.stringifyでStringに変換するのが一番楽かなと思う。