ヘッダー画像

【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を呼べれば汎用的な関数を用意できますし、使い方が広がりそうです。

以上、ここまで見ていただきありがとうございます。

皆さまの快適な開発ライフに、ほんの少しでもお役に立てれば幸いです。

コメント

この記事のコメントはありません。

TOP