Arquitetura do Lab
Repositórios:
- Terraform: https://github.com/paulofponciano/ecs-with-fargate-and-cicd.git
- Demo app: https://github.com/paulofponciano/webapp-color.git
O que usamos como app para demo é um fork de kodekloudhub/webapp-color. No fork foram adicionados os arquivos necessários para o lab com ECS e CodePipeline.
Repositório App demo
No repositório webapp-color, existem arquivos importantes para a execução no CodePipeline, são eles:
Além é claro, do próprio código da app demo e o Dockerfile que será utilizado no build. Faça um fork do repositório com esses arquivos.
Deploy da infra
git clone https://github.com/paulofponciano/ecs-with-fargate-and-cicd.git
Em variables.tfvars, é importante notar os valores abaixo e alterar antes do apply. Levando em conta que, o domínio público já existe no Route 53:
# Trechos extraídos do tfvars
...
site_domain = "myapp.sevira.cloud"
...
github_repo = "paulofponciano/webapp-color"
github_branch = "master"
...
Agora executamos o terraform para criar toda a estrutura:
tofu init
tofu plan --var-file variables.tfvars
tofu apply --var-file variables.tfvars
Output:
Checando na Console
Integração CodeStar x GitHub
No serviço CodePipeline, vamos até Settings > Connections. É necessário aqui, finalizar o setup dessa conexão do CodeStar com GitHub. Selecione a conexão e depois 'Update pending connection':
Selecione 'Install a new app' caso ainda não tenha. Será necessário fazer login no GitHub através da integração e um app será criado. Selecione o app e siga em frente (Connect):
Conexão 'Available':
Primeira execução da pipeline
No CodePipeline, vemos que a execução inicial falhou no stage de Source. Após o setup aterior da conexão CodeStar x GitHub, podemos executar 'Release change' para que a pipeline seja executada novamente:
Dessa vez com a conexão 'Available', a pipeline é executada com sucesso:
Artefatos do CodePipeline no S3:
Agora a aplicação demo está disponível e executando no ECS:
Se olharmos as tasks em execução no ECS, vemos que existem duas (definido em variables.tfvars), em com a Task definition na revisão 32:
Em Listener rules do Load balancer, a regra que faz o forward para o Target group no momento está direcionando o tráfego para o Target group 'green'. Iniciamos com essa configuração em 'blue' (feito pelo terraform), mas a pipeline já foi executada com sucesso uma vez.
Subindo uma nova versão da app demo
Na app utilizada para demo, fazemos uma alteração em templates/hello.html, na sequência, enviamos as alterações para o GitHub (git push):
Isso irá acionar novamente a pipeline nos stages de Source, Build e Deploy:
Entendendo os stages
No stage de Source, basicamente o CodePipeline será acionado quando um push for realizado na branch 'master' do repositório que foi definido no setup via terraform. O código é clonado para ser utilizado na pipeline.
O stage de Build (CodeBuild) irá utilizar o arquivo buildspec.yaml do repositório da app demo como receita para o build, onde é gerada uma docker image e feito o push para o ECR.
Imagem no ECR:
No stage final, o de Deploy (CodeDeploy), podemos acompanhar o progresso através do deployment gerado, onde primeiro novas tasks serão criadas no ECS com a nova versão da app demo baseada em uma nova revisão da Task definition (taskdef.json).
Deployment:
Novas tasks executando, com revisão 33. Até esse momento, essas tasks não estão recebendo tráfego do Load balancer:
Nesse próximo step, o CodeDeploy faz um shift do tráfego para as novas tasks, isso através de uma alteração nos Target groups do Load balancer como vimos na primeira execução da pipeline:
Target group após o shift:
Lembrando que o Load balancer estava enviando tráfego para o Target group 'green'. No Target group 'blue', temos as novas tasks (revisão 33) registradas.
Após o período de 5 minutos, as tasks antigas (revisão 32) são colocadas em 'Stopped' e o stage de Deploy é concluído com sucesso:
Todos os stages concluídos:
Checando nova versão da app demo
Acessando novamente, podemos ver que a nova versão da app demo foi entregue e está recebendo tráfego:
Olhando tudo até aqui, vemos que as próximas ações serão focadas em desenvolver a aplicação e enviar o código para o respositório. O restante da entrega ficará por conta do CodePipeline, é assim que deve ser.
E claro, essa pipeline está implementando em um unico ambiente (env) ECS, é um lab! Na 'vida real' veremos outros stages como: deploy em dev/qas, testes, aprovações manuais para Production, etc.
Keep shipping! 🐳