Garantir deploys seguros em arquiteturas de microsserviços exige pipelines de integração e entrega contínua (CI/CD) extremamente controlados. O Amazon Elastic Container Service (ECS) trouxe uma evolução significativa para estratégias de deploy do tipo Canary e Blue/Green através dos Deployment Lifecycle Hooks.
Esses ganchos permitem que engenheiros de plataforma interceptem o deploy em etapas cruciais, executando testes de fumaça (smoke tests) ou validações de segurança antes de rotear tráfego real de produção para a nova versão das tarefas.
A Anatomia dos Lifecycle Hooks no ECS
Ao realizar um deploy Blue/Green usando o AWS CodeDeploy integrado ao Amazon ECS, o processo passa por etapas sequenciais rígidas. Os novos hooks possibilitam pausar o processo nestes pontos estratégicos.
graph LR
Start([Início do Deploy]) --> BeforeInstall[BeforeInstall Hook]
BeforeInstall --> InstallTask[Instalar Nova Task]
InstallTask --> AfterInstall[AfterInstall Hook]
AfterInstall --> RouteTraffic[Roteamento de Tráfego]
RouteTraffic --> BeforeAllowTraffic[BeforeAllowTraffic Hook]
BeforeAllowTraffic --> PublicAccess[Produção Ativa]
Arquivo AppSpec Exemplo
O arquivo appspec.yaml é o responsável por definir quais funções AWS Lambda serão executadas em cada fase de ciclo de vida para realizar as validações de integridade.
{
"version": 0.0,
"Resources": [
{
"TargetService": {
"Type": "AWS::ECS::Service",
"Properties": {
"TaskDefinition": "arn:aws:ecs:us-east-1:123456789012:task-definition/my-app:2",
"LoadBalancerInfo": {
"ContainerName": "web",
"ContainerPort": 80
}
}
}
}
],
"Hooks": [
{
"BeforeAllowTraffic": "arn:aws:lambda:us-east-1:123456789012:function:validate-ecs-deployment"
}
]
}
Lógica Interna de Validação do Hook
A função Lambda vinculada ao hook BeforeAllowTraffic deve retornar obrigatoriamente um sinal de sucesso ou falha para o CodeDeploy. Caso ocorra uma falha ou timeout, a reversão (rollback) para a versão anterior (Blue) é acionada de forma imediata e transparente, minimizando o raio de impacto de bugs.
# Trecho simplificado de uma função Lambda de validação (Python)
import boto3
def lambda_handler(event, context):
codedeploy = boto3.client('codedeploy')
deployment_id = event['DeploymentId']
lifecycle_event_hook_execution_id = event['LifecycleEventHookExecutionId']
# Realiza teste de conexão local ou validação de integridade no endpoint de teste
success = executar_teste_de_fumaca()
status = 'Succeeded' if success else 'Failed'
codedeploy.put_lifecycle_event_hook_execution_status(
deploymentId=deployment_id,
lifecycleEventHookExecutionId=lifecycle_event_hook_execution_id,
status=status
)
return status
Esta funcionalidade reduz significativamente a incidência de incidentes em produção, pois remove a necessidade de validação externa manual ou scripts de verificação pós-deploy que rodam de fora da nuvem.