Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
11
Help us understand the problem. What is going on with this article?
@sy250f

AWS Lambda 関数から 別の Lambda 関数を呼び出す方法

More than 1 year has passed since last update.

Lambda から Lambda を呼び出す方法についてのまとめです。

環境

  • macOS
  • AWS Cloud9
  • Node.js 8

Lambda から Lambda を呼び出す方法

他にもあるようですが、その一つとして Invoke を使います。

[Invoke] は、AWS SDKLambda API に含まれるメソッドです。

Invoke の基本的な使い方

基本的な使い方は次のようになります。

  1. ライブラリを読み込みます。 const aws = require('aws-sdk');
  2. Lambdaオブジェクトのインスタンスを取得します。 let lambda = new aws.Lambda({apiVersion: '2015-03-31'});
  3. パラメーターをJavaScriptオブジェクト形式で準備します。 const params = { Object }
  4. 実行します。 lambda.invoke(params, (err, data) => {})

実装

簡単な実装コードで Lambda から Lambda を呼べることを確認します。

呼び出し側

[API Gateway] から [POST]リクエストされた時に実行される Lambda関数です。

コード

kintoneWebhookRecordPost.index.js
const aws = require('aws-sdk');

"use strict";
let sc;
let result;
let response;

exports.handler = async (event, context, callback) => {
  try {
    const kintonePost = JSON.parse(event.body);
    console.log(kintonePost);
    sc = 200;
    result = "kintone comment POST success!";
    response = {
      statusCode: sc,
      headers: { "Content-type": "application/json" },
      body: JSON.stringify( result )
    };
    let lambda = new aws.Lambda({apiVersion: '2015-03-31'});
    const params = {
      FunctionName: "<arn>", // Lambda 関数の ARN を指定
      InvocationType: "RequestResponse",
      Payload: JSON.stringify(event)
    };
    console.log(params);
    lambda.invoke(params, (err, data) => {
      let res = data;
      if (err) {
        console.log("invoke error.");
        console.log(err);
        context.done(err, err);        
      } else {
        console.log("invoke success.");
        console.log("response:", res);
        context.done(null, res);
      }
    });
  } catch(err) {
    sc = 400;
    result = err.message;
    response = {
      statusCode: sc,
      headers: { "Content-type": "application/json" },
      body: JSON.stringify( result )
    };
  }
  callback(null, response);
};

params 説明

lambda.invoke メソッドに渡すパラメータの説明です。

  • FunctionName: Lambda Function ARN を指定します。
  • InvocationType: InvocationTypeを指定します。デフォルトは "RequestResponse"です。
  • Payload: 呼び出すLambda関数に渡す値を指定します。JSONをそのまま渡せないので、文字列に変換して渡しています。

呼び出される側の Labmda の作成

下記の拙稿を参考にしてください。
AWS Cloud9 で AWS Lambda を開発する環境を構築してみる


呼び出される側

Lambda を作成したときの blue print [hello world] のコードを使います。
特に何もしませんが、呼び出された時にログを出力して、コールバックに呼び出し元から渡された内容を戻します。
成功すれば、CloudWatchログで出力が確認できるはずです。

コード

lambdaInvokeTest.index.js
"use strict";
console.log('Loading function');
exports.handler = async (event, context, callback) => {
    console.log('Received event:', JSON.stringify(event, null, 2));
    console.log('event.body:', JSON.parse(event.body));
    // console.log('value1 =', event.key1);
    // console.log('value2 =', event.key2);
    // console.log('value3 =', event.key3);
    // return event.key1;  // Echo back the first key value
    // throw new Error('Something went wrong');
    callback(null, JSON.parse(event.body));
};

呼び出される側の Labmda の作成

Lambdaアプリの上で右クリックして [Create Here] を選択。
[Function name] を入力します。
スクリーンショット 2019-10-21 17.50.04.png

[blue print] は node.js [hello-world] を選択します。
スクリーンショット 2019-10-21 17.49.47.png

トリガーは [none]
スクリーンショット 2019-10-21 17.50.25.png

実行ロールは 自動
スクリーンショット 2019-10-21 17.50.42.png

blue print の [hello-world] です。
スクリーンショット 2019-10-21 17.53.47.png


実行結果

Cloud9(ローカル開発環境) から リモート環境へデプロイして実行します。
Cloud9からリモートの API Gateway 経由で Lambdaを実行する

Cloud9 から リモートのAPI Gateway を実行

テスト用のJSONを渡します。

Paylode.json
{
    "param1": "value1"
}

スクリーンショット 2019-10-22 12.46.41.png

ログの確認

CloudWatchログを確認します。

呼び出し側のログ

スクリーンショット 2019-10-22 13.04.15.png

呼び出された側からステータスコードと値が戻ってきています。

response: { StatusCode: 200,
Payload: '{"param1":"value1"}' }

呼び出された側のログ

スクリーンショット 2019-10-22 13.04.51.png

呼び出し側から渡されたパラメーターが取得できています。

event.body: { param1: 'value1' }

アプリから API Gateway 経由で Lambda を実行する

kintoneの Webhook を使い、下記の流れで確認します。

  1. kintoneアプリにレコード追加
  2. kintoneアプリの アプリの設定→Webhook→Webhookログ を確認
  3. cybozu.com共通管理 の システム管理→監査ログ を確認
  4. AWS の CloudWatchログを確認

Webhookの設定は下記になっています。
URLに AWS API Gateway の API エンドポイント を設定しています。
スクリーンショット 2019-10-22 14.40.54.png


アプリにレコードを追加します。
スクリーンショット 2019-10-22 14.39.56.png

スクリーンショット 2019-10-22 14.42.39.png


Webhook のログを確認します。
スクリーンショット 2019-10-22 14.40.27.png

成功しているようです。
スクリーンショット 2019-10-22 14.43.20.png


監査ログを確認します。
スクリーンショット 2019-10-22 14.44.35.png

スクリーンショット 2019-10-22 14.44.17.png


呼び出し側の AWS CloudWatchログです。
kintoneのレコード情報が渡ってきています。
スクリーンショット 2019-10-22 14.54.28.png


呼び出される側の AWS CloudWatchログです。

呼び出し直後のログがあり、
スクリーンショット 2019-10-22 15.01.31.png

呼び出し側から渡された情報がログ出力されています。
スクリーンショット 2019-10-22 15.23.22.png

kintoneレコードをJSONに変換して表示されています。
スクリーンショット 2019-10-22 15.02.20.png

外部から AWS API Gateway 経由で Lambdaを呼び出して、さらに別の Lambda を呼び出すことができました。


関連リンク

AWS関連

その他

11
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
sy250f
システムエンジニア。 要件定義と基本設計、プロジェクト管理が主な業務です。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
11
Help us understand the problem. What is going on with this article?