DEV Community

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

Posted on

2 1 1 1 1

ECS Blue/Green com CodePipeline - Provisionado com Terraform

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

Top comments (1)

Collapse
 
carlosfilho profile image
Carlos Filho

Amazing, Paulo!
Terraform is our lives.

Best Practices for Running  Container WordPress on AWS (ECS, EFS, RDS, ELB) using CDK cover image

Best Practices for Running Container WordPress on AWS (ECS, EFS, RDS, ELB) using CDK

This post discusses the process of migrating a growing WordPress eShop business to AWS using AWS CDK for an easily scalable, high availability architecture. The detailed structure encompasses several pillars: Compute, Storage, Database, Cache, CDN, DNS, Security, and Backup.

Read full post