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.
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.
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”.
É 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:
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.
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.
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.
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.