Execução agendada de funções utilizando AWS e Serverless Framework
Agende a execução de funções de maneira automática e simplificada utilizando Serverless Framework.
Dependendo da arquitetura e/ou projeto desejado pode ser necessário configurar funções para que sejam executadas de maneira automática em determinada data/hora ou em um intervalo de tempo. Este é um cenário um tanto quanto comum e que pode ser resolvido de maneira simples com ferramentas como o Serverless Framework que tendem a facilitar nossa vida.
Amazon Web Services
Em se tratando de arquitetura Serverless, o serviço responsável por monitorar os eventos que ocorrem na nuvem da AWS e disparar gatilhos (triggers) para acionar outros serviços (entre eles a Lambda) é o Amazon EventBridge, este pode ser utilizado em diversas aplicações e necessidades. — Verifique a definição de preço
O EventBridge possui inúmeras possibilidades, não ficando limitado apenas a execução de funções e este artigo limita os exemplos de maneira proposital para simplificar o entendimento.
Do diagrama: as “Rules” são o recurso utilizado para disparar a execução das AWS Lambda.
Serverless Framework
O Serverless Framework permite a integração com o AWS EventBridge através do evento schedule, isto fará com que as regras sejam criadas de maneira automática.
Hands-on
Tarefas Cron
Popular agendador de tarefas de sistemas de base UNIX. A sintaxe cron é suportada na AWS, porém existem pequenas diferenças nos caracteres utilizados.
Para utilizar a sintaxe Cron com o Serverless Framework, declare um evento do tipo schedule
dentro de functions
e então na propriedade rate
especifique que o evento desejado é do tipo cron()
:
...- schedule:
name: scheduled-execution
description: "Execute function at the configured date and time"
rate: cron(00 16 ? * MON-FRI *)
A stack ficará da seguinte maneira:
No exemplo acima temos uma função que será executada de segunda à sexta-feira às 16h (UTC), independente do dia do mês, mês e ano, onde:
cron(00 16 ? * MON-FRI *)
| | | | | |____ ano (todos os anos)
| | | | |________ dia da semana (seg à sex)
| | | |______________ mês (todos os meses)
| | |________________ dia do mês (indiferente)
| |___________________ hora (16h - UTC)
|______________________ minuto
Crontab.guru — GUI para criar e validar expressões cron (necessário realizar alterações manuais para converter para a sintaxe da AWS, mas um ótimo ponto de partida)
Rate (a cada X tempo)
Outra alternativa é a de definir a função para ser executada a cada X tempo, isto também pode ser feito via tarefa Cron, porém utilizando rate
diretamente é possível garantir que o intervalo definido será respeitado, independente de outras variáveis como a hora atual, dia, mês, ano, etc.
A configuração é ainda mais simples, bastando definir a propriedade rate
com um agendamento do tipo rate()
(Isso mesmo! Redundante não!? 😁)
No exemplo acima a função será executada a cada duas horas.
Múltiplos agendamentos
É possível definir também múltiplos agendamentos para uma única função, ficando da seguinte maneira:
events:
- schedule:
rate:
- cron(00 16 ? * MON-FRI *)
- rate(2 hours)
A configuração acima executará a função:
- a cada duas horas; E
- de segunda à sexta-feira (independente do dia do mês, mês e ano) às 16:00 UTC.
Monitoramento
É possível monitorar a execução e disparo dos gatilhos via métricas do CloudWatch ou diretamente no EventBridge via console da AWS.
TL;DR
- Na stack do Serverless Framework declare dentro da seção
functions
emevents
o tiposchedule
(functions.events.schedule
); - Escolha o tipo de agendamento desejado:
cron()
[Tarefas Cron] ourate()
[execução a cada X tempo] - Para
cron()
a AWS possui uma sintaxe derivada que exigirá pequenos ajustes — leia mais aqui. (Ex.:cron (00 16 ? * MON-FRI *)
) - Para
rate()
basta apenas declarar o período desejado (Ex.:rate(2 hours)
)