Facilitando o Controle de Máquinas Virtuais na AWS

finops day
10 min readNov 8, 2023

--

Projeto de automação self-service

Este projeto simplifica o controle de máquinas virtuais na Amazon Web Services (AWS), tornando-o acessível para qualquer pessoa, mesmo sem conhecimento técnico avançado.

Como Funciona:

1. Interface Amigável:

Usando uma interface da web intuitiva, você preenche um formulário simples.

  • Este formulário requer três informações básicas: uma “chave” que descreve a ação desejada (como “ligar”), um “valor” que especifica a máquina que você deseja afetar e a “conta” na qual a ação deve ser realizada.

2. Clique e a Nuvem Age:

  • Com um simples clique no botão “Enviar”, você envia suas instruções para a nuvem AWS.

3. Automatização Inteligente:

  • A nuvem AWS recebe suas instruções e realiza automaticamente a ação desejada nas máquinas virtuais (chamadas de instâncias EC2).

4. Receba Feedback por E-mail:

  • Após a conclusão da operação, você recebe uma notificação por e-mail.
  • Após a cO e-mail informa se a ação foi executada com sucesso ou se encontrou algum problema.

Praticidade para Todos:

Este projeto foi projetado para tornar a administração de máquinas virtuais mais simples e acessível a todos. Imagine que, como gerente, você recebe uma chamada fora do horário comercial, pedindo para ligar uma máquina virtual. Com esse sistema, você pode facilmente fazer isso a partir de qualquer lugar com acesso à internet, sem depender de conhecimento técnico ou assistência de especialistas.

É uma solução prática que coloca o controle nas mãos dos usuários autorizados, facilitando o gerenciamento de máquinas virtuais na nuvem AWS.

Objetivo do Projeto:

Este projeto tem como objetivo criar um sistema que permita iniciar instâncias do Amazon Elastic Compute Cloud (EC2) com base em tags específicas. Os usuários podem enviar solicitações JSON via uma interface da web para iniciar ou parar instâncias EC2 em contas de destino específicas.

Componentes do Projeto:

1. AWS SES (Simple Email Service):

  • O AWS SES é um serviço de envio de e-mails na AWS. Neste projeto, ele é usado para enviar notificações por e-mail sobre o status das operações, como iniciar ou parar instâncias EC2.

2. AWS Lambda:

  • AWS Lambda é um serviço de computação serverless que permite executar código em resposta a eventos. A função Lambda neste projeto atua como um controlador principal. Ela recebe solicitações HTTP POST, processa os dados recebidos, inicia ou instâncias EC2 com base em tags e envia notificações por e-mail com base no resultado da operação.

3. API Gateway:

  • O AWS API Gateway é usado para criar uma interface HTTP para a função Lambda. Os usuários podem enviar solicitações JSON via esta API para iniciar ou parar instâncias EC2.

4. Amplify:

  • Amplify é um serviço da AWS que facilita a criação de aplicativos web e móveis. No código HTML e JavaScript fornecido, você encontra um formulário web simples que permite que os usuários forneçam informações, como a chave da tag, o valor da tag e a conta de destino. Quando os usuários preenchem o formulário e enviam os dados, o JavaScript faz uma solicitação para a API Gateway para acionar a função Lambda.

Fluxo do Projeto:

Aqui está um resumo do fluxo do projeto:

1. Os usuários preenchem um formulário web com informações, como a chave, valor e a conta de destino.

2. Quando o formulário é enviado, o JavaScript no código HTML faz uma solicitação POST para a API Gateway, passando os dados em formato JSON.

3. A API Gateway encaminha a solicitação para a função Lambda.

4. A função Lambda processa a solicitação, verifica se a tag está presente e se a conta de destino é válida.

5. Se as condições forem atendidas, a função Lambda assume um papel com as permissões apropriadas para acessar as instâncias EC2 nas contas de destino.

6. A função Lambda chama a função `get_instances_with_tag` para listar as instâncias EC2 com a tag especificada.

7. Em seguida, a função Lambda chama a função `start_instances` para iniciar as instâncias EC2 listadas e registra mensagens de sucesso ou erro.

8. Dependendo do resultado da operação, a função Lambda envia notificações por e-mail usando o AWS SES.

Este projeto é útil para automação de tarefas de gerenciamento de instâncias EC2 com base em tags específicas e fornece feedback aos usuários por meio de notificações por e-mail. Certifique-se de configurar corretamente as permissões e políticas de segurança em cada componente para garantir a segurança e a funcionalidade adequada.

Passo 1: Configuração Inicial

  • Verifique se você possui uma conta AWS ativa e configurada.
  • Certifique-se de que sua conta tem acesso à organização AWS.

Passo 2: Clone o Repositório do GitHub

  • Clone o repositório do projeto com o seguinte comando:
git clone https://github.com/finopsday/self-service-

Passo 3: Deploy usando o CloudFormation

  • Use os modelos CloudFormation `role.yml` e `role-stackset.yml` para criar as políticas e funções necessárias na AWS.
  • Importante: Ao definir as políticas do IAM, lembre-se de especificar o `Principal` como `AWS`: "arn:aws:iam::AccountID:root". Substitua `AccountID` pelo ID numérico da conta master AWS à qual você deseja conceder permissões.

Passo 4: Criação da Função Lambda no Console AWS

  • Crie funções AWS Lambda para lidar com solicitações feitas pela página web.
  • Configure as funções Lambda com as permissões adequadas para interagir com os recursos AWS, como EC2.

· Abra o console AWS Lambda.

· Clique em “Create function”.

· Selecione “Author from scratch”.

· Dê um nome para a sua função e selecione o runtime Python (Python 3.8).

