PLATAFORMA · IaC · SEGURANÇA
EXPERIÊNCIA PROFISSIONAL · PRINTS DE LABORATÓRIODa herança ao deploy sem senha: modernizando uma plataforma AWS com Terraform
Peguei 41 módulos Terraform herdados, cheios de atalhos perigosos, e transformei numa base segura. A prova foi uma aplicação real indo para o ar sozinha.
Recebi uma base de módulos herdada de um ambiente corporativo. Logo na primeira olhada apareceram senhas em texto puro, access keys fixas nos pipelines, módulos sem versão e até um que nunca tinha funcionado. Antes de criar qualquer coisa nova, eu precisava entender o que tinha nas mãos.
Comecei auditando os 41 módulos, um por um, e organizei o trabalho em 4 ondas: limpar, proteger, versionar e padronizar. Para provar que funcionava de verdade, criei um app piloto e fiz o primeiro deploy. Nada passou de primeira: o GitHub não achava o workflow, a AWS recusava o login, o scanner barrava a imagem. Cada erro virou um ajuste no módulo, não um remendo no projeto.
Hoje, um push na branch certa coloca o site no ar em menos de 2 minutos, sem nenhuma senha guardada no GitHub. Se alguém tentar publicar pela branch errada, a própria AWS recusa. E a imagem da API saiu de 26 vulnerabilidades para zero.
01name: "Deploy Front"
02on:
03 push:
04 branches: [develop]
05permissions:
06 contents: read
07 # OIDC: login na AWS sem access key
08 id-token: write
09jobs:
10 deploy:
11 # a esteira inteira mora no módulo
12 uses: minha-org/workflows/deploy-frontend.yml@v2.0.0
13 with:
14 application_name: app-front
15 node_version: "22"
16 config_secret_base_name: app-front/config
17 build_output_dir: dist
Código real do projeto
Dentro do workflow central: login na AWS por OIDC, publicação no S3 e limpeza do cache do CloudFront.
1deploy:
2 needs: [build]
3 runs-on: ubuntu-latest
4 steps:
5 - name: Configurar credenciais AWS via OIDC
6 uses: aws-actions/configure-aws-credentials@v4
7 with:
8 role-to-assume: ${{ vars.AWS_ROLE_ARN }}
9 aws-region: ${{ inputs.aws_region }}
10 role-session-name: deploy-${{ github.run_id }}
11 role-duration-seconds: 1800 # credencial vale 30 min e expira sozinha
12 mask-aws-account-id: true
13
14 - name: Publicar no S3
15 run: |
16 aws s3 sync "dist/" "${DESTINATION}" \
17 --delete \
18 --cache-control "${CACHE_CONTROL}" \
19 --only-show-errors
20
21 - name: Limpar cache do CloudFront
22 run: |
23 aws cloudfront create-invalidation \
24 --distribution-id "${DISTRIBUTION_ID}" \
25 --paths "/*"










