amazon web services - que - Tareas programadas de AWS Lambda
que es amazon web services (11)
Amazon anunció AWS Lambda ( http://aws.amazon.com/lambda/ ).
La descripción del producto incluye:
Tareas programadas
Las funciones de AWS Lambda se pueden activar mediante 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?
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.
Consulte la nota de lanzamiento de AWS Lambda el 2015-10-08 :
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) .
ANTIGUA SOLUCIÓN: Programación con AWS Data Pipeline
Puede usar AWS Data Pipeline para schedule 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 invoke )
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):
También puede usar la API para define 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" }
]
}
]
}
Limits
: el intervalo de programación mínimo es de 15 minutos.
Pricing
: alrededor de $ 1.00 por mes.
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 " CloudWatch Events - Schedule ", y puede expresarse 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:
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:
Una vez cargada, la interfaz de usuario 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
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
- Documentación de AWS: programe expresiones utilizando Rate o Cron
- Documentación de AWS: ejecute una función AWS Lambda en una programación utilizando la CLI de AWS
-
Documentación de AWS - Tutorial: Uso de AWS Lambda con eventos programados
-
AWS ha proporcionado un "modelo" de muestra que utiliza una expresión cron llamada
lambda-canary
que se puede seleccionar durante la creación de funciones desde la consola de AWS. - Este tutorial lo guía a través de la configuración de este plan.
-
AWS ha proporcionado un "modelo" de muestra que utiliza una expresión cron llamada
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 utilizar 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.
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.
Para su requerimiento, el Cron Schedule es "0 0 17 1/1 *? *"
Así es como lo hago:
-
Crea Lambda que:
- purgas dadas SQS
- envía su mensaje con retraso 10 minutos
- https://gist.github.com/mikeplavsky/5ffe7e33e0d70a248537
-
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.
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 usar 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.
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 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 de ciudad no confiable (UTC) es un nuevo tema gratuito, público y gratuito de SNS (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 por 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
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 usando 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.
La forma de la consola web es bastante sencilla.
Simplemente cree una regla de
CloudWatch
para la lambda y agréguela en la pestaña
Triggers
de lambda.
Para aquellos que necesitan automatizar eso con
aws cli
, podemos
- crear la función
- crea la regla,
- conceder el permiso
- 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"}]''
También puede programarlo con eventos de cloudWatch. Crear regla -> adjuntar destino (lambda) y configurar cron / sabio horario en su regla.
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.