AWS — Ligando e Desligando uma Instância EC2 através do API Gateway
Controlando o inicio e desligamento de uma instância EC2 através de um API criada no serviço API Gateway ligado a uma função Lambda

Olá Gente
A beleza dos serviços da AWS estarem interligados é que você pode fazer ações em uma para afetar outra de forma extremamente fácil.
Neste tutorial iremos aprender como Ligar e Desligar uma instancia EC2 chamando uma API.
Exemplo (Nosso Objetivo):
https://www.apiaws.com.br/minhaapi/?Instancia=123&Regiao=us-east-1&Acao=Ligar
https://www.apiaws.com.br/minhaapi/?Instancia=123&Regiao=us-east-1&Acao=Desligar
Função Lambda
A primeira coisa a fazer é criar a função lambda que ira receber os comandos da API e executar na instância.
Entre na listagem de funções lambda e clique em “Criar Função”:
https://console.aws.amazon.com/lambda/home?region=us-east-1#/functions
Preencha o nome desejado e selecione a linguagem “Python 3.7”:

Clique em “Alterar a função de execução padrão” e selecione “Criar uma função com permissões básicas do Lambda”:

Agora clique em “Criar Função”:

Neste momento será aberto os detalhes da função, antes de começarmos a mexer com o Python iremos criar as permissões, para que nossa função tenha acesso as instâncias EC2.
Logo no topo da janela, clique em “Permissões”:

Em “Papel de execução” será exibido o nome da função que foi criada, clique no nome dela:

Será aberto uma nova janela que nos permite gerencia este acesso, nesta janela, clique na seta ao lado do nome da política:

Agora clique em “Editar Política”:

Na janela aberta, clique em “Adicionar permissões adicionais”:

Será aberto alguns campos, selecione conforme abaixo:
- Serviço: EC2
- Ações: Gravação-StartInstances / Gravação: StopInstances
- Recursos: Todos os recursos
A janela deve ficar semelhante a janela abaixo:

Clique em “Revisar Política” e na janela seguinte clique em “Salvar Alterações”:

Pronto, pode fechar esta janela e voltar para a função na aba de “Configurações”:

Em “Código da Função”, clique duas vezes em “lambda_function.py” para abrir a função:

Agora precisamos configurar o script que ira controlar o inicio e desligamento do servidor, para isto, copie o script abaixo e cole no editor:
Clique em “Deploy” para salvar as alterações em nossa função:

Antes de partirmos para a criação da API, vamos testar a função.
Clique em “Test”:

E preencha com o Json abaixo (Este Json será criado pela API com base nos parâmetros enviados na querystring):
No campo “Nome do Evento” preencha com alguma identificação do seu teste.
Clique em “Criar” para que nosso teste seja criado:

Agora clique novamente em “Test” para que nosso teste seja executado:

Se o teste tiver sucesso devemos receber a resposta “Ligado”:

Criando a API
Já temos a função, agora precisamos interligar a função lambda com o serviço API Gateway.
Entre em:
https://console.aws.amazon.com/apigateway/main/apis?region=us-east-1
Clique em “Criar API”:

Na seleção de “Tipo de API” clique em “Compilar” em “API REST”:

Em “Nome da API” preencha o nome desejado e clique em “Criar API”:

Em “Recursos” clique em “Criar Método”:

No campo aberto, selecione “GET” e clique no sinal de OK:

Clique em “GET” (Método recém criado):

Na janela aberta, selecione “Tipo de Integração: Função Lambda” e no campo “Função Lambda” digite o nome da função, após isto, clique em “Salvar”:

Será exibido um alerta relativo a permissão da função, clique em “OK”:

Agora temos de configurar a API para receber os parâmetros e enviar o Json para a função.
Clique em “Solicitação de método”:

Em “Parâmetros de string de consulta de URL” iremos inserir os 3 parâmetros que utilizaremos, devendo ficar igual a imagem abaixo:

Clique em “Execução de método” para voltar a janela anterior:

Clique em “Solicitação de integração”;

Clique em “Modelos de mapeamento”:

Na janela aberta, selecione “Quando não há modelos definidos (recomendado)”:

Agora clique em “Adicionar modelo de mapeamento” e preencha com “application/json” e clique no sinal de “OK”:

Abaixo deste campo, abriu um espaço para criarmos o Json, preencha conforme abaixo (Neste espaço iremos criar um json que será populado com os dados da querystring):
Clique em “Salvar”:

Clique em “Execução de método” para voltar a janela anterior:

Agora temos nossa API pronta, precisamos publicar ela.
Em “Recursos” clique em “/”:

Clique em “Ações” e em “Implantar API”:

Em “Estágio da Implantação” selecione “[novo estágio]”, preencha um nome para identificar e clique em “Implante”:

Pronto! Nossa API foi publicada! ❤
O “Link do endpoint” dela esta sendo exibido em “Invocar URL”:

Testando
Já temos a função, já temos a API, vamos Testar!
Basta chamada a URL do Endpoint, de sua API, inserindo os parâmetros:

Ligando a Instância:
https://XXXXXXX.execute-api.us-east-1.amazonaws.com/v1/?Instancia=123&Regiao=us-east-1&Acao=Ligar
Desligando a Instância:
https://XXXXXXX.execute-api.us-east-1.amazonaws.com/v1/?Instancia=123&Regiao=us-east-1&Acao=Desligar
Adendo: Identificamos ID da Instancia
Entre em:
https://console.aws.amazon.com/ec2/v2/home?region=us-east-1#Instances:
Nesta página são exibidas suas instancias.
Observe que o ID de sua instancia fica na coluna “ID da Instância”:

Por hoje é só, pessoal! 🛑
Até mais! 👋