Code Monkey home page Code Monkey logo

ec2_aws_automation's Introduction

Automatizar alteração do tipo de instancia EC2 usando Lambda e CloudWatch na AWS

Basicamente este tutorial permite alternar os tipos de instâncias EC2 automaticamente, essas alterações podem ser realizadas em horários ou dias específicos de acordo com sua necessidade.

Por exemplo: um servidor de produção que utiliza muitos recursos de CPU e Memória em virtude do alto número de acessos de usuários durante o dia. Porém das 18h:00min às 05h:00min, a quantidade de acessos diminui. Neste momento o tipo de instância EC2 pode ser alterado para um tipo que exija menos recursos de CPU e Memória e consequentemente diminuindo o valor cobrado dessa EC2. Este procedimento pode ser feito de forma automatizada e será mostrado abaixo.

Este foi um processo realizado na empresa em que trabalho. Entendo que existem outras formas de fazer e obter o mesmo resultado, porém o que estou compartilhando funcionou perfeitamente e obvite uma redução de custos $$$ considerável mensalmente.


OBS: Antes de iniciar, estou considerando que a(s) instância(s) EC2 já esteja(m) criada(s). Na imagem abaixo criei uma EC2 do tipo t2.nano chamada teste_prd:

image1


Passo 1: Criação da role (função)


  • Criar uma Role do tipo AWS service e selecionar o serviço AWS Lambda, clicar em next

image2


  • Procurar pela policy chamada "AWSLambdaBasicExecutionRole", selecioná-la e clicar em next

image3


  • Nesta tela, inserir um nome para a Role, no exemplo foi chamada de "ModifyEC2InstanceType", clicar no final da página em create role

image4


Passo 2: Criação da policy (política)

  • Criar uma nova Policy;
    • Selecionar o serviço: EC2;
    • Selecionar Actions e adicionar as seguintes permissões: StartInstances, StopInstances, ModifyInstanceAttribute, DescribeInstances;

image5


  • Selecionar Resources
    • Selecionar instance
      • Selecionar Add ARN

OBS: Deverá ser escolhida a região, conta e instância específica para que a automatização funcione, ou se desejar, poderá selecionar a opçao qualquer (any) para aceitar todas as regiões, contas e id's da aws.

  • Selecionar Add

image6


  • A configuração final de exemplo ficará como a imagem abaixo:

image7


  • Clicar em Next: Tags (Adicionar tags se desejar, neste exemplo não foi adicionado)

    • Clicar em Next: Review
  • Nesta tela informar o nome da policy (no exemplo foi chamada de StartStopEC2)

    • Clicar em Create policy

image8


  • A política criada ficará da seguinte forma:

image9


  • Acessar Roles pelo console da AWS

    • Selecionar a role que criamos no passo 1
    • Em Permissions clicar em Add permissions
      • Clicar em Attach policies
        • Procurar pela política criada acima, no caso do exemplo a política chama-se StartStopEC2
          • Depois de selecionada clicar em Add permissions
  • Por fim a role deverá estar de acordo com a imagem abaixo:

image9.1


Passo 3: Criação da função Lambda

  • Acessar o recurso Lambda no console da aws
    • Clicar em Create function
      • Selecionar Autor do zero (Author from scratch)
      • Informar o nome da função, no exemplo ficou como EC2Modify-t2medium
      • Em Tempo de Execução (Runtime) selecionar Python 3.9
      • Selecionar Architecture (Arquiterura) x86_64
    • Selecionar Alterar função de execução padrão (Change default execution role)
      • Selecionar Use an existing role (Usar uma função existente)
      • No campo Função existente (Existing role) selecionar a role criada no passo 1
    • Clicar em Create function

image10


  • Na tela seguinte, na aba lambda_function apagar o código atual colar o código python abaixo:
import json
import boto3
import time

client = boto3.client('ec2')

def lambda_handler(event, context):

    # Insert your Instance ID here
    my_instance = 'Your instance id '
    
    # Stop the instance
    client.stop_instances(InstanceIds=[my_instance])
    waiter=client.get_waiter('instance_stopped')
    waiter.wait(InstanceIds=[my_instance])
    
    # Change the instance type
    client.modify_instance_attribute(InstanceId=my_instance, Attribute='instanceType', Value='t2.medium')
    
    # Start the instance
    client.start_instances(InstanceIds=[my_instance])
  
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

image11


OBS:

  • As seguintes modificações deverão serem feitas no código python:
    • Alterar campo Your instance id para o id da sua instancia
    • Alterar o campo Instance type para o tipo de instancia que deseja que a EC2 mude

  • Na aba Configuration clicar em Edit
    • Alterar o campo Timeout para 2min
    • Clicar em Save

O campo Timeout é usado para definir o limite de tempo máximo que uma função Lambda pode ser executada antes que seja interrompida automaticamente. Ao definir um tempo limite para uma função Lambda, você pode garantir que ela seja interrompida automaticamente caso exceda o tempo especificado. Isso pode ajudar a evitar problemas de desempenho e garantir que sua função seja executada dentro dos limites de recursos alocados pela AWS.


image12


  • Voltar para a aba Code
    • Clicar em Deploy
    • Caso o precedimento realizado esteja correto, receberemos a seguinte mensagem no topo da tela "Successfully updated the function EC2StartStopFunction."

OBS: A função criada irá alterar o tipo de instancia EC2 de t2.nano para t2.medium. Agora é necessário criar outra função para alterar de t2.medium para t2.nano. É o mesmo procedimento realizado acima, mas será necessário alterar o campo Value do código python para t2.nano e inserir um novo nome para a segunda função, por conveniência a chamei de EC2Modify-t2nano


  • Depois de criada as duas funções, será mostrada da seguinte forma no recurso Lambda da AWS:

image12.1


Passo 4: Criando agendamento no CloudWatch

  • Acessar o recurso CloudWatch no console da AWS
    • Clicar em Events
      • Clicar em Rules
        • Clicar em Create rule
          • Em Event Source selecionar Cron expression
            • No exemplo foi definido para o evento ser executado todos os dias às 18h:00min
          • Em Targets selecionar Lambda function
            • Selecionar uma das funções criadas (no exemplo desejamos que após as 18h:00min o tipo da EC2 para t2.nano)
            • Clicar em Configure details

image13


  • Na próxima tela informar o nome para a nova rule (No exemplo será chamado de EC2-Modify-t2.nano)
  • Clicar em Create a rule

OBS: Se faz necessário criar uma segunda rule utilizando o mesmo procedimento acima, para que a instância EC2 volte para o tipo inicial. Quais as alterações dessa segunda rule em comparação com a primeira?

  • Alterar o Cron Expression para que seja ativado às 06h:00min
  • Selecionar a função lambda que modifica o tipo de instancia para t2.medium

  • Segue exemplo no imagem abaixo:

image13.1


Caso não sabia como usar expressões cron, essa é uma boa hora de aprender, deixarei um link de uma página que explica o básico sobre o assunto. É fácil.

Aprendendo_Expressões_Cron


Pronto! Agora sua EC2 alternará entre o tipo t2.nano e t2.medium diariamente dentro do horário estipulado.

Lembrando que este é um exemplo, você pode fazer o processo com qualquer tipo de instância disponibilizado na AWS.

Outra informação, lembre-se que no momento em que o tipo de instancia for alterado, a EC2 será desligada e depois religada automaticamente.

ec2_aws_automation's People

Contributors

guttoferreira avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.