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.

Tiago Boeing
3 min readSep 13, 2022

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

Imagem oficial da página do EventBridge (Fonte: AWS)

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.

Leia mais em Crontab Expressions na documentação da AWS

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:

Algumas propriedades foram omitidas como as declarações “provider” e “plugins” para simplificar o entendimento.

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!? 😁)

A função será executada a cada 2 horas

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.

Exemplo de monitoria de uma função acionada de maneira agendada.

TL;DR

  • Na stack do Serverless Framework declare dentro da seção functions em events o tipo schedule (functions.events.schedule);
  • Escolha o tipo de agendamento desejado: cron() [Tarefas Cron] ou rate() [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) )

Siga-me

GitHub | LinkedIn

--

--

Tiago Boeing

🇧🇷 Staff Software Engineer | AWS Community Builder | ⌨ Works at one of the biggest health insurance companies in Brazil | @tiagoboeing