【AWS】Lambdaから別のLambdaを呼び出す方法
投稿 2025年10月26日
最終更新 2025年10月26日
専門用語多め
LambdaからLambdaを呼び出す方法
Lambda関数から直接、別のLambda関数を呼び出すには、同期で呼び出す方法と非同期で呼び出す方法があります。
要するに、呼び出したLambdaが終わるまで、待つか待たないかの違いです。
特徴としては下記の通りです。
| 同期処理 | 非同期処理 | |
|---|---|---|
| 実現方式 | RequestResponse | Event |
| 引数 | 渡せる(省略可) | 渡せる(省略可) |
| 戻り値 | 返せる | 返せない |
今回は「Node.js 22.x」でのやり方を紹介します。
同期処理
同期で呼び出す側のLambda
import { LambdaClient, InvokeCommand } from "@aws-sdk/client-lambda";
export const handler = async (event, context, callback) => {
// 別Lambdaを呼び出し
const lambdaClient = new LambdaClient();
await lambdaClient
.send(
new InvokeCommand({
// 呼び出すLambda関数名
FunctionName: "sync-lambda",
// 「同期」呼び出し
InvocationType: "RequestResponse",
// 呼び出すLambda関数に渡したい引数
Payload: JSON.stringify({
pointList: [1, 2, 3 ,4 ,5]
}),
})
)
.then((response) => {
// 呼び出したLambdaからの戻り値を受け取る
const bufferPayload = Buffer.from(response.Payload);
const jsonPayload = JSON.parse(bufferPayload.toString());
console.log("合計", jsonPayload.sumPoint);
console.log("平均", jsonPayload.averagePoint);
})
.catch((error) => {
// 何かしらのエラー
console.error("Lambdaの実行に失敗しました");
throw error;
});
};
同期で呼び出される側のLambda
export const handler = async (event, context, callback) => {
// 呼び出し元のLambdaから引数を取得(eventの中に入っている)
const pointList = event.pointList;
// 行いたい処理(例としてポイントの計算)
const sumPoint = pointList.reduce((a, b) => a + b, 0);
const averagePoint = sumPoint / pointList.length;
// 呼び出し元のLambdaに結果を返す
return {
sumPoint: sumPoint,
averagePoint: averagePoint
}
};
・実行ログ
2025-10-26T03:41:45.587Z f0a7888a-d4a5-40af-80e2-8dafc920e211 INFO 合計 15
2025-10-26T03:41:45.587Z f0a7888a-d4a5-40af-80e2-8dafc920e211 INFO 平均 3
非同期処理
非同期で呼び出す側のLambda
import { LambdaClient, InvokeCommand } from "@aws-sdk/client-lambda";
export const handler = async (event, context, callback) => {
// 別Lambdaを呼び出し
const lambdaClient = new LambdaClient();
await lambdaClient
.send(
new InvokeCommand({
// 呼び出すLambda関数名
FunctionName: "async-lambda",
// 「非同期」呼び出し
InvocationType: "Event",
// 呼び出すLambda関数に渡したい引数
Payload: JSON.stringify({
pointList: [1, 2, 3 ,4 ,5]
}),
})
)
.catch((error) => {
// 何かしらのエラー
console.error("Lambdaの実行に失敗しました");
throw error;
});
};
非同期で呼び出される側のLambda
export const handler = async (event, context, callback) => {
// 呼び出し元のLambdaから引数を取得(eventの中に入っている)
const pointList = event.pointList;
// 行いたい処理(例としてポイントの計算)
const sumPoint = pointList.reduce((a, b) => a + b, 0);
const averagePoint = sumPoint / pointList.length;
console.log("合計", sumPoint)
console.log("平均", averagePoint)
};
・実行ログ
2025-10-26T03:42:58.749Z ba943179-cc11-470d-a353-8b97c0341634 INFO 合計 15
2025-10-26T03:42:58.763Z ba943179-cc11-470d-a353-8b97c0341634 INFO 平均 3
IAMポリシー
Lambdaを呼び出す側のLambdaには、以下のような呼び出したいLambdaをResourceに入れた、IAMポリシーをアタッチしてください。
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"lambda:InvokeFunction"
],
"Resource": [
"arn:aws:lambda:<リージョン>:<AWSアカウントID>:function:<呼び出したいLambda関数名>]"
],
"Effect": "Allow"
}
]
}
実際に値を入れた例は下記のような形です。
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"lambda:InvokeFunction"
],
"Resource": [
"arn:aws:lambda:ap-northeast-1:123456789012:function:sync-lambda"
],
"Effect": "Allow"
}
]
}
まとめ
LambdaからLambdaを直接呼んでみました。
Lambdaを呼べれば汎用的な関数を用意できますし、使い方が広がりそうです。
以上、ここまで見ていただきありがとうございます。
皆さまの快適な開発ライフに、ほんの少しでもお役に立てれば幸いです。