Tarefas agendadas na AWS: Apresentação do “Events”

por Paul Williams

Se você é como eu, tem uma máquina antiquada com um monte de scripts Python que escreveu ao longo dos anos. Normalmente, são cron jobs (comandos programados), tarefas agendadas e outros códigos necessários para manter as coisas funcionando.

Mas na nuvem podemos tirar proveito da escalabilidade, da elasticidade e de conceitos como o auto-scaling (escalabilidade automática) e o auto-healing (restauração automática) para consolidar e automatizar essas atividades da maneira ideal.

O AWS CloudWatch Events proporciona justamente essa capacidade. Em vez de criar uma instância com uma função especial fora dos grupos de auto-scaling, podemos aproveitar o poder dos produtos e ferramentas da AWS. Acho que posso explicar melhor com um exemplo — acompanhe em casa!

Lembre-se de que este exemplo vai direcioná-lo à criação de Recursos AWS, e isso pode ser cobrado.

Cronjob “Olá mundo”

Vamos mergulhar no poder disponível nativamente na AWS. Usando uma série de serviços — o AWS CloudWatch, o AWS Lambda e o Amazon S3 —, vamos criar uma tarefa agendada bastante simples, que imprime “Olá, mundo!” em um arquivo com carimbo de hora em um bucket S3 (compartimento que armazena objetos).

O AWS Lambda tem a vantagem de poder executar Python, Node.js e Java, portanto podemos escrever nossas tarefas e funções na linguagem com a qual estamos mais familiarizados. Isso oferece um alto nível de flexibilidade.

A composição do script propriamente dita está um pouco fora do escopo deste texto, e a seguir temos um script Node.js simples que usa o AWS SDK embutido para escrever “Olá, mundo!” em um objeto S3 com uma chave do carimbo de data e hora atuais dentro de um bucket S3, que pode ser definido pelo usuário. Vamos definir essa variável mais adiante, depois de fazer o agendamento. Pense nisso como introduzir uma variável na linha de comando.

Screen Shot 2016-07-13 at 2.50.44 PM

Agora podemos importar isso para o Lambda, o que também é bastante simples. Existe até um editor alinhado! Entre no Lambda com o Console AWS e clique em “Iniciar” ou “Criar uma função Lambda”, dependendo da tela que aparecer. Ambos o levarão para esta tela:

AWS-Events1

O que vemos é uma seleção de modelos pré-definidos da AWS. Não queremos usar um modelo pré-definido agora, então role até o final e clique em “Pular”.

AWS-Events2

Você chegará na tela acima. Dê à sua função um nome descritivo e certifique-se de que o tempo de execução está definido para Node.js. Agora você pode colar o script acima no editor de código, abaixo de “Lambda function code” (código da função Lambda). O botão “Editar código em linha” deve estar marcado.

Rolando um pouco mais para baixo, encontrará algumas opções adicionais para configurar:

AWS-Events3

Você pode manter o manipulador padrão (index.handler) e selecionar “função de execução S3” no menu próximo a “Função”. Você entrará no IAM para confirmar essa ação — agora está dando ao script acesso aos itens Get e Put no S3. O documento de diretivas pode ser inspecionado no IAM.

O limite de memória padrão de 128 MB é perfeitamente suficiente, assim como o tempo limite de 3 segundos. Esse script não precisa ser executado em um VPC, então eu seleciono “Sem VPC” e clico em “Avançar”. Verifique se está tudo certo e clique em “Criar função”.

Essa é a parte mais difícil, acredite se quiser — falta apenas configurar o script para rodar no horário definido. É aqui que usamos o CloudWatch Events.

A magia do Events

O CloudWatch Events permite disparar “eventos” quando algo acontece dentro da sua conta AWS. É um trabalho com um escopo bem amplo, mas um dos recursos disponíveis é o Agendamento. Ele aceita uma simples escolha de frequência em um menu, ou uma sequência de caracteres Cron mais complexa (bastante similar às usadas no /etc/crontab).

