Artigo original: Cron Job AWS Lambda Functions Tutorial – How to Schedule Tasks

Os Cron Jobs são normalmente usados para agendar comandos em um horário específico. Você pode usá-los para tarefas como executar backups, monitorar o status do sistema ou executar tarefas de manutenção do sistema.

Os Cron Jobs são utilitários úteis para os administradores de sistemas. Quando você está administrando um sistema na nuvem, os Cron Jobs ainda são muito úteis – afinal, você ainda precisa fazer muitas tarefas administrativas nos sistemas.

Uma maneira de executar Cron Jobs na nuvem é usar uma função como um serviço (FaaS), como a Lambda no ecossistema AWS.

As funções executam quando são acionadas para isso e executam o código na nuvem sem a necessidade de prover ou manter qualquer infraestrutura. Elas também podem ser configuradas para serem executadas em um determinado momento ou com certa periodicidade, como os Cron Jobs tradicionais.

Neste artigo, usarei o ecossistema AWS para mostrar um exemplo concreto de como criar um Cron Job usando uma função na nuvem.

Eventos da Amazon CloudWatch

A fim de usar a função Lambda como um Cron Job, precisamos entender os eventos da Amazon CloudWatch.

Os eventos da Amazon CloudWatch são enviados quando há mudanças nos recursos da AWS. Esses eventos podem acionar uma função AWS Lambda. Quando os seus recursos da AWS mudam de estado, eles automaticamente enviam eventos CloudWatch para o stream de eventos.

Portanto, você pode criar uma regra que aciona uma função Lambda específica quando algo acontece. Por exemplo, você pode invocar automaticamente uma função Lambda quando há uma mudança em um grupo AutoScaling.

Além disso, os eventos CloudWatch podem invocar uma função Lambda para ser executada regularmente. Deste modo, você pode ter, por exemplo, uma função Lambda que desativa todos os seus testes e desenvolvimento em EC2 depois das 18h e outra que os ativa após as 8h.

diagram2
Quando há uma mudança em um grupo AutoScaling, o evento de CloudWatch gerado aciona uma função Lambda

Configurando a demonstração

Quero mostrar a você um exemplo de uma função Lambda que pode realizar ações em suas instâncias da EC2. Vou usar o AWS SAM para definir a minha função Lambda como infraestrutura como código.

Se você quiser experimentar essa demonstração, precisará ter uma conta na AWS e uma ou mais instâncias da EC2 configuradas em sua conta da AWS. Estas são as que vamos manipular a partir das funções Lambda. As instâncias da EC2 são a versão da AWS das máquinas virtuais na nuvem.

Você pode tentar a demonstração no IDE AWS Cloud9 (um IDE baseado em navegador), já que o AWS SAM já está configurado nesse IDE. Se você quiser saber como usar a IDE AWS Cloud9 para operar as funções Lambda, você pode conferir este vídeo (em inglês).

Neste exemplo, vamos começar e parar as instâncias da EC2 usando duas funções Lambda da AWS diferentes, que são acionadas em um determinado momento. Vamos iniciar as instâncias às 8h todos os dias e desativá-las às 18h, quando o dia terminar.

Para isso, vamos usar um evento CloudWatch para acionar a função Lambda no momento certo, além do AWS SDK para realizar as operações nas instâncias.

digram1-1
Em um momento específico, é acionada uma função Lambda que operará em um conjunto de instâncias da EC2

O código finalizado para o exemplo está disponível neste repositório do GitHub. Para que esse código funcione no IDE AWS Cloud9, você precisa configurar a sua conta do GitHub no IDE para poder clonar o projeto e depois cloná-lo dentro do IDE.

Quando tiver isso pronto, basta executar este comando dentro do diretório clonado:

$ sam deploy --guided

Ao executar esse comando, você receberá um conjunto de perguntas que precisa responder para configurar o projeto para que ele seja executado com sucesso.

video1-1
Como fazer o deploy do projeto na nuvem usando a CLI do AWS SAM

A primeira coisa que você precisa definir é um nome para o seu projeto. Em seguida, você definirá a região onde ele está sendo implantado – escolha a mesma região onde estão suas instâncias da EC2. Depois, precisamos dar ao roteiro de deploy uma lista das instâncias que queremos manipular. Estamos prontos – o deploy do projeto será feito em nossa conta da AWS.

Definindo a função AWS Lambda

A primeira coisa que quero mostrar a você é como definimos uma função AWS Lambda, que é acionada em um tempo específico usando o AWS SAM. Esta definição estará no arquivo chamado "template.yml".

lambda-iac-start
AWS SAM da função StartInstance

Essa é a aparência de uma função. Vejamos as linhas importantes:

A primeira linha é o nome da função – nesse caso, "StartInstanceFunction".

Depois, temos a definição de "Properties". A primeira propriedade é o "Handler". Aqui, especificaremos o módulo (arquivo) onde está o código que precisa ser executado e, depois, o método dentro desse módulo.

Então, temos "CodeUri", que é o caminho que mostra onde encontrar esse arquivo. Nesse caso, nosso código estará dentro de um diretório chamado "cron" em um arquivo chamado "handler.js" e em um método chamado "startInstance".

