Mais conteúdo relacionado Semelhante a Melhores práticas de CI/CD na construção de aplicações modernas (20) Mais de Amazon Web Services LATAM (20) Melhores práticas de CI/CD na construção de aplicações modernas1. © 2020, Amazon Web Services, Inc. or its Affiliates.
Fernando Sapata
LatAm Business Development Manager,
Serverless
Melhores práticas de CI/CD para
construir aplicações modernas
Bruno Emer
Sr. Container Specialist SA
2. © 2020, Amazon Web Services, Inc. or its Affiliates.
CI/CD para aplicações modernas
IntegraçãoContínua (Continuous Integration)
Deploy contínuo (Continuous Deployment)
Infraestrutura como código
Agenda
3. © 2020, Amazon Web Services, Inc. or its Affiliates.
CI/CD para aplicações modernas
4. © 2020, Amazon Web Services, Inc. or its Affiliates.
• Aceleração da entrega de novos serviços com alta qualidade
• Simplificação no manuseio de ambientes
• Redução do impacto na alteração de código
• Automação de operações
• Ganho de insights
• Proteja o cliente e o negócio
Abordagens para o desenvolvimento de aplicações
modernas
5. © 2020, Amazon Web Services, Inc. or its Affiliates.
• Aceleração da entrega de novos serviços com alta qualidade CI/CD
• Simplificação no manuseio de ambientesTecnologias serverless
• Redução do impacto na alteração de código Arquitetura de microserviços
• Automação de operações Infraestrutura como código
• Ganho de insights Observação
• Proteja o cliente e o negócio Segurança fim-a-fim e conformidade
Abordagens para o desenvolvimento de aplicações
modernas
6. © 2020, Amazon Web Services, Inc. or its Affiliates.
Source: 2018 DORA State of DevOps report
Deploy mais frequente Semana – Mês Hora – Dia
Melhora o tempo de entrega 1–6 meses 1–7 dias
Diminui a taxa de erro 46–60% 0–15%
Efeitos do CI/CD
7. © 2020, Amazon Web Services, Inc. or its Affiliates.
Infraestrutura
como código
Deploy
contínuo
Integração
contínua
Pilares para entregar um aplicação moderna
8. © 2020, Amazon Web Services, Inc. or its Affiliates.
Integração Contínua
9. © 2020, Amazon Web Services, Inc. or its Affiliates.
Integração contínua
Código Build Teste Produção
Objetivos da integração contínua
10. © 2020, Amazon Web Services, Inc. or its Affiliates.
Integração contínua
1. Automaticamente inicia um novo build quando o código é inserido
2. Realiza o build e testa o código em um ambiente consistente e replicável
3. Continuamente gera um artefato pronto para deploy
4. Continuamente finaliza o ciclo de feedback quando um build falha
Objetivos da integração contínua
11. © 2020, Amazon Web Services, Inc. or its Affiliates.
• Entrega continuamente serviços para uma rápida e confiável
atualização das aplicações
• Modele e visualize os processos de release da sua aplicação
• Faça build, testes e deploy do seu código toda vez que ocorrer
uma mudança
• Se integra com ferramentas terceiras e com a AWS
AWS CodePipeline
12. © 2020, Amazon Web Services, Inc. or its Affiliates.
Amazon EC2
AWS CodeDeploy
AWS Elastic Beanstalk
AWS OpsWorks stacks
Containers
AWS CodeDeploy
Amazon ECS
Amazon ECS (blue/green)
AWS Fargate
Serverless
AWS CodeDeploy
AWS CloudFormation
(AWS SAM)
AWS Lambda
AWS CodePipeline: serviços suportados
13. © 2020, Amazon Web Services, Inc. or its Affiliates.
• Serviço de build totalmente gerenciado que compila o
código-fonte, executa testes e cria pacotes de software
• Escala continuamente e processa vários builds
simultaneamente
• Nenhum servidor de build para você gerenciar
• Pague por minuto, apenas pelos recursos de computação que
você utiliza
• É possível monitorar os builds através de eventos do Amazon
CloudWatch
AWS CodeBuild
14. © 2020, Amazon Web Services, Inc. or its Affiliates.
• Cada compilação é executada em um novo container Docker
para um ambiente consistente e imutável
• O Docker e o AWS CLI são instalados em todas as imagens
oficiais do CodeBuild
• Forneça ambientes de construção personalizados adequados
às suas necessidades por meio do uso de imagens
customizadas
AWS CodeBuild
15. © 2020, Amazon Web Services, Inc. or its Affiliates.
version: 0.2
phases:
build:
commands:
- npm ci
- npm test
- aws cloudformation package
--template-file template.yml
--output-template template-output.yml
--s3_bucket $BUCKET
artifacts:
type: zip
files:
- template-output.yml
AWS CodeBuild: especificação de build do Lambda
16. © 2020, Amazon Web Services, Inc. or its Affiliates.
version: 0.2
phases:
build:
commands:
- $(aws ecr get-login --no-include-email)
- docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG .
- docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $ECR_REPO:$IMAGE_TAG
- docker push $ECR_REPO:$IMAGE_TAG
AWS CodeBuild: especificação do Docker build
17. © 2020, Amazon Web Services, Inc. or its Affiliates.
Deploy contínuo
18. © 2020, Amazon Web Services, Inc. or its Affiliates.
Deploy contínuo
Código Build Teste Produção
Objetivos do deploy contínuo
19. © 2020, Amazon Web Services, Inc. or its Affiliates.
Deploy contínuo
1. Implante automaticamente novas versões em ambientes de teste
2. Implante em produção com segurança e sem impacto aos clientes
3. Realize entregas mais frequentes
Objetivos do deploy contínuo
20. © 2020, Amazon Web Services, Inc. or its Affiliates.
• Lida com a complexidade de atualizar suas aplicações
• Evite o tempo de inatividade durante o deploy das
aplicações
• Faça rollback automaticamente em caso de falhas
• Faça o deploy em instâncias EC2, AWS Lambda ou
servidores locais
AWS CodeDeploy
21. © 2020, Amazon Web Services, Inc. or its Affiliates.
version: 0.0
os: linux
files:
- source: /
destination: /var/www/html
permissions:
- object: /var/www/html
pattern: “*.html”
owner: root
group: root
mode: 755
hooks:
ApplicationStop:
- location: scripts/deregister_from_elb.sh
BeforeInstall:
- location: scripts/install_dependencies.sh
ApplicationStart:
- location: scripts/start_httpd.sh
ValidateService:
- location: scripts/test_site.sh
- location: scripts/register_with_elb.sh
CodeDeploy-EC2 deployments
22. © 2020, Amazon Web Services, Inc. or its Affiliates.
v2 v2 v2 v2 v2 v2
Um por vez
Metade por vez
Todos de uma vez só
v2 v2 v2 v1 v1 v1
v2 v1 v1 v1 v1 v1 Agent
Grupo de implantação de desenvolvimento
Ou
Grupo de implantação de produção
Agent
Agent Agent Agent
Agent Agent Agent
Escolha a velocidade de implantação e o grupo
23. © 2020, Amazon Web Services, Inc. or its Affiliates.
• Altere o tráfego usando alias ponderados
• Canary (“envie 10% do tráfego por 10 minutos, depois envie o restante”) ou linear
(“envie 10% a mais de tráfego a cada 10 minutos”)
• Os “hooks” de validação permitem testes em cada estágio da implantação
• Rollback em segundos, caso haja falha nos “hooks” de validação ou alarmes do
CloudWatch
• Monitore o status e o histórico da implantação pela console, API, notificações do
Amazon SNS e eventos do CloudWatch
CodeDeploy-Lambda deployments
24. © 2020, Amazon Web Services, Inc. or its Affiliates.
Selecione a estratégia de deploy no template da aplicação
Resources:
GetFunction:
Type: AWS::Serverless::Function
Properties:
DeploymentPreference:
Type: Canary10Percent10Minutes
Alarms:
- !Ref ErrorsAlarm
Hooks:
PreTraffic: !Ref PreTrafficHook
CodeDeploy-Lambda deployments
25. © 2020, Amazon Web Services, Inc. or its Affiliates.
CodeDeploy agora automatiza implantações
blue / green para o AWS Fargate e o Amazon ECS
AWS CodeDeploy
26. © 2020, Amazon Web Services, Inc. or its Affiliates.
• Provisiona tarefas “green”, em seguida, redireciona o tráfego no balanceador de carga
• Os “hooks” de validação permitem testes em cada estágio da implantação
• Rollback rápido para tarefas "blue" em segundos
• Monitore o status e o histórico da implantação pela console, API, notificações do
Amazon SNS e eventos do CloudWatch
• Você pode utilizar a ação "CodeDeploy-ECS" no CodePipeline ou o comando "aws ecs
deploy" no Jenkins
Implantações CodeDeploy-ECS blue/green deployment
27. © 2020, Amazon Web Services, Inc. or its Affiliates.
version: 1.0
Resources:
- TargetService:
Type: AWS::ECS::Service
Properties:
- TaskDefinition: "my_task_definition:8"
LoadBalancerInfos:
- ContainerName: "SampleApp"
ContainerPort: 80
Hooks:
- BeforeInstall: "LambdaFunctionToExecuteAnythingBeforeNewRevisionInstalltion"
- AfterInstall: "LambdaFunctionToExecuteAnythingAfterNewRevisionInstallation"
- AfterAllowTestTraffic: "LambdaFunctionToValidateAfterTestTrafficShift"
- BeforeAllowTraffic: "LambdaFunctionToValidateBeforeTrafficShift"
- AfterAllowTraffic: "LambdaFunctionToValidateAfterTrafficShift"
CodeDeploy-ECS AppSpec
28. © 2020, Amazon Web Services, Inc. or its Affiliates.
Balanceador
de Carga
Tráfego em
produção
(porta 80)
Target Group
1
Tarefa blue:
código v1
100% do
tráfego
em
produção
Serviço
Fargate
CodeDeploy-ECS blue/green deployment
29. © 2020, Amazon Web Services, Inc. or its Affiliates.
Balanceador
de Carga
Tráfego em
teste (porta
9000)
Tráfego em
produção
(porta 80)
Target Group
2
Target Group
1
Tarefa blue:
código v1
Serviço
Fargate
100% do
tráfego
em
produção
CodeDeploy-ECS blue/green deployment
30. © 2020, Amazon Web Services, Inc. or its Affiliates.
Balanceador
de Carga
Tráfego em
teste (porta
9000)
Tráfego em
produção
(porta 80)
Target Group
2
Target Group
1
Tarefa blue:
código v1
Tarefa green:
código v2
Provisonamento da terefa green
Serviço
Fargate
100% do
tráfego
em
produção
CodeDeploy-ECS blue/green deployment
31. © 2020, Amazon Web Services, Inc. or its Affiliates.
Balanceador
de Carga
Tráfego em
teste (porta
9000)
Tráfego em
produção
(porta 80)
Target Group
2
Target Group
1
Tarefa blue:
código v1
Tarefa green:
código v2
100%
Tráfego
de teste
Executa os testes antes da tarefa green receber tráfego de produção
Serviço
Fargate
100% do
tráfego
em
produção
CodeDeploy-ECS blue/green deployment
32. © 2020, Amazon Web Services, Inc. or its Affiliates.
Balanceador
de Carga
Tráfego em
teste (porta
9000)
Tráfego em
produção
(porta 80)
Target Group
2
Target Group
1
Tarefa blue:
código v1
Tarefa green:
código v2
100%
Tráfego
em
produção
Altera o tráfego para tarefas green, rollback em caso de alarme
Serviço
Fargate
0% do
tráfego
em
produção
CodeDeploy-ECS blue/green deployment
33. © 2020, Amazon Web Services, Inc. or its Affiliates.
Balanceador
de Carga
Tráfego em
teste (porta
9000)
Tráfego em
produção
(porta 80)
Target Group
2
Target Group
1
Tarefa green:
código v2
Finalizar a tarefa blue
Serviço
Fargate
100%
Tráfego
em
produção
CodeDeploy-ECS blue/green deployment
34. © 2020, Amazon Web Services, Inc. or its Affiliates.
• As tags do Docker são resolvidas quando cada container é iniciado, não apenas durante
os deploys
• Realizar o deploy da tag “latest” ou “prod” pode resultar em código não testado na
produção após um evento de scale-out
• Use tags "imutáveis" exclusivas para deploys
Tag nas imagens de container para deploy
35. © 2020, Amazon Web Services, Inc. or its Affiliates.
Imagem: tag “latest”
Serviço
Fargate
Repositório
ECR
Imagem: sha256@11111... (“latest”)
Tag nas imagens de container para deploy
36. © 2020, Amazon Web Services, Inc. or its Affiliates.
Imagem: tag “latest”
Build utiliza a imagem “latest”
Imagem: sha256@11111...
Imagem: sha256@22222... (“latest”)
Serviço
Fargate
Repositório
ECR
Tag nas imagens de container para deploy
37. © 2020, Amazon Web Services, Inc. or its Affiliates.
Imagem: tag “latest”
Aplicação escala, lançando novas tarefas
Imagem: sha256@11111...
Imagem: sha256@22222... (“latest”)
Serviço
Fargate
Repositório
ECR
Tag nas imagens de container para deploy
38. © 2020, Amazon Web Services, Inc. or its Affiliates.
Implantar usando tags imutáveis
{
"name": ”sample-app",
"image": "amazon/amazon-ecs-
sample@sha256:3e39d933b1d948c92309bb583b5a1f3d28f0119e1551ca1fe538ba414a41af48d"
}
{
"name": ”sample-app",
"image": "amazon/amazon-ecs-sample:build-b2085490-359f-4eaf-8970-6d1e26c354f0"
}
SHA256 Digest
Build ID
Tag nas imagens de container para deploy
39. © 2020, Amazon Web Services, Inc. or its Affiliates.
Utilize tags imutáveis durante o build
SHA256 Digest
export IMAGE_URI=`docker inspect --format='{{index .RepoDigests 0}}' my_image:$IMAGE_TAG
Exemplo:
amazon/amazon-ecs-sample@sha256:3e39d933b...
Build ID
export IMAGE_TAG=build-`echo $CODEBUILD_BUILD_ID | awk –F":" ‘{print $2}’`
Exemplo:
build-b2085490-359f-4eaf-8970-6d1e26c354f0
Tag nas imagens de container para deploy
40. © 2020, Amazon Web Services, Inc. or its Affiliates.
Imagem: “build-11111” tag
Imagem: sha256@11111... (“build-11111”)
Serviço
Fargate
Repositório
ECR
Tag nas imagens de container para deploy
41. © 2020, Amazon Web Services, Inc. or its Affiliates.
Imagem: tag “build-11111”
O processo de build gera nova imagem e um novo ID de compilação
Imagem: sha256@11111... (“build-11111”)
Imagem: sha256@22222... (“build-22222”)
Serviço
Fargate
Repositório
ECR
Tag nas imagens de container para deploy
42. © 2020, Amazon Web Services, Inc. or its Affiliates.
Imagem: tag “build-11111”
Aplicação escala, lançando novas tarefas
Imagem: sha256@11111... (“build-11111”)
Imagem: sha256@22222... (“build-22222”)
Serviço
Fargate
Repositório
ECR
Tag nas imagens de container para deploy
43. © 2020, Amazon Web Services, Inc. or its Affiliates.
Imagem: tag “build-22222”
O deploy atualiza a definição da tarefa, substituindo as tarefas
Imagem: sha256@11111... (“build-11111”)
Imagem: sha256@22222... (“build-22222”)
Serviço
Fargate
Repositório
ECR
Tag nas imagens de container para deploy
44. © 2020, Amazon Web Services, Inc. or its Affiliates.
Infraestrutura como código
45. © 2020, Amazon Web Services, Inc. or its Affiliates.
• Aceleração da entrega de novos serviços com alta qualidade CI/CD
• Simplificação no manuseio de ambientesTecnologias serverless
• Redução do impacto na alteração de código Arquitetura de microserviços
• Automação de operações Infraestrutura como código
• Ganho de insights Observação
• Proteja o cliente e o negócio Segurança fim-a-fim e conformidade
Abordagens para o desenvolvimento de aplicações
modernas
46. © 2020, Amazon Web Services, Inc. or its Affiliates.
Infrastrutura como código
Código Build Teste Produção
Objetivos de infraestrutura como código
47. © 2020, Amazon Web Services, Inc. or its Affiliates.
Infrastrutura como código
1. Tornar as alterações de infraestrutura replicáveis e previsíveis
2. Liberar alterações de infraestrutura usando as mesmas ferramentas que utilizamos nas
alterações de código
3. Replicar o ambiente de produção em outros ambientes permitindo testes contínuos
Objetivos de infraestrutura como código
48. © 2020, Amazon Web Services, Inc. or its Affiliates.
“Master”
branch
Código Fonte Build Teste Produção
Criar template Criar e executar as
alterações
Criar e executar as
alterações
Entregando infraestrutura como código
49. © 2020, Amazon Web Services, Inc. or its Affiliates.
https://aws.amazon.com/serverless/sam/
• Framework open source para build de aplicações serverless
na AWS
• Sintaxe abreviada para declarar funções, APIs, bancos de
dados e mapeamentos de origem de eventos
• Transforma a sintaxe do AWS SAM na sintaxe do AWS
CloudFormation no deploy
• Suporta todos os tipos de recursos do AWS CloudFormation
AWS Serverless Application Model (AWS SAM)
50. © 2020, Amazon Web Services, Inc. or its Affiliates.
Sintaxe abreviada
para declarar
funções, tabelas e
eventos
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Resources:
GetFunction:
Type: AWS::Serverless::Function
Properties:
Handler: index.get
Runtime: nodejs6.10
CodeUri: src/
Policies: AmazonDynamoDBReadOnlyAccess
Events:
GetResource:
Type: Api
Properties:
Path: /resource/{resourceId}
Method: get
Table:
Type: AWS::Serverless::SimpleTable
AWS SAM template
51. © 2020, Amazon Web Services, Inc. or its Affiliates.
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Resources:
GetFunction:
Type: AWS::Serverless::Function
Properties:
Handler: index.get
Runtime: nodejs6.10
CodeUri: src/
Policies: AmazonDynamoDBReadOnlyAccess
Events:
GetResource:
Type: Api
Properties:
Path: /resource/{resourceId}
Method: get
Table:
Type: AWS::Serverless::SimpleTable
Apenas 18 linhas criam muitos recursos:
• Função AWS Lambda
• Amazon API Gateway
• Tabela do Amazon DynamoDB
• Roles do IAM
AWS SAM template
52. © 2020, Amazon Web Services, Inc. or its Affiliates.
pip install --user aws-sam-cli
sam init
sam build
sam package
sam deploy
Use a CLI do SAM para empacotar e realizar deploys
53. © 2020, Amazon Web Services, Inc. or its Affiliates.
• Framework open source para definir infraestrutura com
TypeScript
• Fornece bibliotecas de tipos de recursos (construtores) com
práticas recomendadas pela AWS, incorporadas por padrão,
distribuídas como módulos npm
• Provisiona recursos utilizando o AWS CloudFormation
• Suporta todos os tipos de recursos do AWS CloudFormation
AWS
CDK
https://awslabs.github.io/aws-cdk
AWS Cloud Development Kit (AWS CDK)
54. © 2020, Amazon Web Services, Inc. or its Affiliates.
import ec2 = require('@aws-cdk/aws-ec2');
import ecs = require('@aws-cdk/aws-ecs');
import cdk = require('@aws-cdk/cdk');
class BonjourFargate extends cdk.Stack {
constructor(parent: cdk.App, name: string, props?: cdk.StackProps) {
super(parent, name, props);
const vpc = new ec2.VpcNetwork(this, 'MyVpc', { maxAZs: 2 });
const cluster = new ecs.Cluster(this, 'Cluster', { vpc });
new ecs.LoadBalancedFargateService(
this, "FargateService", {
cluster,
image: ecs.DockerHub.image("amazon/amazon-ecs-sample"),
});
}
}
const app = new cdk.App();
new BonjourFargate(app, 'Bonjour');
app.run();
A classeVPC inclui
VPC, sub-redes,
grupos de segurança,
gateway de internet,
gateways NAT e
tabelas de
roteamento
Template AWS CDK
55. © 2020, Amazon Web Services, Inc. or its Affiliates.
import ec2 = require('@aws-cdk/aws-ec2');
import ecs = require('@aws-cdk/aws-ecs');
import cdk = require('@aws-cdk/cdk');
class BonjourFargate extends cdk.Stack {
constructor(parent: cdk.App, name: string, props?: cdk.StackProps) {
super(parent, name, props);
const vpc = new ec2.VpcNetwork(this, 'MyVpc', { maxAZs: 2 });
const cluster = new ecs.Cluster(this, 'Cluster', { vpc });
new ecs.LoadBalancedFargateService(
this, "FargateService", {
cluster,
image: ecs.DockerHub.image("amazon/amazon-ecs-sample"),
});
}
}
const app = new cdk.App();
new BonjourFargate(app, 'Bonjour');
app.run();
A classe Fargate inclui o
serviço ECS, definição de
tarefa do ECS, balanceador
de carga, grupos de destino
e, opcionalmente, registro
de alias no Amazon Route
53
Template AWS CDK
56. © 2020, Amazon Web Services, Inc. or its Affiliates.
22 linhas de código
TypeScript geram
mais de 400 linhas do
CloudFormation
import ec2 = require('@aws-cdk/aws-ec2');
import ecs = require('@aws-cdk/aws-ecs');
import cdk = require('@aws-cdk/cdk');
class BonjourFargate extends cdk.Stack {
constructor(parent: cdk.App, name: string, props?: cdk.StackProps) {
super(parent, name, props);
const vpc = new ec2.VpcNetwork(this, 'MyVpc', { maxAZs: 2 });
const cluster = new ecs.Cluster(this, 'Cluster', { vpc });
new ecs.LoadBalancedFargateService(
this, "FargateService", {
cluster,
image: ecs.DockerHub.image("amazon/amazon-ecs-sample"),
});
}
}
const app = new cdk.App();
new BonjourFargate(app, 'Bonjour');
app.run();
Template AWS CDK
57. © 2020, Amazon Web Services, Inc. or its Affiliates.
• Minimize “copia e cola” usando linguagem orientada a objeto
• Defina o pipeline de microserviços em uma classe e em seguida reutilize em
vários pipelines
• O AWS CDK inclui muitos construtores para modelar um pipeline utilizando
o CodePipeline, incluindo a configuração automática de políticas do IAM
Pipelines com AWS CDK
58. © 2020, Amazon Web Services, Inc. or its Affiliates.
export class MyMicroservicePipeline extends cdk.Construct {
constructor(parent: cdk.Construct, name: string, props: MyMicroservicePipelineProps) {
super(parent, name);
const pipeline = new codepipeline.Pipeline(this, 'Pipeline', {
pipelineName: props.serviceName,
});
const githubAccessToken = new cdk.SecretParameter(this, 'GitHubToken',
{ ssmParameter: 'GitHubToken' });
new codepipeline.GitHubSourceAction(this, 'GitHubSource', {
stage: pipeline.addStage('Source'),
owner: 'myorg',
repo: props.serviceName,
oauthToken: githubAccessToken.value
});
…
AWS CDK pipelines: Definição
59. © 2020, Amazon Web Services, Inc. or its Affiliates.
import cdk = require('@aws-cdk/cdk');
import { MyMicroservicePipeline } from './pipeline';
class MyMicroservicePipelinesStack extends cdk.Stack {
constructor(parent: cdk.App, name: string, props?: cdk.StackProps) {
super(parent, name, props);
new MyMicroservicePipeline(this, 'Pipeline1', { 'serviceName': 'Microservice1' });
new MyMicroservicePipeline(this, 'Pipeline2', { 'serviceName': 'Microservice2' });
new MyMicroservicePipeline(this, 'Pipeline3', { 'serviceName': 'Microservice3' });
new MyMicroservicePipeline(this, 'Pipeline4', { 'serviceName': 'Microservice4' });
}
}
const app = new cdk.App();
new MyMicroservicePipelinesStack(app, 'MyMicroservicePipelines');
app.run();
AWS CDK pipelines: Utilização
60. © 2020, Amazon Web Services, Inc. or its Affiliates.
Obrigado!
Fernando Sapata
LatAm Business Development Manager,
Serverless
Bruno Emer
Sr. Container Specialist SA