amazon web services - porque - ¿Puedo limitar las invocaciones simultáneas de un AWS Lambda?
https console aws amazon com lambda home region us east 1 (4)
Tengo una función Lambda que se desencadena mediante un PUT en un contenedor S3.
Quiero limitar esta función de Lambda para que solo se ejecute una instancia a la vez, no quiero que dos instancias se ejecuten simultáneamente.
He echado un vistazo a la configuración y documentos de Lambda, pero no puedo ver nada obvio. Puedo escribir mi propio sistema de bloqueo, pero sería bueno si esto ya fuera un problema resuelto.
¿Cómo puedo limitar el número de invocaciones simultáneas de un Lambda?
AWS Lambda ahora admite límites de concurrencia en funciones individuales: https://aws.amazon.com/about-aws/whats-new/2017/11/set-concurrency-limits-on-individual-aws-lambda-functions/
Haga que el S3 "Poner eventos" haga que se coloque un mensaje en la cola (en lugar de involucrar a una función lambda). El mensaje debe contener una referencia al objeto S3. A continuación, PROGRAMAR un lambda para "ENCUESTA CORTA toda la cola".
Los eventos PS: S3 no pueden desencadenar una secuencia Kinesis ... solo SQS, SMS, Lambda (consulte http://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html#supported-notification-destinations ). Kinesis Stream es caro y se usa para el manejo de eventos en tiempo real.
Le sugeriría que utilice Kinesis Streams (o, alternativamente, DynamoDB + DynamoDB Streams , que esencialmente tienen el mismo comportamiento).
Puedes ver Kinesis Streams como cola . La parte buena es que puede utilizar una función Kinesis Stream como Trigger to you Lambda . Por lo tanto, cualquier cosa que se inserte en esta cola se transferirá automáticamente a su función, en orden. Por lo tanto, podrá procesar esos eventos S3 uno por uno, una ejecución Lambda tras otra (una instancia a la vez).
Para hacer eso, deberás crear una función Lambda con el simple propósito de obtener Eventos S3 y colocarlos en una Secuencia Kinesis . Luego, configurará esa Corriente Kinesis como su Activador Lambda .
Cuando configura Kinesis Stream como su Lambda Trigger, le sugiero que use la siguiente configuración:
- Tamaño de lote: 1
- Esto significa que llamarán a su Lambda con un solo evento de Kinesis . Puede seleccionar un número más alto y obtendrá una lista de eventos de ese tamaño (por ejemplo, si desea procesar los últimos 10 eventos en una ejecución de Lambda en lugar de 10 ejecuciones de Lambda consecutivas).
- Posición inicial: recortar horizonte
- Esto significa que se comportará como una cola ( FIFO )
Un poco más de información sobre AWS May Webinar Series - Procesamiento de datos en streaming con Amazon Kinesis y AWS Lambda .
Espero que esto ayude a cualquiera con un problema similar.
PS Tenga en cuenta que Kinesis Streams tiene sus propios pricing . El uso de DynamoDB + DynamoDB Streams puede ser más barato (o incluso gratis debido a que el Nivel gratuito no caduca de DynamoDB).
No, esta es una de las cosas que realmente me gustaría que fuera compatible con Lambda, pero actualmente no es así. Uno de los problemas es que si ocurrieran muchas operaciones S3 PUT, AWS tendría que poner en cola todas las invocaciones Lambda de alguna manera, y actualmente no hay soporte para eso.
Si construyes un mecanismo de bloqueo en tu función Lambda, ¿qué harías con las solicitudes que no procesas debido a un bloqueo? ¿Podrías tirar esas notificaciones S3 lejos?
La solución que la mayoría de la gente recomienda es que S3 envíe las notificaciones a una cola SQS y luego programe su función Lambda para que se ejecute periódicamente, como una vez por minuto, y verifique si hay un elemento en la cola que deba procesarse.
Alternativamente, haga que S3 envíe las notificaciones a SQS y solo tenga una instancia de t2.nano EC2 con un servicio de un solo hilo que sondea la cola.