it-swarm.dev

Nodejs - Aktifkan fungsi AWS.Lambda dari dalam fungsi lambda lainnya

Saya memiliki fungsi berikut yang saya gunakan untuk memanggil fungsi Lambda dari dalam kode saya.

Namun ketika saya mencoba menggunakannya dalam fungsi Lambda, saya mendapatkan kesalahan berikut:

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

Bagaimana saya bisa memanggil fungsi Lambda dari dalam fungsi Lambda?

Fungsi saya:

'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

Menjalankan Fungsi Lambda dari dalam fungsi Lambda lain cukup sederhana menggunakan aws-sdk yang tersedia di setiap Lambda.

Saya sarankan memulai dengan sesuatu sederhana terlebih dahulu.
Ini adalah "Hello World" dari permohonan intra-lambda:

Lambda_A memanggil Lambda_B dengan Payload yang mengandung parameter tunggal name:'Alex'.
Lambda_B merespons dengan Muatan: "Hello Alex".

lambda invoke

Pertama, buat Lambda_B yang mengharapkan properti name pada parameter event
dan menanggapi permintaan dengan "Hello "+event.name:

Lambda_B

exports.handler = function(event, context) {
  console.log('Lambda B Received event:', JSON.stringify(event, null, 2));
  context.succeed('Hello ' + event.name);
};

Pastikan Anda memberi Lambda_B dan Lambda_A peran yang sama.
Misalnya: membuat peran bernama lambdaexecute yang memiliki AWSLambdaExecute dan AWSLambdaBasicExecutionRole ( karena beberapa alasan, keduanya diperlukan ):

lambda-role-for-intra-lambda-execution

Lambda_A

var AWS = require('aws-sdk');
AWS.config.region = 'eu-west-1';
var lambda = new AWS.Lambda();

exports.handler = function(event, context) {
  var params = {
    FunctionName: 'Lambda_B', // the lambda function we are going to invoke
    InvocationType: 'RequestResponse',
    LogType: 'Tail',
    Payload: '{ "name" : "Alex" }'
  };

  lambda.invoke(params, function(err, data) {
    if (err) {
      context.fail(err);
    } else {
      context.succeed('Lambda_B said '+ data.Payload);
    }
  })
};

Setelah Anda menyimpan kedua fungsi Lambda ini, Uji coba Lambda_A:

lambda invoke-lambda_a-execution-result

Setelah Anda memiliki dasar doa intra-lambdda yang berfungsi, Anda dapat dengan mudah memperluasnya untuk memanggil fungsi Lambda yang lebih rumit.

Hal utama yang Anda harus ingat adalah untuk mengatur ARN Role yang sesuai untuk semua fungsi .

91
nelsonic

Pada 3 Desember 2016, Anda cukup menggunakan fungsi Langkah AWS untuk menempatkan fungsi Lambda Lambda_B sebagai langkah berurutan dari Lambda_A .

Dengan Fungsi Langkah AWS, Anda mendefinisikan aplikasi Anda sebagai mesin negara, serangkaian langkah yang bersama-sama menangkap perilaku aplikasi. Negara dalam mesin negara dapat berupa tugas, langkah berurutan, langkah paralel, jalur percabangan (pilihan), dan/atau timer (tunggu). Tugas adalah unit kerja, dan pekerjaan ini dapat dilakukan oleh fungsi AWS Lambda, contoh Amazon EC2 dari segala jenis, wadah, atau di server tempat — apa pun yang dapat berkomunikasi dengan Fungsi Langkah API dapat ditugaskan tugas.

Jadi mesin negara berikut ini harus memenuhi kebutuhan Anda.

enter image description here

Berikut adalah kode yang sesuai dengan mesin negara.

{
  "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
    }

  }
}

Selain itu, Anda dapat menambahkan logika yang jauh lebih canggih di mesin negara, seperti langkah paralel dan kegagalan menangkap. Bahkan mencatat detail dari setiap eksekusi yang menjadikan debugging pengalaman yang jauh lebih baik, terutama untuk fungsi lambda.

enter image description here

25
C.Lee

Semua yang disebutkan oleh @nelsonic benar, kecuali untuk perannya.

Saya mencoba memilih peran yang disebutkan di atas:

  • AWSLambdaExecute
  • Peran AWSLambdaBasicExecutionRole

Tapi itu tidak memungkinkan saya untuk memanggil fungsi lambda saya yang lain, jadi saya mengubah peran di bawah ini:

  • AWSLambdaRole
  • Peran AWSLambdaBasicExecutionRole

Alasan di belakang adalah AWSLambdaExecute saja menyediakan Put, Dapatkan akses ke S3 dan akses penuh ke CloudWatch Logs. tetapi AWSLambdaRole memberikan Kebijakan default untuk peran layanan AWS Lambda. jika Anda mengamati kebijakan izinnya, ia akan berbicara tentang invokeFunction

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

Catatan : tidak apa-apa untuk melanjutkan tanpa AWSLambdaBasicExecutionRole kebijakan karena hanya memungkinkan logging di cloud tidak banyak menonton. Tapi AWSLambdaRole mutlak diperlukan.

2
Mohammed Asad