DEV Community

Cover image for ECS Blue/Green com CodePipeline - Provisionado com Terraform
Paulo Ponciano for AWS Community Builders

Posted on • Edited on

ECS Blue/Green com CodePipeline - Provisionado com Terraform

Arquitetura do Lab

Arquitetura do lab de ECS Blue/Green com CodePipeline

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:

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
tofu plan --var-file variables.tfvars
tofu apply --var-file variables.tfvars
Enter fullscreen mode Exit fullscreen mode

Output:

Output do tofu apply criando a infraestrutura

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

Tela de conexões do CodePipeline com a opção 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):

Instalação do app de integração do CodeStar no GitHub

Conexão 'Available':

Conexão CodeStar x GitHub com status Available

Primeira execução da pipeline

No CodePipeline, vemos que a execução inicial falhou no stage de Source. Após o setup anterior da conexão CodeStar x GitHub, podemos executar 'Release change' para que a pipeline seja executada novamente:

Pipeline com falha no stage de Source

Botão Release change na pipeline

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

Pipeline executada com sucesso em todos os stages

Artefatos do CodePipeline no S3:

Artefatos do CodePipeline armazenados no bucket S3

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

Aplicação demo em execução no ECS

Se olharmos as tasks em execução no ECS, vemos que existem duas (definido em variables.tfvars), com a Task definition na revisão 32:

Duas tasks em execução no ECS 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.

Listener rules do Load balancer direcionando o tráfego para o Target group green

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

Alteração no templates/hello.html enviada para o GitHub

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

Pipeline acionada novamente após o push

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.

Stage de Build no CodeBuild gerando a docker image

Imagem no ECR:

Imagem da app demo publicada 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).

Stage de Deploy no CodeDeploy iniciando o deployment

Deployment:

Progresso do deployment Blue/Green no CodeDeploy

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

Novas tasks na revisão 33 ainda sem 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:

CodeDeploy fazendo o shift de tráfego entre os Target groups

Target group após o shift:

Target group após o shift de tráfego

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:

Tasks antigas da revisão 32 em estado Stopped

Stage de Deploy concluído com sucesso

Todos os stages concluídos:

Todos os stages da pipeline 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:

Nova versão da app demo entregue e 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 repositório. O restante da entrega ficará por conta do CodePipeline, é assim que deve ser.

E claro, essa pipeline está implementando em um único 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! 🐳

Top comments (1)

Collapse
 
carlosfilho profile image
Carlos Filho AWS Community Builders

Amazing, Paulo!
Terraform is our lives.