Vamos configurar o nosso agendamento para escrever no bucket a cada 5 minutos. Primeiro precisamos criar um bucket S3. Vou deixar esse exercício a cargo do leitor! Quando tiver o nome do seu bucket, deixe-o à mão — vamos usar o CloudWatch Events para passar o nome do bucket para o nosso script. Para estes exemplos, criei um bucket chamado “rackspace-blog-scheduled-events”.

Entre no CloudWatch com o Console AWS e clique em “Eventos” do lado esquerdo. Na tela inicial, clique em “Criar regra”.

AWS-Events4

Preencha o formulário. À esquerda, no “Seletor de eventos”, você pode escolher a origem do evento. Aqui queremos “Agendamento”. Selecionando “Agendamento”, aparecerão algumas opções:

AWS-Events5

Você pode criar expressões cron complicadas para designar agendamentos bastante específicos, mas para a nossa finalidade aqui vamos escolher um intervalo fixo de 5 minutos. Na parte direita da tela, clique em “Adicionar destino”. Essa é a função (ou as funções) que será executada cada vez que o agendamento for acionado.

AWS-Events6

A “função Lambda” deve ser selecionada no topo, e em seguida a função criada anteriormente. Agora podemos passar a configuração e as variáveis para o script. Nesse caso, queremos configurar o bucket S3 no qual vamos escrever. Clique em “Configurar entrada”, escolha “Constante (texto JSON)” e insira o seguinte JSON no campo (não se esqueça de substituir o nome do bucket):

Screen Shot 2016-07-13 at 2.51.08 PM

Clique em “Configurar detalhes” e dê um nome à sua nova regra. Deve ser um nome descritivo, para que você o identifique entre as centenas de regras que provavelmente vai criar. Defina o Estado como “Ativado” e clique em “Criar regra”.

Pronto! Sua função será executada a cada 5 minutos e colocará uma chave com carimbo de hora no seu bucket S3 com o conteúdo “Olá, mundo!” Simples! Sem servidores para manter, sem rede com a qual se preocupar e sem bibliotecas para atualizar.

Se necessário, temos acesso total ao nosso VPC e à AWS API, e tudo que precisamos fazer é escrever um código que faça exatamente o que queremos. Foco, simplicidade, harmonia.

Infinitas possibilidades

Agora você pode configurar outros eventos para escrever em diversos buckets a intervalos distintos, disparar a mesma função Lambda várias vezes no mesmo agendamento (passando parâmetros diferentes), ou até mesmo executar múltiplas funções Lambda! Recomendo que você experimente todas essas configurações.

Dentro da Rackspace (e especificamente na minha equipe), usamos exatamente esse método para gerenciar os backups dos clientes no nível de serviço “Aviador” do Suporte Fanático para AWS. Nossos agendamentos e scripts fazem uso total da API da AWS para gerenciar instantâneos, fazer backup de diretivas de retenção e remover instantâneos antigos automaticamente, e sem a intervenção de nenhum membro da equipe.

Somos alertados se o backup falhar por alguma razão e então agimos, em vez de perder tempo verificando diariamente se o servidor de backup está funcionando. Isso elimina uma tarefa administrativa entediante que ocuparia um engenheiro várias horas por semana.

Praticamente qualquer tarefa agendada pode ser replicada com o método acima. Meu desafio para você é automatizar alguma coisa usando o CloudWatch Events e o Lambda. Talvez a geração de um relatório seminal dos dados dos clientes ou uma tarefa para indexar um banco de dados ou possivelmente para escalar verticalmente seus grupos de AutoScaling em horários específicos do dia (ou mês, ou ano…).

Talvez algo completamente diferente! Deixe seus recursos de computação trabalharem para você e coloque suas tarefas agendadas nas mãos mais que capazes do CloudWatch Events.

LEAVE A REPLY

Please enter your comment!
Please enter your name here