AWS Admin

Boas Práticas de CloudFormation em Profundidade: Templates, Stacks e StackSets para Times Ágeis Já leu

Fundamentos de CloudFormation para Automação de Infraestrutura CloudFormation é o serviço de Infrastructure as Code (IaC) da AWS que permite descrever e provisionar recursos através de templates. Diferente de cliques no console, você define sua infraestrutura em YAML ou JSON, versionável e reproduzível. Para times ágeis, isso significa deployments consistentes, rollbacks automáticos e documentação viva da sua arquitetura. Um template CloudFormation descreve recursos AWS, parâmetros de entrada e saídas. A mágica acontece quando você cria um Stack — uma instância daquele template. Se algo quebrar, a CloudFormation rastreia o estado e pode reverter mudanças atomicamente. Isso elimina aquele caos de "quem deployou o quê" e quando. Estruturando Templates para Escalabilidade e Reutilização Templates monolíticos quebram a escalabilidade. A melhor prática é decomposição: cada template cuida de um concern específico (networking, databases, compute). Use cross-stack references através de Exports para conectar outputs de um stack como inputs de outro. Implemente parâmetros sensatos com defaults, use Conditions para lógica condicional (dev vs

Fundamentos de CloudFormation para Automação de Infraestrutura

CloudFormation é o serviço de Infrastructure as Code (IaC) da AWS que permite descrever e provisionar recursos através de templates. Diferente de cliques no console, você define sua infraestrutura em YAML ou JSON, versionável e reproduzível. Para times ágeis, isso significa deployments consistentes, rollbacks automáticos e documentação viva da sua arquitetura.

Um template CloudFormation descreve recursos AWS, parâmetros de entrada e saídas. A mágica acontece quando você cria um Stack — uma instância daquele template. Se algo quebrar, a CloudFormation rastreia o estado e pode reverter mudanças atomicamente. Isso elimina aquele caos de "quem deployou o quê" e quando.

AWSTemplateFormatVersion: '2010-09-09'
Description: 'VPC com subnet pública para aplicação web'

Parameters:
  CidrBlock:
    Type: String
    Default: 10.0.0.0/16
    Description: CIDR da VPC

Resources:
  MyVPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: !Ref CidrBlock
      EnableDnsHostnames: true
      EnableDnsSupport: true
      Tags:
        - Key: Name
          Value: production-vpc

  PublicSubnet:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref MyVPC
      CidrBlock: 10.0.1.0/24
      AvailabilityZone: !Select [0, !GetAZs '']
      MapPublicIpOnLaunch: true

  InternetGateway:
    Type: AWS::EC2::InternetGateway
    Properties:
      Tags:
        - Key: Name
          Value: production-igw

  AttachGateway:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId: !Ref MyVPC
      InternetGatewayId: !Ref InternetGateway

Outputs:
  VPCId:
    Description: ID da VPC criada
    Value: !Ref MyVPC
    Export:
      Name: !Sub '${AWS::StackName}-VPC-ID'
  SubnetId:
    Description: ID da subnet pública
    Value: !Ref PublicSubnet
    Export:
      Name: !Sub '${AWS::StackName}-Subnet-ID'

Estruturando Templates para Escalabilidade e Reutilização

Templates monolíticos quebram a escalabilidade. A melhor prática é decomposição: cada template cuida de um concern específico (networking, databases, compute). Use cross-stack references através de Exports para conectar outputs de um stack como inputs de outro.

Implemente parâmetros sensatos com defaults, use Conditions para lógica condicional (dev vs produção), e Always mantenha templates versionados no Git. Adicione Metadata com descrições de parâmetros e use Mappings para valores específicos por região ou ambiente.

AWSTemplateFormatVersion: '2010-09-09'
Description: 'RDS MySQL com parâmetros customizáveis'

Parameters:
  DBName:
    Type: String
    Default: myappdb
  DBUser:
    Type: String
    NoEcho: true
  DBPassword:
    Type: String
    NoEcho: true
    MinLength: 8
  Environment:
    Type: String
    AllowedValues: [dev, staging, prod]
    Default: dev

Conditions:
  IsProd: !Equals [!Ref Environment, prod]

Mappings:
  InstanceTypeMap:
    dev:
      InstanceType: db.t3.micro
    staging:
      InstanceType: db.t3.small
    prod:
      InstanceType: db.r5.large

Resources:
  DBSubnetGroup:
    Type: AWS::RDS::DBSubnetGroup
    Properties:
      DBSubnetGroupDescription: Subnets para RDS
      SubnetIds:
        - !ImportValue networking-stack-Subnet-ID-1
        - !ImportValue networking-stack-Subnet-ID-2

  MyDatabase:
    Type: AWS::RDS::DBInstance
    DeletionPolicy: Snapshot
    Properties:
      DBInstanceIdentifier: !Sub '${AWS::StackName}-db'
      Engine: mysql
      EngineVersion: '8.0.35'
      DBInstanceClass: !FindInMap [InstanceTypeMap, !Ref Environment, InstanceType]
      AllocatedStorage: !If [IsProd, '100', '20']
      DBName: !Ref DBName
      MasterUsername: !Ref DBUser
      MasterUserPassword: !Ref DBPassword
      DBSubnetGroupName: !Ref DBSubnetGroup
      MultiAZ: !If [IsProd, true, false]
      BackupRetentionPeriod: !If [IsProd, 30, 7]

Outputs:
  DatabaseEndpoint:
    Value: !GetAtt MyDatabase.Endpoint.Address
    Export:
      Name: !Sub '${AWS::StackName}-DB-Endpoint'

StackSets: Governança Multi-Conta e Multi-Região

StackSets amplificam o poder da CloudFormation. Com um template único, você deploy simultaneamente em múltiplas contas AWS e regiões. Perfeito para times ágeis que precisam manter conformidade global e políticas corporativas.

Use StackSets com Auto Deployment habilitado: toda mudança no template propaga automaticamente para todas as target accounts e regions. Implemente Organizational Units (OUs) para controle granular e adicione Operation Preferences para controlar velocidade e tolerância a falhas do rollout.

AWSTemplateFormatVersion: '2010-09-09'
Description: 'Template para distribuição via StackSets - Security Baseline'

Parameters:
  SecurityGroupName:
    Type: String
    Default: baseline-sg

Resources:
  BaselineSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Security group baseline para todas as contas
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 443
          ToPort: 443
          CidrIp: 0.0.0.0/0
          Description: HTTPS from anywhere
      SecurityGroupEgress:
        - IpProtocol: -1
          CidrIp: 0.0.0.0/0
          Description: Allow all outbound
      Tags:
        - Key: ManagedBy
          Value: StackSet
        - Key: Purpose
          Value: SecurityBaseline

  CloudTrailRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service: cloudtrail.amazonaws.com
            Action: 'sts:AssumeRole'
      ManagedPolicyArns:
        - 'arn:aws:iam::aws:policy/CloudWatchLogsFullAccess'

Outputs:
  SecurityGroupId:
    Value: !Ref BaselineSecurityGroup
    Export:
      Name: !Sub '${AWS::StackName}-SG-ID'
  CloudTrailRoleArn:
    Value: !GetAtt CloudTrailRole.Arn
    Export:
      Name: !Sub '${AWS::StackName}-CTRole-ARN'

Para ativar StackSets via CLI, você precisaria (exemplo conceitual):

aws cloudformation create-stack-set \
  --stack-set-name security-baseline \
  --template-body file://template.yaml \
  --capabilities CAPABILITY_NAMED_IAM \
  --auto-deployment Enabled=true,Retain=false

aws cloudformation create-stack-instances \
  --stack-set-name security-baseline \
  --accounts 123456789012 987654321098 \
  --regions us-east-1 eu-west-1

Boas Práticas Críticas para Times Ágeis

Versionamento e CI/CD Integration: Mantenha templates no Git com histórico completo. Integre validação automática usando cfn-lint e cfn-python-lint no pipeline antes de deploy. Use Change Sets para visualizar exatamente o que vai mudar antes de aplicar.

Monitoramento e Segurança: Ative Stack Policy para prevenir deletions acidentais. Use AWS Config para compliance contínuo. Implemente IAM roles específicas por equipe — nunca use credenciais root. Adicione DeletionPolicy correto em recursos críticos (Retain, Snapshot, Delete conforme o caso).

Padrões de Reutilização: Crie uma biblioteca de templates base — VPC, RDS, Lambda patterns. Use Nested Stacks para composição, mas com moderação; StackSets são melhores para replicação. Documente outputs claramente e use Export Names padronizadas como ${ProjectName}-${ResourceType}-${Property}.

Para times escalarem, implemente Change Set reviews obrigatórios: um desenvolvedor cria, outro aprova antes de execução. Isso reduz surpresas em produção e cria cultura de responsabilidade.

Conclusão

CloudFormation é sua arma contra infraestrutura caótica. Comece com templates simples, decomponha em stacks pequenos, e escale via StackSets. A maior lição: infraestrutura é código, trate como tal — versionamento, reviews, testes automáticos. Times ágeis que dominam IaC entregam com confiança e velocidade. Change Sets + Git = segurança em deployments. StackSets + OUs = governança corporativa sem fricção manual.

Referências


Artigos relacionados