Depois disso, temos a definição de "Runtime". Usarei o NodeJS versão 12, mas você pode usar Python, Java, Go, C# ou qualquer outra linguagem de sua preferência. A Lambda suporta múltiplos tempos de execução desde o princípio e você pode usar seu próprio ambiente de tempo de execução, se quiser (links em inglês).

Temos a definição de "Environment", que usaremos para definir a única variável de ambiente. Essa variável nos permitirá enviar o código dinamicamente para diferentes instâncias de ids, dependendo da configuração de quando fazemos o deploy.

Depois disso, temos uma seção chamada "Policies", que é onde definimos as permissões que essa função Lambda específica terá.

É importante saber que todas as funções Lambda são criadas sem nenhuma permissão. Isso significa que elas não podem fazer nada em nenhum outro recurso da AWS.

Para que essa função Lambda possa iniciar uma instância da EC2, ela precisa de permissões para fazer essa ação específica sobre esse recurso específico da AWS. Nessa política específica, estamos concedendo permissões para iniciar TODAS as instâncias da EC2 nessa conta da AWS. TODAS são representadas com o "*" na seção de recursos.

Se você tiver esse código em produção, recomendo que você limite os recursos exatamente àqueles que você deseja que essa função Lambda possa iniciar.

Finalmente, a última seção é a seção "Events". Aqui, definiremos como essa função Lambda será acionada. Essa função será acionada com um evento CloudWatch agendado, que acionará a Lambda todos os dias às 8 da manhã. Basicamente, às 8 todos os dias, ela ativará todas as instâncias da EC2 que você especificar.

Há muitas regras para formar essa expressão Cron: por exemplo, para dizer que você gostaria que ela funcionasse apenas de segunda a sexta-feira (em inglês, MONday-FRIday), escreva cron(0 8 ? * MON-FRI *). Você pode encontrar mais informações no site da documentação dos eventos CloudWatch aqui.

Programando a função AWS Lambda

Agora que definimos a função Lambda, precisamos fornecer algum código para ela. Na pasta "cron", no arquivo "handler.js", precisamos adicionar o método chamado "startInstance", que tem esta aparência:

lambda-code-start
Código da função startInstance

Este método será chamado quando a função for acionada todos os dias às 8 horas da manhã. Ele obterá a lista de instâncias da EC2 a partir de uma variável de ambiente em que passamos todas as ids de instâncias durante o tempo de deploy. Em seguida, ele criará um array com essas instâncias.

Quando tiver esse array, ele chamará o AWS SDK e enviará o array de ids de instâncias como um parâmetro. Se houver algum erro, ele o registrará e o completará. Imediatamente após essa Lambda terminar a execução, você pode ir até o seu console da EC2 e ver que suas instâncias foram ativadas.

start-instances
As instâncias da EC2 iniciam automaticamente quando a função Lambda é executada

A função de desativar as instâncias da EC2 é muito semelhante, com algumas pequenas diferenças. Você pode encontrar o código para essa função neste link e verificá-lo.

Executando o Cron Job

Para executar esse Cron Job, não há muito o que fazer. Depois de feito o deploy das duas funções em sua conta da AWS, na mesma região em que as suas instâncias estão, elas executarão e farão o que foram programadas para fazer.

lambda-console-1
A AWS Lambda funciona para iniciar e parar instâncias implantadas na minha conta da AWS

Agora, é preciso esperar até as 8h ou 18h para ver se elas funcionam. Se você quiser testar agora mesmo, mude o horário do evento na definição Lambda para um horário que sirva para você. Certifique-se de que a instância esteja ligada se você estiver planejando desligá-las ou o contrário, para que você possa ver as mudanças.

Espere e veja o que acontece no console da EC2. Logo após a configuração, você verá a instância ser ativada ou desativada na hora que você configurar. Isto continuará para sempre até que você remova as funções Lambda.

Limpeza da sua conta AWS

Após completar essa demonstração, recomendo que você desligue (ou remova a instância que criou para testar) e remova as funções Lambda que você acabou de criar.

A remoção das funções Lambda é tão fácil quanto colocá-las no seu serviço CloudFormation. Em seu console de gerenciamento da AWS, remova a pilha de recursos que o AWS SAM criou.

Não se esqueça de encerrar e remover as instâncias da EC2 se você as criou apenas para essa demonstração.

delete-lambda
Como remover as funções AWS Lambda que criamos nesta demonstração

Para concluir

As funções AWS Lambda são uma ferramenta muito útil para realizar todos os tipos de tarefas em sua conta da AWS. Você pode, basicamente, obter notificações de qualquer mudança nos recursos da AWS através dos eventos CloudWatch e, então, pode acessar quase todos os serviços usando o AWS SDK. Assim, você pode realizar todos os tipos de tarefas de manutenção e tarefas automatizadas em sua infraestrutura.

Obrigado pela leitura.

A autora se chama Marcia Villalba, advocate de desenvolvimento da AWS e apresentadora de um canal no YouTube chamado FooBar, onde você encontrará mais de 250 tutoriais em vídeo sobre Serverless, AWS e práticas de engenharia de software.