Saltar para o conteúdo
gonçalo.fileno
← Voltar à página inicial

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

Em funcionamento: visitar o site e enviar uma mensagem
  1. Browser → Cloudflare DNS: resolve
  2. Browser → CloudFront: HTTPS
  3. Browser → Turnstile: token
  4. CloudFront → S3: /*
  5. CloudFront → API Gateway: /api/*
  6. API Gateway → Lambda
  7. Lambda → SES: send
  8. 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
Entrega: como o site e a conta AWS são construídos
  1. GitHub → GitHub Actions: merge
  2. GitHub Actions → Pulumi: pulumi up
  3. GitHub Actions → Terraform: apply
  4. GitHub Actions → IAM: assume (OIDC)
  5. Pulumi → O site: provisions
  6. Terraform → IAM: creates
  7. Terraform → Budgets
  8. Terraform → CloudTrail
  9. 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.