Cloud & Infraestrutura

CodePipeline: Pipelines Completos de Deploy na AWS: Do Básico ao Avançado

7 min de leitura

CodePipeline: Pipelines Completos de Deploy na AWS: Do Básico ao Avançado

Introdução ao AWS CodePipeline O AWS CodePipeline é um serviço de integração contínua e entrega contínua (CI/CD) totalmente gerenciado que automatiza o processo de release de aplicações. Em vez de fazer deploy manualmente, você define etapas — build, teste e deploy — que executam automaticamente quando código é alterado. Isso reduz erros humanos, acelera entregas e mantém a qualidade do software em níveis altos. Neste artigo, você aprenderá desde conceitos fundamentais até padrões avançados de automação. Arquitetura e Componentes Principais Fluxo Básico do Pipeline Um pipeline típico segue esta sequência: Source → Build → Test → Deploy. A etapa Source monitora seu repositório (CodeCommit, GitHub, GitLab) e dispara o pipeline automaticamente quando detecta alterações. A etapa Build compila o código usando CodeBuild. A etapa Test executa testes automatizados, e a etapa Deploy envia a aplicação para ambientes (desenvolvimento, staging, produção) usando CodeDeploy, CloudFormation ou ECS. Componentes Essenciais Artifacts são arquivos gerados entre etapas (binários compilados, pacotes). Actions são unidades de

<h2>Introdução ao AWS CodePipeline</h2>

<p>O AWS CodePipeline é um serviço de integração contínua e entrega contínua (CI/CD) totalmente gerenciado que automatiza o processo de release de aplicações. Em vez de fazer deploy manualmente, você define etapas — build, teste e deploy — que executam automaticamente quando código é alterado. Isso reduz erros humanos, acelera entregas e mantém a qualidade do software em níveis altos. Neste artigo, você aprenderá desde conceitos fundamentais até padrões avançados de automação.</p>

<h2>Arquitetura e Componentes Principais</h2>

<h3>Fluxo Básico do Pipeline</h3>

<p>Um pipeline típico segue esta sequência: <strong>Source</strong> → <strong>Build</strong> → <strong>Test</strong> → <strong>Deploy</strong>. A etapa Source monitora seu repositório (CodeCommit, GitHub, GitLab) e dispara o pipeline automaticamente quando detecta alterações. A etapa Build compila o código usando CodeBuild. A etapa Test executa testes automatizados, e a etapa Deploy envia a aplicação para ambientes (desenvolvimento, staging, produção) usando CodeDeploy, CloudFormation ou ECS.</p>

<h3>Componentes Essenciais</h3>

<p><strong>Artifacts</strong> são arquivos gerados entre etapas (binários compilados, pacotes). <strong>Actions</strong> são unidades de trabalho dentro de uma etapa (executar teste, fazer deploy). <strong>Stages</strong> agrupam actions relacionadas. <strong>Transitions</strong> controlam o fluxo entre stages — você pode exigir aprovação manual antes de prosseguir para produção.</p>

<h2>Implementação Prática: Pipeline Completo</h2>

<h3>Configuração do Pipeline via CloudFormation</h3>

<pre><code class="language-yaml">AWSTemplateFormatVersion: &#039;2010-09-09&#039;

Description: &#039;CodePipeline com Build e Deploy&#039;

Resources:

ArtifactBucket:

Type: AWS::S3::Bucket

Properties:

BucketName: !Sub &#039;pipeline-artifacts-${AWS::AccountId}&#039;

VersioningConfiguration:

Status: Enabled

CodePipelineRole:

Type: AWS::IAM::Role

Properties:

AssumeRolePolicyDocument:

Version: &#039;2012-10-17&#039;

Statement:

  • Effect: Allow

Principal:

Service: codepipeline.amazonaws.com

Action: &#039;sts:AssumeRole&#039;

ManagedPolicyArns:

  • &#039;arn:aws:iam::aws:policy/AWSCodePipelineFullAccess&#039;

Policies:

  • PolicyName: S3Artifacts

PolicyDocument:

Version: &#039;2012-10-17&#039;

Statement:

  • Effect: Allow

