web-dev-qa-db-ja.com

Nodejs-別のラムダ関数内からAWS.Lambda関数を呼び出します

コード内からLambda関数を呼び出すために使用する次の関数があります。

ただし、Lambda関数内で使用しようとすると、次のエラーが表示されます。

AWS lambda undefined 0.27s 3 retries] invoke({ FunctionName: 'my-function-name',
  InvocationType: 'RequestResponse',
  LogType: 'Tail',
  Payload: <Buffer > })

Lambda関数内からLambda関数を呼び出すにはどうすればよいですか?

私の機能:

'use strict';

var AWS = require("aws-sdk");

var lambda = new AWS.Lambda({
    apiVersion: '2015-03-31',
    endpoint: 'https://lambda.' + process.env.DYNAMODB_REGION + '.amazonaws.com',
    logger: console
});

var lambdaHandler = {};

// @var payload - type:string
// @var functionName - type:string
lambdaHandler.invokeFunction = function (payload, functionName, callback) {

    var params = {
        FunctionName: functionName, /* required */
        InvocationType: "RequestResponse",
        LogType: "Tail",
        Payload: new Buffer(payload, 'utf8')
    };

    var lambdaRequestObj = lambda.invoke(params);

    lambdaRequestObj.on('success', function(response) {
        console.log(response.data);
    });

    lambdaRequestObj.on('error', function(response) {
        console.log(response.error.message);
    });

    lambdaRequestObj.on('complete', function(response) {
        console.log('Complete');
    });

    lambdaRequestObj.send();

    callback();
};

module.exports = lambdaHandler;
45
hyprstack

2016年12月3日の時点で、AWS Step関数を使用してLambda関数Lambda_BLambda_A

AWS Step Functionsを使用して、アプリケーションをステートマシンとして定義します。これは、アプリの動作を一緒にキャプチャする一連のステップです。ステートマシンの状態は、タスク、シーケンシャルステップ、パラレルステップ、分岐パス(選択)、および/またはタイマー(待機)になります。タスクは作業単位であり、この作業は、AWS Lambda関数、任意のタイプのAmazon EC2インスタンス、コンテナー、またはオンプレミスサーバーによって実行できます。StepFunctions APIと通信できるものには、タスクを割り当てることができます。

したがって、次のステートマシンがニーズを満たす必要があります。

enter image description here

ステートマシンに対応するコードは次のとおりです。

{
  "Comment": "A simple example of the Amazon States Language using an AWS Lambda Function",
  "StartAt": "Lambda_A",

  "States": {
    "Lambda_A": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME",
      "Next": "Lambda_B"
    },
    "Lambda_B":{
      "Type": "Task",
      "Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME",
      "End": true
    }

  }
}

さらに、並列ステップや障害のキャッチなど、はるかに高度なロジックをステートマシンに追加できます。特にラムダ関数の場合、デバッグの経験がはるかに優れたすべての実行の詳細も記録されます。

enter image description here

25
C.Lee

ロールを除いて、@ nelsonicが言及するものはすべて正しいです。

私は彼が上で言及した役割を選んでみました:

  • AWSLambdaExecute
  • AWSLambdaBasicExecutionRole

しかし、他のラムダ関数を呼び出すことができなかったため、役割を次のように変更しました。

  • AWSLambdaRole
  • AWSLambdaBasicExecutionRole

背後にある理由はAWSLambdaExecuteのみPut、S3へのアクセスとCloudWatch Logsへのフルアクセスを提供です。しかしAWSLambdaRoleAWS Lambdaサービスロールのデフォルトポリシーを提供します。許可ポリシーを遵守すると、invokeFunctionについて話します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "lambda:InvokeFunction"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

AWSLambdaBasicExecutionRoleポリシーなしで続行することは問題ありません。ただし、AWSLambdaRoleは絶対に必要です。

2
Mohammed Asad