· Selecione role que criamos utilizando o CloudFormation.

· Clique em “Create function”.

· Nas configurações aumente o tempo de timeout de acordo com o tamanho da sua infraestrutura.

Passo 5: Upload do Código

  • Na página da função Lambda, vá para a seção “Function code”.
  • Escolha a opção apropriada para fazer o upload do código, seja um arquivo .zip, um arquivo do Amazon S3 ou edite o código inline.
  • Faça o upload do seu código ou arquivo .zip.

Nessa parte é muito importante que você forneça o e-mail que receberá as execuções.

Forneça região que o serviço foi criado.

Aqui é importante você incluir o `AccountID` das contas de destino.

Se você quiser testar sua lambda, aqui está o formato do JSON (Crie um teste e forneça essa linha de código).

{
"httpMethod": "POST",
"body": "{\"tag\": \"produto:finops\", \"account\": \"ACCOUNTID\"}"
}

Lembre-se de mudar `ACCOUNTID` para o id da conta que você deseja testar

Obs: o código está disponível no pacote do git com o nome operacao-ec2-start.py.

Passo 6: Configurar o AWS API Gateway

  • Crie uma API no AWS API Gateway para expor os endpoints acessados pela página web.
  • Defina os métodos HTTP apropriados, como POST, para permitir que os usuários enviem solicitações para iniciar instâncias EC2.
  • Aqui configuramos endpoint público, para seu ambiente produtivo pense na criação de um endpoint privado, ou reforce sua segurança.

Siga os passos a seguir:

Vá para APis, logo em seguida localize REST API. Clique em Build

Escolha as opções abaixo e clique em Create.

Após a etapa acima, clique em Create method.

Em method type, selecione POST e Lambda function.

Neste momento você vai selecionar a lambda que foi criada acima, após isso clique em Create.

Para finalizar vamos deployar nossa api.

Clique em Deploy API.

Selecione stage: *New Stage*, de o nome que preferir.

Para finalizar, ao lado esquerdo clique em resources, logo em seguida clique em Enable Cors.

Marque a caixa de seleção para o método POST.

Clique em Save.

Faça o Deploy Api novamente, e selecione o estágio que criou.

Passo 7: Criar a Página Web

  • Utilize o AWS Amplify para criar a infraestrutura necessária para hospedar uma página web estática.
  • Aponte o arquivo `index.html` para a API criada no passo anterior.
  • Faça o upload do arquivo `index.html` e de outros recursos, como imagens, para o AWS Amplify.

Siga os passos a seguir para incluir o projeto.

Antes de iniciarmos, precisamos apontar nosso arquivo index.hml para api que foi criada no passo anterior.

Vá para API Gateway, localize sua api criada, clique em stages na tela que vai se abrir, procure por invoke URL.

Com API em mãos, localize o arquivo index.html no repositório que você clonou anteriormente.

Com o arquivo aberto, localize a linha 113 e altere o api que está no arquivo para o do seu projeto.

Salve o arquivo, em seguida você vai precisar zipar o arquivo index.html e a imagem porquinho.jpeg.

Vá para o console do AWS Amplify.

Clique em GET STARTED.

Escolha Amplify Hosting.

Selecione Deploy without git provider.

Em AppName escolha o nome do seu projeto.

Escolha Drag and drop e selecione o arquivo zip que você criou anteriormente.

Clique em Save and Deploy.

Seu ambiente será criado, você já vai poder acessar a página web.

Observação: Essa página está visível publicamente, qualquer pessoal que tenha essa url será capaz de acessar sua página.

Para proteger sua página web, podemos incluir login e senha para que apenas pessoas autorizadas possam acessar.

Volte para o console do amplify, no menu lateral clique em Access control.

Após isso, clique em Manage access e crie seu login e senha.

Passo 8: Configurar SES para envio de e-mails

  • Use o serviço AWS Amazon SES para enviar notificações por e-mail aos usuários, informando o status de suas solicitações, como quando as instâncias EC2 estiverem prontas.

Vá para o AWS SES, no menu do lado esquerdo escolha "Verified identities", após isso clique em Create Identify.

Para teste configurei meu e-mail particular, mas utilize como desejar.

Insira seu e-mail e clique em create.

Após essa etapa chegará no seu e-mail um link de confirmação, abra esse link e seu AWS SES estará validado.

Passo 9: Teste e Implantação

  • Teste cuidadosamente o sistema para garantir que funcione conforme o esperado.
  • Realize implantações graduais, começando com ambientes de desenvolvimento e teste antes de implantar em produção, assegurando todas as etapas de segurança.

Com a página aberta, coloque a tag desejada e envie os dados.

Para esse projeto temos um um conjunto de 3 instancias com a tag:

produto:finops

Após a conclusão acima, você receberá um e-mail sobre atividade.

Lembre-se este é apenas um projeto, se for implementar em produção revise todos os pontos de segurança.

Passo 10: Documentação e Treinamento

  • Forneça documentação aos usuários para orientá-los sobre como usar a página web e solicitar instâncias EC2.
  • Ofereça treinamento ou suporte, se necessário.

Lembre-se de que este é um projeto complexo que requer planejamento detalhado e atenção às melhores práticas de segurança e AWS ao longo do processo. Certifique-se de manter a documentação atualizada e de revisar a segurança em todas as etapas do projeto.

Agradecimentos:

Um agradecimento especial a Antonio de Abreu e Rodrigo Ferradas pela valiosa contribuição e insights compartilhados. Seus conhecimentos têm sido essenciais para guiar a comunidade nas melhores práticas e estratégias.

Esperamos que isso ajude!

--

--