Action:

  • &#039;s3:GetObject&#039;
  • &#039;s3:PutObject&#039;

Resource: !Sub &#039;${ArtifactBucket.Arn}/*&#039;

MyPipeline:

Type: AWS::CodePipeline::Pipeline

Properties:

Name: MyApplicationPipeline

RoleArn: !GetAtt CodePipelineRole.Arn

ArtifactStore:

Type: S3

Location: !Ref ArtifactBucket

Stages:

  • Name: Source

Actions:

  • Name: SourceAction

ActionTypeId:

Category: Source

Owner: AWS

Provider: CodeCommit

Version: &#039;1&#039;

Configuration:

RepositoryName: my-repo

BranchName: main

OutputArtifacts:

  • Name: SourceOutput
  • Name: Build

Actions:

  • Name: BuildAction

ActionTypeId:

Category: Build

Owner: AWS

Provider: CodeBuild

Version: &#039;1&#039;

Configuration:

ProjectName: !Ref BuildProject

InputArtifacts:

  • Name: SourceOutput

OutputArtifacts:

  • Name: BuildOutput
  • Name: Deploy

Actions:

  • Name: DeployToStaging

ActionTypeId:

Category: Deploy

Owner: AWS

Provider: CloudFormation

Version: &#039;1&#039;

Configuration:

ActionMode: CHANGE_SET_REPLACE

StackName: my-app-staging

ChangeSetName: my-app-staging-changeset

TemplatePath: BuildOutput::packaged.yaml

Capabilities: CAPABILITY_IAM

InputArtifacts:

  • Name: BuildOutput

BuildProject:

Type: AWS::CodeBuild::Project

Properties:

Name: MyBuildProject

ServiceRole: !GetAtt CodeBuildRole.Arn

Artifacts:

Type: CODEPIPELINE

Environment:

ComputeType: BUILD_GENERAL1_SMALL

Image: aws/codebuild/standard:5.0

Type: LINUX_CONTAINER

Source:

Type: CODEPIPELINE

BuildSpec: |

version: 0.2

phases:

build:

commands:

  • echo &quot;Building application...&quot;
  • npm install
  • npm run build

artifacts:

files:

  • &#039;*/&#039;

CodeBuildRole:

Type: AWS::IAM::Role

Properties:

AssumeRolePolicyDocument:

Version: &#039;2012-10-17&#039;

Statement:

  • Effect: Allow

Principal:

Service: codebuild.amazonaws.com

Action: &#039;sts:AssumeRole&#039;

ManagedPolicyArns:

  • &#039;arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryPowerUser&#039;

Policies:

  • PolicyName: S3Access

PolicyDocument:

Version: &#039;2012-10-17&#039;

Statement:

  • Effect: Allow

Action:

  • &#039;s3:GetObject&#039;
  • &#039;s3:PutObject&#039;

Resource: !Sub &#039;${ArtifactBucket.Arn}/*&#039;</code></pre>

<h3>Arquivo buildspec.yml Avançado</h3>

<pre><code class="language-yaml">version: 0.2

env:

variables:

AWS_DEFAULT_REGION: us-east-1

parameter-store:

DOCKER_REGISTRY: /docker/registry-url

phases:

pre_build:

commands:

  • echo Logging in to Amazon ECR...

- aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $DOCKER_REGISTRY - COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)

  • IMAGE_TAG=${COMMIT_HASH:=latest}

build:

commands:

  • echo Build started on date
  • echo Building the Docker image...
  • docker build -t $DOCKER_REGISTRY/my-app:$IMAGE_TAG .
  • docker tag $DOCKER_REGISTRY/my-app:$IMAGE_TAG $DOCKER_REGISTRY/my-app:latest

post_build:

commands:

  • echo Build completed on date
  • echo Pushing the Docker images...
  • docker push $DOCKER_REGISTRY/my-app:$IMAGE_TAG
  • docker push $DOCKER_REGISTRY/my-app:latest
  • echo Writing image definitions file...
  • printf &#039;[{&quot;name&quot;:&quot;my-app&quot;,&quot;imageUri&quot;:&quot;%s&quot;}]&#039; $DOCKER_REGISTRY/my-app:$IMAGE_TAG &gt; imagedefinitions.json

