Nosso time de engenharia realiza várias entregas diariamente em produção e o tempo de cada deploy pode variar.
Em uma de nossas retrospectivas um membro do time citou que o tempo de deploy estava aumentando ao longo dos sprints, mas não sabia precisar qual era essa taxa de crescimento.
Como ação da retrospectiva surgiu a iniciativa de que fosse desenvolvida alguma solução automática e confiável que pudesse medir o tempo gasto em cada etapa de cada processo de deploy.
Ficou decidido que uma solução simples e que seria facilmente integrada com nosso fluxo de entregas seria o desenvolvimento de uma API que recebesse uma requisição HTTP e salvasse os parâmetros para que eles pudessem ser analizados posteriormente.
Portanto convidamos-o para nos auxiliar com resolução do nosso problema como seu desafio técnico.
Você deverá desenvolver uma aplicação simples que receba uma requisição HTTP com os seguintes parâmetros:
- Componente: Componente que está em processo de deploy
- Versão: Versão que está sendo entregue
- Responsável: Nome do membro do time de engenharia que está realizando o processo de deploy
- Status: Status do processo de deploy
Sua aplicação deverá persistir todos os dados recebidos e o horário que a chamada foi recebida, ou seja, sua aplicação deverá salvar as seguintes informações:
- Componente: Componente que está em processo de deploy
- Versão: Versão que está sendo entregue
- Responsável: Nome do membro do time de engenharia que está realizando o processo de deploy
- Status: Status do processo de deploy
- Data: data com horário que a chamada foi recebida
Os dados devem ser salvos da maneira e no formato que preferir, de forma que não agregue complexidade desnecessária na sua solução ou que o impeça de completar sua tarefa, porém é importante que nenhum dado seja perdido.
Embora não faça parte do desafio recuperar ou retornar os dados recebidos é importante que os dados sejam salvos de forma que a recuperação ou o export destes dados para uma planilha seja simples e rápido.
Como não conseguiria aprender e executar a tempo como criar e orquestar conteiners (docker) a tempo da entrega a única forma que consegui preparar foi por meio de uma API com serviços serverless (API Gateway com funções Lambda).
Também não consegui preparar de forma correta todo o cloudformation para a criação do ambiente. Portanto, dividi as etapas conforme abaixo.
A forma abaixo foi como consegui documentar a medida que desenvolvia o projeto.
Usei alguns treinamentos da Udemy como referência, mas como havia dito, a curva de aprendizado pra mim é muito grande, ainda não sei por onde começar esse desenvolvimento.
Não entendi como criar uma solução para extrair as informações para excel.
- Criar uma nova tabela usando o arquivo para cloudformation DynamoDB-TB_deploy-lifetime-spam.json.
-
Para a função Lambda de gravação:
- Criar uma policy para permitir somente gravação (PutItem) na tabela criada para a função Lambda associando ao ARN da tabela criada (deploy-store-data-pl.json).
- Criação de uma role para permitir a função lambda a execução de pesquisas na tabela criada no DynamoDB (deploy-store-data-role).
- Atachar a policy AWSLambdaBasicExecutionRole a role criada para permitir a função lambda criar e gerenciar seus logs.
-
Para a função Lambda de pesquisa:
- Criar uma policy para permitir somente leitura (GetItem e Scan) na tabela criada para a função Lambda associando ao ARN da tabela criada (deploy-get-data-pl.json).
- Criação de uma role para permitir a função lambda a execução de pesquisas na tabela criada no DynamoDB (deploy-get-data-role).
- Atachar a policy AWSLambdaBasicExecutionRole a role criada para permitir a função lambda criar e gerenciar seus logs.
-
Criar uma função Lambda em python 2.7 para inserir dados na tabela:
- A função deve utilizar a role criada para permitir a gravação de dados na tabela.
- usar o código newpost.py para a função.
- Usa a chave DB_TABLE_NAME com valor igual ao nome da tabela (deploy-life-spam)
-
Criar uma função Lambda em python 2.7 para obter dados da tabela:
- A função deve utilizar a role criada para permitir a pesquisa de dados na tabela.
- usar o código getpost.py para a função.
Disponibilizado os arquivos API.json, API+AWS.json e mappings.json para criação da API.
- Data Model: definição dos modelos de entrada e saída para os metodos GET DeployGetData.json e POST DeployStoreData.json
- Para a função GET foi definido uma string para o parametro de query do Method Request (postId) permitindo enviar o tipo de query que se deseja realizar.
- Criação de um bucket para o conteúdo estático.
- O Bucket deve estar configurado para hospedar conteúdo estático.
- O Bucket deve conter a policy do documeto bucketpolicypermissions.json.
- Upload dos arquivos index.html, scripts.js e styles.css no bucket.
Realizar o upload dos arquivos para o bucket criado.
- Index.html para apresentação da página
- style.scc para definição do estilo da página
- script.js contendo a função de pesquisa das informações cadastradas
- Foi disponibilizado o arquivo requestScript.js para realizar a requisição http para inclusão do registro na tabela