Uma maneira de executar tarefas cron na nuvem é usar uma função como serviço (FaaS), como o Lambda no ecossistema da AWS.

As funções são executadas quando acionadas e executam código na nuvem sem a necessidade de provisionar ou manter qualquer infraestrutura. Além disso, as funções podem ser configuradas para serem executadas em um determinado momento ou com certa periodicidade, como trabalhos cron tradicionais.

Nesta postagem do blog, usarei o ecossistema da AWS para mostrar um exemplo concreto de como criar uma tarefa cron usando uma função na nuvem.

Eventos do Amazon CloudWatch

Para usar uma função Lambda como uma tarefa cron, precisamos entender os eventos do Amazon CloudWatch.

Os eventos do Amazon CloudWatch são enviados quando há alterações nos recursos da AWS. Esses eventos podem disparar uma função do AWS Lambda. Quando seus recursos da AWS mudam de estado, eles enviam automaticamente eventos do CloudWatch para o fluxo de eventos.

Portanto, você pode criar uma regra que dispara uma função Lambda específica quando algo acontece. Por exemplo, você pode invocar automaticamente uma função Lambda quando houver uma alteração em um grupo de AutoScaling.

Além disso, os eventos do CloudWatch podem chamar uma função Lambda para executar regularmente. Dessa forma, você pode ter, por exemplo, uma função Lambda que desativa todas as suas instâncias de teste e desenvolvimento EC2 após as 18h e outra que as ativa após as oito da manhã.

diagram2
Quando há uma alteração em um grupo de dimensionamento automático, o evento de observação na nuvem gerado aciona uma função Lambda

Configurando a demo

Quero mostrar um exemplo de uma função Lambda que pode executar ações em suas instâncias do EC2. Eu vou estar usando AWS SAM definir minha função Lambda como infraestrutura como código.

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

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

Neste exemplo, iniciaremos e paramos instâncias do EC2 usando duas AWS Lambdas diferentes que são acionadas em um determinado momento. Estamos iniciando as instâncias às 8h todos os dias e desativando-as às 18h quando o dia termina.

Para isso, usaremos um evento CloudWatch para acionar o Lambda no momento certo e também o AWS SDK para executar as operações nas instâncias.

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

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

Quando você estiver 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 este projeto para ser executado com êxito.

video1 1
Como implantar o projeto na nuvem usando o AWS SAM CLI

A primeira coisa que você precisa definir é uma nome para o seu projeto. Então você definirá o região onde está sendo implantado – escolha o mesmo onde estão suas instâncias do EC2. Em seguida, precisamos fornecer ao script deploy lista das instâncias que queremos manipular. E então terminamos – ele implantará o projeto em nossa conta da AWS.

Definindo a função AWS Lambda

A primeira coisa que quero mostrar é como definimos uma função do AWS Lambda que é acionada em um horário específico usando o AWS SAM. Esta definição estará no arquivo chamado “template.yml”.

Imagem post
AWS SAM da função StartInstance

É assim que uma função se parece. Vejamos as linhas importantes:

A primeira linha é o nome da função, neste caso “StartInstanceFunction”.

Então nós temos o “PropriedadesDefinição. A primeira propriedade é a “Handler”. Aqui vamos especificar o módulo (arquivo) onde está o código que precisa executar e, em seguida, o método dentro desse módulo.

E então nós temos o “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 o “Tempo de execuçãoDefinição. Eu usarei o NodeJS versão 12, mas você pode usar Python, Java, Go, C # ou o que o fizer feliz. O Lambda suporta vários tempos de execução fora da caixa e você pode trazer seu próprio tempo de execução se você quiser.

Então nós temos o “Meio Ambiente”Definição que usaremos para definir a única variável ambiental. Essa variável nos permitirá enviar para o código dinamicamente diferentes IDs de instâncias, dependendo da configuração quando implementamos.

Depois disso, temos uma seção chamada “Políticas”, Onde definimos as permissões que essa função Lambda específica terá.

É importante saber que todas as funções do Lambda são criadas sem nenhuma permissão. Isso significa que eles não podem fazer nada com outros recursos da AWS.

