Este site
Um site de CV bilingue em que a infraestrutura e a pipeline fazem parte do portefólio. É um site estático em Astro na AWS, provisionado com Pulumi e Terraform e publicado a partir do GitHub Actions sem credenciais guardadas.
- Astro
- TypeScript
- Pulumi
- Terraform
- AWS
- Cloudflare
- GitHub Actions
Arquitetura
- Browser → Cloudflare DNS: resolve
- Browser → CloudFront: HTTPS
- Browser → Turnstile: token
- CloudFront → S3: /*
- CloudFront → API Gateway: /api/*
- API Gateway → Lambda
- Lambda → SES: send
- Lambda → Turnstile: verify token
- Browser: Visitante
- Turnstile: Verificação anti-bot
- CloudFront: HTTPS · cabeçalhos
- S3: Privado, OAC
- API Gateway: Com limite de pedidos
- Lambda: Valida
- SES: Email para mim
- cloudflare: Cloudflare DNS, Turnstile
- aws: CloudFront, S3, API Gateway, Lambda, SES
- GitHub → GitHub Actions: merge
- GitHub Actions → Pulumi: pulumi up
- GitHub Actions → Terraform: apply
- GitHub Actions → IAM: assume (OIDC)
- Pulumi → O site: provisions
- Terraform → IAM: creates
- Terraform → Budgets
- Terraform → CloudTrail
- Budgets → Alertas por email: alert
- GitHub: Pull request
- GitHub Actions: Testes · controlos
- Pulumi: Stack do site
- Terraform: Base da conta
- O site: S3 · CloudFront · API
- IAM: Roles OIDC
- Budgets: Alertas de custos
- CloudTrail: Registo de auditoria
- github: GitHub, GitHub Actions
- infrastructure as code: Pulumi, Terraform
- aws account: O site, IAM, Budgets, CloudTrail, Alertas por email
Contexto
Normalmente, os recrutadores recebem um PDF. Eu queria um link que mostrasse o meu CV em cinco segundos e que mostrasse também, a quem avalia a parte técnica, como construo e opero infraestrutura.
Problema
O site tinha de ser rápido em qualquer telemóvel, legível em inglês e em português, barato de manter (mais ou menos o preço do domínio) e seguro por omissão. O repositório também tinha de resistir a uma revisão de código.
Abordagem
A conta AWS é configurada por um repositório Terraform separado e público. Cria roles OIDC para o GitHub com políticas de privilégio mínimo e um permissions boundary, um orçamento mensal com alertas e um trail CloudTrail multi-região. É testado com Terraform e com OpenTofu, e cada apply espera pela minha aprovação.
O site em si é uma stack Pulumi: um bucket S3 privado atrás do CloudFront, com HTTPS e cabeçalhos de segurança, e um formulário de contacto serverless (API Gateway, Lambda e SES) protegido pelo Cloudflare Turnstile e por limites de pedidos.
O CV vive em YAML e Markdown versionados, nas duas línguas. O build falha se faltar uma tradução, e os mesmos ficheiros geram os PDFs para descarregar. Cada pull request corre testes unitários e end-to-end, verificações de acessibilidade, orçamentos do Lighthouse e verificação de links antes de qualquer publicação.
Resultado
Um site que custa quase nada a manter, que se publica sozinho quando um pull request é integrado e que serve de exemplo concreto da forma como trato infraestrutura, segurança e automação.