node internet example ec2 aws amazon-web-services aws-lambda aws-sdk amazon-iam

amazon-web-services - internet - aws sdk node credentials



AWS lambda invoke no llama a otra funciĆ³n lambda-Node.js (2)

Nota

Denotaré por ejecutor la lambda que ejecuta la segunda lambda .

¿Por qué tiempo de espera?

Como el ejecutor está "bloqueado" detrás de una VPC , todas las comunicaciones de Internet están bloqueadas.

El resultado http(s) llamadas http(s) se agotarán, ya que solicitan que el paquete nunca llegue al destino.

Es por eso que todas las acciones realizadas por aws-sdk resultan en un tiempo de espera.

Solución simple

Si el ejecutor no tiene que estar en una VPC , simplemente VPC , una lambda puede funcionar también sin una VPC .

Es necesario ubicar la lambda en una VPC cuando la lambda llama a recursos dentro de la VPC .

Solución real

De lo anterior, se deduce que cualquier recurso ubicado dentro de una VPC no puede acceder a Internet, eso no es correcto , solo se necesitan algunas configuraciones.

  1. Crea una VPC .
  2. Cree 2 subredes , deje que una se denote como privada y la segunda pública (estos términos se explican más adelante, siga leyendo).
  3. Cree una puerta de enlace a Internet : este es un enrutador virtual que conecta una VPC a Internet.
  4. Cree una puerta de enlace NAT : seleccione la subred pública y cree una nueva elastic IP para esta (esta IP es local para su VPC ): este componente canalizará las comunicaciones a la internet-gateway .
  5. Cree 2 tablas de enrutamiento : una denominada pública y la segunda privada .

    1. En la tabla de enrutamiento público , vaya a Rutas y agregue una nueva ruta:

    Destino: 0.0.0.0/0

    Objetivo: la identificación de la internet-gateway

    1. En la tabla de enrutamiento privado , vaya a Rutas y agregue una nueva ruta:

    Destino: 0.0.0.0/0

    Objetivo: la identificación de la nat-gateway

    • Una subred privada es una subred que, en su tabla de enrutamiento, no existe una ruta a una internet-gateway .

    • Una subred pública es una subred que, en su tabla de enrutamiento, existe una ruta a una internet-gateway

¿Qué tuvimos aquí?

Creamos algo como esto:

Esto, lo que permite que los recursos en subredes privadas llamen a Internet. Puede encontrar más documentación here .

Después de dar todos los derechos para invocar la función. Mi función Lambda no puede invocar otra función. Cada vez que obtengo un tiempo de espera que tiene un problema de 30 seconds timeout espera de 30 seconds timeout . Parece que lambda no puede obtener otra función lambda

Mis lambdas están en la misma región, la misma política, el mismo grupo de seguridad ... También las VPC son las mismas en ambas lambdas. Lo único es diferente ahora son las funciones lambda

Aquí están los derechos de rol

1) creó AWSLambdaExecute y AWSLambdaBasicExecutionRole

2) Creó una función lambda que se llamará Lambda_TEST

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

3) Aquí hay otra función desde donde se llama.

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); } }) };

Referencia tomada de: Este enlace


He experimentado este mismo problema en el que las Lambdas que están "ancladas" a una VPC no pueden invocar otras Lambdas. He estado lidiando con este problema, sin usar NAT, refactorizando la estructura de mi solución.

Digamos que tengo varias lambdas, A, B, C, D, ... y me gustaría que estas Lambdas tengan acceso de consulta a una base de datos RDS. Para tener este acceso a la base de datos, necesito poner las lambdas en la misma VPC que la base de datos. Pero también me gustaría que varias lambdas entre A, B, C, D, ... se invoquen entre sí. Entonces me encuentro con el problema que describe Arpit.

He estado lidiando con este problema dividiendo cada Lambda en dos Lambdas: una que se enfoca en el flujo del proceso (es decir, invocar otras lambdas y ser invocado por otra lambda); y el otro se centra en hacer un trabajo "real", como consultar la base de datos. Entonces ahora tengo las funciones A_flow, B_flow, C_flow, D_flow, ...; y funciones A_worker, B_worker, C_worker, D_worker, ... Las diversas lambdas de flujo no están "ancladas" a una VPC específica y, por lo tanto, pueden invocar otras lambdas. Los diversos trabajadores Lambdas están en la misma VPC que la base de datos y pueden consultar la base de datos.

Cada flujo lambda "delega" el trabajo de interactuar con DB en el trabajador lambda correspondiente. Realiza esta delegación realizando una invocación síncrona del trabajador lambda. Las lambdas obreras no invocan otras lambdas. (En términos del diagrama de flujo del proceso, las lambdas de trabajo son nodos terminales). En mi propio sistema, las invocaciones de lambdas de flujo por parte de otras lambdas de flujo generalmente han sido asíncronas; pero supongo que podrían ser sincrónicos si se desea.

Aunque ideé este enfoque como una solución alternativa, tiene una buena característica de separar limpiamente el diseño de funciones de alto nivel en (a) flujo de proceso y (b) realizar un trabajo más detallado, incluida la interacción con los recursos de la base de datos.