LambdaからLambdaを呼ぶ方法を解説

Lambda

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

saku
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

次のオプションから選択します。

  • RequestResponse (デフォルト) – 関数を同期的に呼び出します。関数がレスポンスを返すかタイムアウトするまで、接続を開いたままにします。API レスポンスには、関数レスポンスと追加データが含まれます。
  • Event – 関数を非同期的に呼び出します。複数回失敗するイベントを、関数のデッドレターキューに送信します (設定されている場合)。API レスポンスには、ステータスコードのみが含まれます。
  • DryRun – パラメータ値を検証し、ユーザーまたはロールが、関数を呼び出す許可を持っていることを確認します。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/API_Invoke.html#API_Invoke_RequestParameters

同期的に呼び出すなら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...