ECS Blue/Green com CodePipeline - Provisionado com Terraform

Paulo Ponciano - Nov 30 - - Dev Community

Arquitetura do Lab

Image description

Repositórios:

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:

appspec.yaml
buildspec.yaml
taskdef.json

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
Enter fullscreen mode Exit fullscreen mode

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"
...
Enter fullscreen mode Exit fullscreen mode

Agora executamos o terraform para criar toda a estrutura:

tofu init
Enter fullscreen mode Exit fullscreen mode
tofu plan --var-file variables.tfvars
Enter fullscreen mode Exit fullscreen mode
tofu apply --var-file variables.tfvars
Enter fullscreen mode Exit fullscreen mode

Output:

Image description

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':

Image description

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):

Image description

Conexão 'Available':

Image description

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:

Image description

Image description

Dessa vez com a conexão 'Available', a pipeline é executada com sucesso:

Image description

Artefatos do CodePipeline no S3:

Image description

Agora a aplicação demo está disponível e executando no ECS:

Image description

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:

Image description

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.

Image description

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):

Image description

Isso irá acionar novamente a pipeline nos stages de Source, Build e Deploy:

Image description

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.

Image description

Imagem no ECR:

Image description

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).

Image description

Deployment:

Image description

Novas tasks executando, com revisão 33. Até esse momento, essas tasks não estão recebendo tráfego do Load balancer:

Image description

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:

Image description

Target group após o shift:

Image description

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:

Image description

Image description

Todos os stages concluídos:

Image description

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:

Image description


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! 🐳

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .