Em Lambda e em contêiner não existe "copiar o pacote pra máquina". O que o CodeDeploy faz é trocar o tráfego: a versão nova sobe ao lado da velha, recebe uma fatia pequena (ou nada, enquanto você testa) e só depois recebe tudo. Se algo der errado, o tráfego volta — a versão velha nunca saiu do ar.
É o deploy sem medo de produção: no Lambda, o canary manda 10% das chamadas pra versão nova e espera; no ECS, as tarefas novas sobem atrás de um segundo target group e o load balancer troca de um pro outro de uma vez. Voltar atrás é mudar o ponteiro de volta, em segundos.
Cada um deles roda de verdade no terminal do CLImb, com a mesma saída e as mesmas mensagens de erro que a AWS devolve.
aws lambda create-functionaws lambda create-function
aws lambda create-function --function-name <nome> --runtime <runtime> --role <arn-da-role> --handler <arquivo.função> --zip-file fileb://<código.zip>
aws lambda publish-versionaws lambda publish-version
aws lambda publish-version --function-name processa-pedido
aws lambda create-aliasaws lambda create-alias
aws lambda create-alias --function-name processa-pedido \ --name prod --function-version 1
aws lambda get-aliasUSO
aws lambda get-alias --function-name <função> --name <alias>
aws deploy create-applicationUSO
aws deploy create-application --application-name <nome> [--compute-platform Server|Lambda|ECS]
aws deploy create-deployment-groupUSO
aws deploy create-deployment-group --application-name <app> --deployment-group-name <grupo> \ --service-role-arn arn:aws:iam::<conta>:role/<role> \ --ec2-tag-filters Key=<tag>,Value=<valor>,Type=KEY_AND_VALUE \ [--deployment-config-name CodeDeployDefault.OneAtATime] \ [--auto-rollback-configuration enabled=true,events=DEPLOYMENT_FAILURE]
aws lambda update-function-codeaws lambda update-function-code
aws lambda update-function-code --function-name processa-pedido \ --zip-file fileb://app.zip
aws deploy create-deploymentUSO
aws deploy create-deployment --application-name <app> --deployment-group-name <grupo> \ --s3-location bucket=<bucket>,key=<pacote.zip>,bundleType=zip \ [--deployment-config-name ...] [--description <texto>]
aws deploy get-deployment-targetUSO
aws deploy get-deployment-target --deployment-id <id> --target-id <i-...>
aws deploy stop-deploymentUSO
aws deploy stop-deployment --deployment-id <id>
aws ecs create-clusteraws ecs create-cluster
aws ecs create-cluster --cluster-name cluster-loja
aws ecs register-task-definitionaws ecs register-task-definition
aws ecs register-task-definition --family tarefa-web --container-definitions file://tarefa-web.json
aws ecs register-task-definition --family tarefa-web --container-definitions '[{"name":"web","image":"nginx:latest","memory":512}]'
aws elbv2 create-load-balancerUSO
aws elbv2 create-load-balancer --name loja-alb --subnets subnet-a subnet-b
aws elbv2 create-target-groupUSO
aws elbv2 create-target-group --name loja-tg --protocol HTTP --port 80 --vpc-id vpc-xxxx
aws elbv2 create-listenerUSO
aws elbv2 create-listener --load-balancer-arn <arn> --protocol HTTP --port 80 --default-actions Type=forward,TargetGroupArn=<tg-arn>
aws ecs create-serviceaws ecs create-service
aws ecs create-service --cluster cluster-loja --service-name servico-web --task-definition tarefa-web --desired-count 2
aws elbv2 describe-listenersUSO
aws elbv2 describe-listeners --load-balancer-arn <arn> | --listener-arns <arn>
aws deploy continue-deploymentUSO
aws deploy continue-deployment --deployment-id <id> [--deployment-wait-type READY_WAIT|TERMINATION_WAIT]
Cada atividade é um pedido de trabalho, do jeito que ele chega no dia a dia — você resolve digitando os comandos, não escolhendo alternativa.
O time de pagamentos tem uma API de cobrança em Lambda e quer trocar de versão sem derrubar ninguém. Comece pela função: crie a cobranca-api (python3.12, handler app.handler, role arn:aws:iam::123456789012:role/cobranca-role, código no app.zip).
O CodeDeploy troca tráfego entre VERSÕES — o $LATEST não serve, porque muda a cada deploy. Publique a versão 1 da cobranca-api com a descrição primeira.
Quem chama a API não deve saber número de versão. Crie o alias producao apontando pra versão 1.
Confira o alias producao: a versão e o ARN que os clientes usam.
Crie no CodeDeploy a aplicação cobranca-lambda para a plataforma Lambda.
Crie o grupo cobranca-producao na cobranca-lambda com a role arn:aws:iam::123456789012:role/codedeploy-servico e a configuração CodeDeployDefault.LambdaCanary10Percent5Minutes: 10% das chamadas vão pra versão nova primeiro, o resto depois.
O time corrigiu o cálculo de juros. Suba o código novo (app.zip) na cobranca-api — isso muda só o $LATEST; o alias continua na versão 1.
Publique a versão 2 da cobranca-api (descrição juros-corrigidos) — é ela que o deploy vai levar pro alias.
Leia o revisao-cobranca-v2.json: é a revisão do deploy. Dentro do content, o appspec diz qual alias (producao) sai de qual versão (CurrentVersion 1) pra qual (TargetVersion 2).
Entregue a versão 2 no grupo cobranca-producao usando a revisão revisao-cobranca-v2.json.
Consulte o deploy uma vez e olhe o alias producao: ele continua na versão 1, mas com um RoutingConfig mandando 10% das chamadas pra versão 2. É o canary acontecendo.
Os 5 minutos de canary passaram sem erro. Consulte o deploy até ele terminar e confira: agora o alias aponta inteiro pra versão 2.
Veja o deploy do ponto de vista do alvo: o alias como alvo, as etapas (BeforeAllowTraffic, AllowTraffic, AfterAllowTraffic) e o peso da versão nova.
Sexta, 17h: a versão 3 foi pro canary e o monitoramento mostra erro de pagamento nos 10%. Reproduza — código novo, publique a versão 3 (descrição nova-bandeira), deploy com revisao-cobranca-v3.json e uma consulta — e pare o deploy com rollback. Confira que o alias voltou inteiro pra versão 2.
Agora o site da loja, que roda em contêiner. Crie o cluster cluster-vitrine no ECS.
Registre a task definition vitrine-web com o arquivo pronto tarefa-web.json (container web, porta 80).
O tráfego da loja entra por um load balancer. Crie o alb-vitrine nas sub-redes subnet-vitrine-a e subnet-vitrine-b.
Blue/green precisa de DOIS target groups, um pra cada lado. Crie o tg-vitrine-azul e o tg-vitrine-verde (HTTP, porta 80, VPC vpc-0f00d1e00c11ab001).
Crie o listener do alb-vitrine na porta 80 (HTTP) encaminhando pro tg-vitrine-azul — ele é o lado que está no ar hoje.
Crie o serviço vitrine-web no cluster-vitrine (task definition vitrine-web, 2 tarefas) atrás do tg-vitrine-azul, e — o ponto principal — com o controlador de deploy CODE_DEPLOY.
Confira os listeners do alb-vitrine: a porta 80 manda pro target group azul. Anote o ListenerArn — o CodeDeploy vai precisar dele.
Crie no CodeDeploy a aplicação vitrine-ecs para a plataforma ECS.
Crie o grupo vitrine-producao na vitrine-ecs: serviço vitrine-web do cluster-vitrine, os dois target groups (azul e verde), o listener da porta 80, a role arn:aws:iam::123456789012:role/codedeploy-servico, configuração CodeDeployDefault.ECSAllAtOnce e — pra dar tempo de testar — o deploy parando em Ready antes de trocar o tráfego.
O time mudou o layout da loja. Registre a revisão 2 da vitrine-web (mesmo arquivo — cada registro vira uma revisão nova).
Entregue a revisão 2 com revisao-vitrine-v2.json no grupo vitrine-producao e consulte o deploy: ele para em Ready — as tarefas novas estão de pé no verde, e o tráfego AINDA vai pro azul.
Veja o alvo do deploy: dois conjuntos de tarefas, BLUE com 100% do tráfego e GREEN com 0%, cada um no seu target group.
O QA testou a versão nova no verde e aprovou. Libere o deploy e acompanhe até terminar.
Confirme no load balancer: a porta 80 agora encaminha pro tg-vitrine-verde. No próximo deploy, ele é o "azul".
Revisão 3 no ar pra teste: registre a nova task definition, entregue com revisao-vitrine-v3.json, espere o Ready — o QA reprovou. Pare o deploy com rollback e confirme que o tráfego nunca saiu do lado que estava atendendo.
O time corrigiu o que o QA achou. Registre a revisão 4, entregue com revisao-vitrine-v4.json, espere o Ready, libere depois do teste e acompanhe até terminar. Aí confira o listener: o tráfego voltou pro tg-vitrine-azul — a cada deploy, o lado que estava parado vira o novo.
Ler explica. Digitar fixa. No CLImb você roda os comandos de verdade num terminal AWS simulado — o estado persiste entre eles, como na nuvem real.
As 3 primeiras atividades desta trilha são abertas; o resto faz parte do plano Pro.
Começar — 3 atividades grátis