AWS lambda invoquer ne pas appeler un autre lambda fonction - noeud.js

après avoir donné tous les droits d'invoquer la fonction. Ma fonction Lambda n'est pas capable d'invoquer une autre fonction . Chaque fois que je reçois timeout avoir 30 seconds timeout question. Il ressemble lambda n'est pas en mesure d'obtenir une autre fonction lambda

mes lambdas sont dans la même région, même politique, même groupe de sécurité .. Aussi VPC sont les mêmes dans les deux lambdas. La seule chose est différente maintenant est fonctions lambda

Voici le rôle des droits de l'

1) Créé AWSLambdaExecute et AWSLambdaBasicExecutionRole

2) créé une fonction lambda qui doit être appelé Lambda_TEST

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

3) Voici une autre fonction d'où elle est appelée .

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

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

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

référence tirée de: ce lien

20
demandé sur Pat Myron 2016-08-25 14:57:31

2 réponses

Note

je désigne par exécuteur testamentaire le lambda qui exécute la deuxième lambda .


Pourquoi Délai D'Attente?

depuis que exécuteur testamentaire est "verrouillé" derrière un VPC - toutes les communications internet sont bloquées.

qui résulte en n'importe quel appel http(s) à être chronométré comme ils demandent le paquet jamais il arrive à destination.

C'est pourquoi toutes les actions effectuées par aws-sdk donnent lieu à un temps mort.


Solution Simple

si le exécuteur testamentaire n'a pas avoir à être dans un VPC - il suffit de le sortir, un lambda peut fonctionner aussi bien sans un VPC .

Localisation lambda dans un VPC est requis lorsque le lambda appelle des ressources à l'intérieur du VPC .

Vraie Solution

de ce qui précède, il s'ensuit que toute ressource située à l'intérieur d'un VPC ne peut pas accéder à l'internet - qui n'est pas correct - seulement quelques configurations doivent être faites.

  1. créer un VPC .
  2. créer 2 sous-réseaux , que l'on soit désigné comme privé et le deuxième public (ces termes sont expliqués plus loin, continuez à lire).
  3. créer un passerelle Internet - il s'agit d'un routeur virtuel qui connecte un VPC à l'internet.
  4. créez un NAT Gateway - choisissez le public sous-réseau et créez un nouveau elastic IP pour lui (cette IP est locale à votre VPC ) - ce composant achemine les communications vers le internet-gateway .
  5. créer 2 tables D'acheminement - une nommée publique et la seconde privée .

    1. dans la table d'acheminement public , passez à Routes et ajoutez une nouvelle route:

    Destination: 0.0.0 / 0

    cible: L'ID du internet-gateway

    1. dans la table d'acheminement privé , passez à Routes et ajoutez une nouvelle route:

    Destination: 0.0.0.0 / 0

    cible: L'ID du nat-gateway

    • Un privé sous-réseau est un sous-réseau dans sa table de routage - là , pas de itinéraire d'un internet-gateway .

    • Un public sous-réseau est un sous-réseau dans sa table de routage - là existe un itinéraire à un internet-gateway


ce que nous avait ici?

nous avons créé quelque chose comme ceci:

VPC with NAT and IGW

ce, ce qui permet aux ressources dans privé sous-réseaux d'appeler l'internet. Vous pouvez trouver plus de documentation ici .

38
répondu johni 2017-08-10 20:36:27

j'ai connu ce même problème où les Lambdas qui sont" épinglés " à un VPC ne sont pas en mesure d'invoquer D'autres Lambdas. J'ai fait face à ce problème, sans utiliser NAT, en remaniant la structure de ma solution.

disons que j'ai plusieurs lambdas, A, B, C, D,... et je voudrais que ces Lambdas aient chacun accès à une base de données RDS. Pour avoir cet accès DB, je dois mettre les lambdas dans la même VPC que la base de données. Mais j'aimerais aussi des lambdas parmi A, B, C, D,... pour appeler l'un de l'autre. Je tombe donc sur le problème décrit par L'Arpit.

j'ai eu affaire à cette question en divisant chaque Lambda en deux Lambdas: l'un qui se concentre sur le déroulement du processus (c.-à-d. invoquer d'autres lambdas et être invoqué par un autre lambda); et l'autre qui se concentre sur faire du" vrai " travail, comme interroger la base de données. Donc j'ai maintenant les fonctions A_flow, B_flow, C_flow, D_flow, ... et fonctions A_worker, B_worker, C_worker, D_worker, ... Le divers lambdas de flux ne sont pas "épinglés" à un VPC spécifique, et peuvent donc invoquer d'autres lambdas. Les différents travailleurs Lambdas sont dans le même VPC que la base de données, et peut interroger le DB.

chaque flux lambda "délègue" le travail d'interaction avec DB à l'ouvrier lambda correspondant. Il fait cette délégation en effectuant une invocation synchrone de l'ouvrier lambda. L'ouvrier lambdas n'invoquent pas d'autres lambdas. (En termes de flux de processus graphique, le travailleur lambdas sont terminal de nœuds.) Dans mon propre système, les invocations de lambdas de flux par d'autres lambdas de flux ont généralement été asynchrones; mais je suppose qu'elles pourraient être synchrones si désiré.

même si j'ai conçu cette approche comme une solution de rechange, il a une belle caractéristique de séparer clairement la conception de la fonction de haut niveau en (a) flux de processus et (b) effectuer des travaux plus détaillés, y compris l'interaction avec des ressources DB.

1
répondu Jim Robertson 2017-12-29 18:29:17