artifacts:

files: imagedefinitions.json</code></pre>

<h2>Padrões Avançados</h2>

<h3>Aprovação Manual e Multi-Ambiente</h3>

<p>Para pipelines em produção, implemente etapas de aprovação manual antes de alterações críticas. Use <code>Manual</code> como tipo de action para pausar o pipeline e exigir confirmação de um usuário autorizado. Combine isso com múltiplos stages (Dev → Staging → Prod) onde cada ambiente possui diferentes aprovadores e políticas de deployment.</p>

<h3>Integração com Lambda e Validação Personalizada</h3>

<pre><code class="language-python">import json

import boto3

codepipeline = boto3.client(&#039;codepipeline&#039;)

def lambda_handler(event, context):

job_id = event[&#039;CodePipeline.job&#039;][&#039;id&#039;]

try:

Validação customizada

test_result = run_health_check()

if test_result[&#039;status&#039;] == &#039;healthy&#039;:

codepipeline.put_job_success_result(jobId=job_id)

else:

codepipeline.put_job_failure_result(

jobId=job_id,

failureDetails={&#039;message&#039;: &#039;Health check failed&#039;}

)

except Exception as e:

codepipeline.put_job_failure_result(

jobId=job_id,

failureDetails={&#039;message&#039;: str(e)}

)

def run_health_check():

return {&#039;status&#039;: &#039;healthy&#039;}</code></pre>

<p>Coloque uma Lambda como action no pipeline para executar validações customizadas, testes de fumaça, ou verificações de segurança. A função recebe metadados do job e retorna sucesso ou falha, controlando o fluxo do pipeline.</p>

<h2>Conclusão</h2>

<p>Dominar CodePipeline exige compreender seus componentes fundamentais (stages, actions, artifacts) e saber construir fluxos de automação. Comece simples com source → build → deploy e evolua para padrões avançados como aprovações manuais, múltiplos ambientes e validações customizadas com Lambda. A chave é iterar rapidamente: crie um pipeline básico, teste, refine políticas de segurança e escalabilidade conforme sua aplicação cresce.</p>

<h2>Referências</h2>

<ul>

<li><a href="https://docs.aws.amazon.com/codepipeline/" target="_blank" rel="noopener noreferrer">AWS CodePipeline Documentation</a></li>

<li><a href="https://docs.aws.amazon.com/codebuild/latest/userguide/best-practices.html" target="_blank" rel="noopener noreferrer">AWS CodeBuild Best Practices</a></li>

<li><a href="https://aws.amazon.com/devops/continuous-integration/" target="_blank" rel="noopener noreferrer">Continuous Integration and Delivery on AWS</a></li>

<li><a href="https://docs.aws.amazon.com/cloudformation/latest/userguide/Welcome.html" target="_blank" rel="noopener noreferrer">Infrastructure as Code with CloudFormation</a></li>

<li><a href="https://docs.aws.amazon.com/wellarchitected/latest/devops-guidance/welcome.html" target="_blank" rel="noopener noreferrer">CI/CD Best Practices - AWS Well-Architected Framework</a></li>

</ul>

Comentários

Mais em Cloud & Infraestrutura

IAM Avançado: SCP, Permission Boundaries e Attribute-Based Access: Do Básico ao Avançado
IAM Avançado: SCP, Permission Boundaries e Attribute-Based Access: Do Básico ao Avançado

IAM Avançado: SCP, Permission Boundaries e Attribute-Based Access O que é IAM...

Boas Práticas de AppSync: GraphQL Gerenciado com Resolvers e Real-time para Times Ágeis
Boas Práticas de AppSync: GraphQL Gerenciado com Resolvers e Real-time para Times Ágeis

AppSync: Fundamentos e Arquitetura AWS AppSync é um serviço gerenciado que pe...

AWS Backup: Políticas Centralizadas e Recuperação de Desastres: Do Básico ao Avançado
AWS Backup: Políticas Centralizadas e Recuperação de Desastres: Do Básico ao Avançado

Fundamentos do AWS Backup O AWS Backup é um serviço centralizado que simplifi...