Para que essa função Lambda inicie uma instância do EC2, ela precisa de permissões para executar essa ação específica naquele recurso específico da AWS. Nesta política em particular, estamos concedendo permissões para iniciar TODAS as instâncias do EC2 nesta conta da AWS. ALL é representado com o “*” na seção de recursos.

Se você tem esse código em execução na produção, recomendo que você limite os recursos exatamente àqueles que você deseja que este Lambda possa iniciar.

E, finalmente, a última seção é a “Eventos” seção. Aqui vamos definir como essa função Lambda será acionada. Essa função será acionada com um evento agendado do CloudWatch que aciona o Lambda todos os dias às 8 da manhã. Basicamente às 8 todos os dias, ele liga todas as instâncias do EC2 que você especificar.

Existem muitas regras para formar essa expressão cron: por exemplo, para dizer que você deseja que isso seja executado apenas de segunda a sexta-feira, escreva cron (0 8? * MON-FRI *). Você pode encontrar mais informações no site de documentação dos eventos do CloudWatch aqui: https://docs.aws.amazon.com/lambda/latest/dg/services-cloudwatchevents-expressions.html.

Codificando 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 fica assim:

vZxQeuu9uphLodP3t eEqtJ fAxN4HMOsIcKgRq9Nmq5yCCyJCw BE5U57pMiPLfG uaoDhH4r0bboqo5MVfgDQ92td0dkvlNEBbhE2r5qUjoAvbWGDHQsOzBDWmA DYJosJfL7T
Código da função startInstance

Este método será chamado quando a função for acionada todos os dias às 8h. Ele obterá a lista de instâncias do EC2 de uma variável ambiental pela qual passamos todos os IDs das instâncias durante o tempo de implantação. Em seguida, ele criará uma matriz deles.

Quando houver, chamará o AWS SDK e enviará o ID da matriz de instâncias como parâmetro. E se houver algum erro, ele será registrado e concluído. Imediatamente após este Lambda concluir a execução, você pode acessar o console do EC2 e ver como suas instâncias são ativadas.

start instances
Instâncias do EC2 iniciando automaticamente quando a função Lambda é executada

A função para desativar as instâncias do EC2 é muito semelhante, com algumas diferenças. Você pode encontrar o código para essa função neste ligação e confira.

Executando o Trabalho Cron

Para executar esse trabalho cron, não há muito o que fazer. Depois que as duas funções forem implantadas em sua conta da AWS, na mesma região que suas instâncias, elas executarão e farão o que foram programadas para fazer.

Imagem post
Funções do AWS Lambda para iniciar e parar instâncias implantadas na minha conta da AWS

Agora você precisa esperar até 8 ou 18 para ver se eles funcionam. Ou, se você quiser testá-lo agora, altere o horário do evento na definição do Lambda para um horário que funcione para você. Certifique-se de que a instância esteja ativada se você estiver planejando desativá-las ou vice-versa, para poder ver as alterações.

Agora espere e veja o que acontece no console do EC2. Logo após o tempo de configuração, a instância será ativada ou desativada e, em seguida, você fará o oposto na outra hora que configurar. Isso vai durar para sempre até você remover as funções do Lambda.

Limpando sua conta da AWS

Depois de concluir esta demonstração, recomendo que você desative (ou remova a instância que você criou para testar) e remova as funções do Lambda que você acabou de criar.

Remover as funções lambda é tão fácil quanto acessar o serviço CloudFormation no console de gerenciamento da AWS e remover a pilha de recursos que o AWS SAM criou.

Também não se esqueça de encerrar e remover as instâncias do EC2 se você as criou para esta demonstração.

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

Concluir

As funções do AWS Lambda são uma ferramenta muito útil para executar todos os tipos de tarefas em sua conta da AWS. Basicamente, você pode receber notificações de quaisquer alterações nos recursos da AWS por meio de eventos do CloudWatch e, em seguida, pode acessar quase todos os serviços usando o AWS SDK. Assim, você pode executar todos os tipos de tarefas de manutenção e tarefas automatizadas em sua infraestrutura.

Obrigado pela leitura.

Sou Marcia Villalba, advogada de desenvolvedores da AWS e apresentadora de um canal do YouTube chamado FooBar, onde tenho mais de 250 tutoriais em vídeo sobre práticas sem servidor, AWS e engenheiro de software.