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.
-
Crea una
VPC
. - 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).
-
Cree una
puerta de enlace a Internet
: este es un enrutador virtual que conecta una
VPC
a Internet. -
Cree una
puerta de enlace NAT
: seleccione la subred
pública
y cree una nueva
elastic IP
para esta (esta IP es local para suVPC
): este componente canalizará las comunicaciones a lainternet-gateway
. -
Cree 2 tablas de enrutamiento : una denominada pública y la segunda privada .
- 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
- 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.