
Lambdaをトリガーに別のLambdaを呼び出したい!

saku
なるほど!説明していくね!
実装手順
SampleLambdaAからSampleLambdaBを呼ぶ、という形で実装していきます。
まず、呼び出し元のSampleLambdaAを作成します。

コードは下記の通り。詳細は後ほど解説します。
import { LambdaClient, InvokeCommand } from "@aws-sdk/client-lambda";
export const handler = async (event) => {
console.log("SampleLambdaA called!");
const client = new LambdaClient();
const payload = {
message:"SampleLambdaA payload",
};
const command = new InvokeCommand({
FunctionName: "SampleLambdaB",
InvocationType: "Event",
Payload: JSON.stringify(payload),
});
await client.send(command);
const response = {
statusCode: 200,
body: JSON.stringify('Hello from SampleLambdaA!'),
};
return response;
};
次に、SampleLambdaBを作成します。

export const handler = async (event) => {
console.log("SampleLambdaB called!");
console.log(event);
const response = {
statusCode: 200,
body: JSON.stringify('Hello from SampleLambdaB!'),
};
return response;
};
この状態で、SampleLambdaAを呼ぶと、
「SampleLambdaA is not authorized to perform」
のようなエラーが出ます。
SampleLambdaAからSampleLambdaBを呼び出す権限の設定が必要です。
実行ロール名のリンクをクリック。

インラインポリシーを作成します。


{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "lambda:InvokeFunction",
"Resource": "arn:aws:lambda:ap-northeast-1:xxxxx:function:SampleLambdaB"
}
]
}
これでSampleLambdaAを呼ぶと、
SampleLambdaBのCloudWatch Logsにログが表示されているはずです。

解説
SampleLambdaAのコードについて解説します。
import { LambdaClient, InvokeCommand } from "@aws-sdk/client-lambda";
export const handler = async (event) => {
console.log("SampleLambdaA called!");
const client = new LambdaClient();
const payload = {
message:"SampleLambdaA payload",
};
const command = new InvokeCommand({
FunctionName: "SampleLambdaB",
InvocationType: "Event",
Payload: JSON.stringify(payload),
});
await client.send(command);
const response = {
statusCode: 200,
body: JSON.stringify('Hello from SampleLambdaA!'),
};
return response;
};
設定できるのは「new InvokeCommand」の箇所です。
- FunctionName: 呼び出す関数名
- InvocationType: 呼び出し方式
- Payload: 呼び出したいデータ
もう少し掘り下げて説明します。
InvocationType
次のオプションから選択します。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/API_Invoke.html#API_Invoke_RequestParameters
RequestResponse
(デフォルト) – 関数を同期的に呼び出します。関数がレスポンスを返すかタイムアウトするまで、接続を開いたままにします。API レスポンスには、関数レスポンスと追加データが含まれます。Event
– 関数を非同期的に呼び出します。複数回失敗するイベントを、関数のデッドレターキューに送信します (設定されている場合)。API レスポンスには、ステータスコードのみが含まれます。DryRun
– パラメータ値を検証し、ユーザーまたはロールが、関数を呼び出す許可を持っていることを確認します。
同期的に呼び出すならRequestResponse
、非同期ならEvent
を、要件に応じて設定します。
Payload
呼び出し元から、呼び出す関数にデータを渡すことができます。
呼び出す関数の引数に入ってきます。
eventにPayloadで指定した値が渡ってくる👇
export const handler = async (event) => {
console.log("SampleLambdaB called!");
console.log(event);
const response = {
statusCode: 200,
body: JSON.stringify('Hello from SampleLambdaB!'),
};
return response;
};

最後に、参考にした公式ドキュメントも貼っておきます👇
AWS SDK for JavaScript v3
API Reference
AWS SDK または CLI で Invoke を使用する - AWS Lambda
AWS SDK または CLI で Invoke を使用する
Invoke - AWS Lambda
Lambda 関数を呼び出します。関数は、同期的に (レスポンスを待って)、または非同期的に呼び出すことが可能です。デフォルトでは、Lambda は関数を同期的に呼び出します (つまり InvocationType は RequestResponse です)。関数を非同期的に呼び出すには、 InvocationType...