Tareas programadas de AWS Lambda


145

Amazon anunció AWS Lambda ( http://aws.amazon.com/lambda/ ).

La descripción del producto incluye:

Tareas programadas

Las funciones de AWS Lambda pueden ser activadas por temporizadores de eventos externos, por lo que las funciones se pueden ejecutar durante los horarios de mantenimiento programados regularmente o en horas no pico. Por ejemplo, puede activar una función AWS Lambda para realizar limpiezas nocturnas de archivos durante horas no ocupadas.

Cuando leí esto, entendí que finalmente podría tener una manera de hacer constantemente tareas "parecidas a un cron". Quiero ejecutar una consulta específica todos los días a las 5PM, digamos.

Sin embargo, no encuentro esto en ninguna parte de la documentación. Solo mencionan desencadenantes en eventos programáticos o eventos de otros servicios de AWS.

¿Entendí mal? ¿O alguien puede señalarme la documentación?

Respuestas:


159

Soporte nativo para eventos programados agregado el 8 de octubre de 2015:

Como se anunció en esta publicación de blog de AWS , la programación ahora se admite como un tipo de origen de evento (también llamado desencadenantes) llamado " Eventos de CloudWatch - Programa ", y se puede expresar como una tasa o una expresión cron.

Agregar evento programado a una nueva lambda

Vaya al paso de creación 'Configurar activadores' y especifique el activador 'Evento de CloudWatch - Programar'. Ejemplo de configuración a continuación:

Imagen que muestra la configuración para crear un evento programado a las 5 p.m. UTC.

Agregar evento programado a una lambda existente

Navegue a la pestaña 'Activadores' de su lambda, seleccione 'Agregar activador' y especifique el activador 'Evento CloudWatch - Programación'. Captura de pantalla de ejemplo donde tengo una lambda existente con un disparador SNS:

Imagen que muestra cómo navegar para agregar UI de activación desde la consola Lambda.

Una vez cargada, la IU para configurar este activador es idéntica a la captura de pantalla en la sección anterior "Agregar evento programado a una nueva lambda".

Discusión

Para su caso de ejemplo, querrá usar en cron()lugar de rate(). Las expresiones de Cron en lambda requieren todos los campos y se expresan en UTC. Entonces, para ejecutar una función todos los días a las 5 p.m. (UTC), use la siguiente expresión cron:

cron(0 17 * * ? *)

Recursos adicionales

Notas

  • El nombre de este tipo de evento ha cambiado de "Evento programado" a "Eventos de CloudWatch - Programa" desde que se lanzó esta función por primera vez.
  • Antes del lanzamiento de esta función, la solución recomendada para este problema (según "Introducción a AWS Lambda" a 42 minutos y 50 segundos ) era usar SWF para crear un temporizador o crear un temporizador con una aplicación externa.
  • La interfaz de usuario de Lambda se ha revisado desde que salió la publicación del blog del evento programado, y las capturas de pantalla ya no son exactas. Vea mis capturas de pantalla actualizadas arriba del 10/03/2017 para las últimas revisiones.

¿Sabes si hay esperanza para un soporte de precisión de 1 minuto?
kaptan

2
Es un truco, pero puedes hacer esto para una frecuencia de 1 minuto youtube.com/watch?v=FhJxTIq81AU
ingh.am

44
El tipo de origen del evento ahora es "Eventos de CloudWatch - Calendario"
Guy Daher

@GuyDaher Gracias, he actualizado mi respuesta en consecuencia.
Anthony Neace,

3
Es compatible con la tasa de 1 min ahora. docs.aws.amazon.com/lambda/latest/dg/…
advncd

18

Desde el momento de esta publicación, parece haber surgido otra solución: Programar invocaciones recurrentes de AWS Lambda con The Unreliable Town Clock (UTC) en el que el autor propone suscribirse al tema de SNS Unreliable Town Clock . No he usado SWF ni SNS, pero me parece que la solución SNS es más simple. Aquí hay un extracto del artículo.

Reloj de ciudad no confiable (UTC)

El reloj no confiable de la ciudad (UTC) es un tema SNS nuevo, gratuito y público (servicio de notificación simple de Amazon) que transmite un mensaje de "timbre" cada cuarto de hora a todos los suscriptores. Puede enviar las campanas a las funciones de AWS Lambda, colas SQS y direcciones de correo electrónico.

Puede usar los atributos del timbre para ejecutar su código cada quince minutos, o solo ejecutar su código una vez por hora (por ejemplo, cuando minuto == "00") o una vez al día (por ejemplo, cuando hora == "00" y minuto = = "00") o cualquier otra serie de intervalos.

Incluso puede suscribirse a una función que solo desea ejecutar solo una vez en un momento específico en el futuro: haga que la función ignore todas las invocaciones hasta que sea posterior al tiempo que desea. Cuando llegue el momento, puede realizar su trabajo y luego darse de baja del tema SNS.

Conectar su código al Reloj de ciudad no confiable es rápido y fácil. No se requiere proceso de solicitud ni creación de cuenta


9
Ya no es una respuesta válida. El reloj de ciudad no confiable ya no está disponible
blueskin

15

NUEVA SOLUCIÓN: Trabajos programados de Lambda

Werner Vogel ha anunciado esta noche (10/08) en re: Invent que AWS Lambda ahora tiene su propio programador.

Se la nota de lanzamiento de AWS en Lambda 08/10/2015 :

También puede configurar AWS Lambda para invocar su código de forma regular y programada utilizando la consola de AWS Lambda. Puede especificar una tasa fija (número de horas, días o semanas) o puede especificar una expresión cron. Para ver un ejemplo, consulte Tutorial 5: Uso de funciones de Lambda para procesar eventos programados (Python) .


ANTERIOR SOLUCIÓN: Programación con AWS Data Pipeline

Puede usar AWS Data Pipeline para programar una tarea con un período determinado. La acción puede ser cualquier comando cuando configura su Pipeline con ShellCommandActivity .

Por ejemplo, puede ejecutar un comando de AWS CLI para:

  • Pon un mensaje a SQS
  • o invocar directamente una función Lambda (ver invocar )

Puede crear fácilmente la tarea programada de AWS Data Pipeline directamente dentro de la consola de AWS (por ejemplo, con un comando de AWS CLI):

ingrese la descripción de la imagen aquí

También puede usar la API para definir su programación:

{
 "pipelineId": "df-0937003356ZJEXAMPLE",
 "pipelineObjects": [
    {
      "id": "Schedule",
      "name": "Schedule",
      "fields": [
        { "key": "startDateTime", "stringValue": "2012-12-12T00:00:00" }, 
        { "key": "type", "stringValue": "Schedule" }, 
        { "key": "period", "stringValue": "1 hour" }, 
        { "key": "endDateTime", "stringValue": "2012-12-21T18:00:00"  }
       ]
     }, {
      "id": "DoSomething",
      "name": "DoSomething",
      "fields": [
        { "key": "type", "stringValue": "ShellCommandActivity" },
        { "key": "command", "stringValue": "echo hello" },
        { "key": "schedule", "refValue": "Schedule" }
      ]
    }
  ]
}

Límites : el intervalo de programación mínimo es de 15 minutos.
Precio : alrededor de $ 1.00 por mes.


9

Así es como lo hago:

  • Crea Lambda que:

  • Cree una alarma de CloudWatch para: ApproximateNumberOfMessagesVisible> 0 durante 1 minuto

  • Suscriba el tema SNS a la alarma
  • Suscríbase Lambda al tema de SNS

Ahora tiene un temporizador con aproximadamente 15 minutos de resolución.

Luego, otras funciones de Lambda se suscriben al tema SNS y se llaman cada 15 minutos.


44
Esta respuesta es básicamente instrucciones para un mecanismo que puede implementar el Reloj de ciudad no confiable descrito en la Respuesta de Shadi . Dado que el autor de UTC advierte que "puede desaparecer sin previo aviso en cualquier momento", su enfoque es probablemente muy superior.
Brian

Primera implementación - 1 mensaje - funciona un par de días y se detiene. Parece que periódicamente el mensaje simplemente no se entrega a SQS. Se agregaron 2 mensajes más (3 en suma): ahora ya funciona una semana. En CloudWatch veo fallas periódicas: solo se entregan 2 mensajes, aún así el temporizador funciona bien. Gist ha sido actualizado gist.github.com/mikeplavsky/5ffe7e33e0d70a248537
maplpro

@Brian Como autor del Unreliable Town Clock ( townclock.io ), estaría de acuerdo en que ejecutar el tuyo te da más control que depender de algún extraño (yo). De hecho, animo a la gente a ejecutar su propio reloj de ciudad no confiable y he publicado la fuente en GitHub: github.com/alestic/alestic-unreliable-town-clock
Eric Hammond

4

Dado que ahora es posible activar fácilmente funciones lambda a través de HTTP (por ejemplo, usando GET o curl), una solución simple es utilizar un CRON administrado como easycron: https://www.easycron.com/ para activar su función lambda.

Tuvimos el mismo problema y terminamos ejecutando un servicio cron en Google App Engine en Python, ya que esto permitió una mayor flexibilidad y complejidad en el trabajo CRON.


Los tiempos han cambiado y Lambda ahora admite la programación de tipo cron de fábrica docs.aws.amazon.com/lambda/latest/dg/with-scheduled-events.html
Dirk Conrad Coetsee

2

En la página Función, Agregar disparador, puede agregar Eventos de CloudWatch y convertirlo en un tipo de programación

ingrese la descripción de la imagen aquí


1

También puede programarlo con eventos de cloudWatch. Crear regla -> adjuntar objetivo (lambda) y configurar cron / sabio horario en su regla.


1

La forma de la consola web es bastante sencilla. Simplemente cree una CloudWatchregla para el lambda y agréguela en la Triggerspestaña del lambda .

Para aquellos que necesitan automatizar eso aws cli, podemos

  1. crear la función
  2. crea la regla,
  3. conceder el permiso
  4. regla de enlace y función

Crear función

aws lambda create-function --function-name ${FUNCTION-NAME} \
--runtime java8 \
--role 'arn:aws:iam::${Account}:role/${ROLE}' \
--handler org.yourCompany.LambdaApp \
--code '{"S3Bucket":"yourBucket", "S3Key": "RC/yourapp.jar"}' \
--description 'check hive connection' \
--timeout 180 \
--memory-size 384 \
--publish \
--vpc-config '{"SubnetIds": ["subnet-1d2e3435", "subnet-0df4547a"], "SecurityGroupIds": ["sg-cb17b1ae", "sg-0e7ae277"]}' \
--environment Variables={springEnv=dev}

Crear reglas

## create
aws events put-rule --name ${ruleName} \
--schedule-expression 'rate(5 minutes)' \
--state ENABLED \
--description 'check hive connection'

# grant permission to the Rule to allow it to trigger the function
aws lambda add-permission --function-name ${functionName} \
--statement-id 123 \
--action 'lambda:InvokeFunction' \
--principal events.amazonaws.com \
--source-arn arn:aws:events:us-east-1:acc:rule/${ruleName}

# link rule and function
aws events put-targets --rule ${ruleName} \
--targets '[{"Id":"1", "Arn":"arn:aws:lambda:us-east-1:acc:function:RC-checkhive"}]'

1

Una forma sencilla de ejecutar su consulta en lambda para un intervalo de tiempo particular es establecer una regla para su función lambda. para eso después de crear la función lambda, vaya a cloudwatch >> reglas >> horario. y defina la expresión cron y en la sección de destino seleccione la función lambda que desea activar.


0

Al crear la función lambda, cree el desencadenador "CloudWatch Events - Schedule"

Ahora puede usar los ajustes preestablecidos de AWS en la expresión de programación como rate = 15 min o puede usar una expresión cron.

ingrese la descripción de la imagen aquí

Para su requerimiento, el Cron Schedule es "0 0 17 1/1 *? *"


-1

Diksha es AWS Lambda Scheduler basado en AWS SWF Trigger como lo recomienda el equipo de AWS . Uno puede programar trabajos usando expresiones cron y también puede especificar cuánto tiempo desea ejecutar, cuándo comenzar o cuándo terminar. Puede ver el estado y el historial de trabajos programados. La seguridad es administrada por las políticas de AWS.

Una vez que configure el motor diksha, puede programar funciones utilizando la expresión cron de la siguiente manera:

java -jar diksha-client-0.0.1.jar -lcfg cf1 -cj "jobName | functionName | context | 0 0-59 * * * * | 10"

En este trabajo, el trabajo se ejecutará cada minuto 10 veces. AWS SWF activará la función por sí mismo.

Detalles: https://github.com/milindparikh/diksha

Descargo de responsabilidad: soy colaborador del proyecto.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.