Quando decidi criar meu portfólio, tomei uma decisão: não ia hospedar no GitHub Pages nem no Vercel.
Queria aprender na prática. Queria que cada vez que alguém abrisse meu portfólio, ele estivesse rodando em uma infraestrutura real — a mesma que grandes empresas usam.
Então fui para a AWS.
A ideia
A arquitetura é simples mas poderosa:
GitHub → GitHub Actions → S3 → CloudFront → Usuário
O site fica hospedado em um bucket S3. O CloudFront distribui o conteúdo globalmente via CDN. E a cada push no GitHub, o deploy acontece automaticamente.
Zero acesso manual ao servidor. Zero FTP. Zero dor de cabeça.
Passo a passo do que aprendi
1. Criando o bucket S3
O S3 (Simple Storage Service) é o serviço de armazenamento de objetos da AWS. Para hospedar um site estático, você:
- Cria um bucket com nome único
- Habilita hospedagem de site estático
- Configura as permissões para acesso público
- Cria uma bucket policy liberando leitura
A parte mais confusa foi entender permissões. A AWS bloqueia tudo por padrão — e isso é ótimo para segurança, mas exige atenção na configuração.
2. Configurando o CloudFront
O CloudFront é a CDN (Content Delivery Network) da AWS. Em vez de servir o site só de uma região, ele replica o conteúdo em Edge Locations ao redor do mundo.
Isso significa que um usuário no Japão vai acessar o site com a mesma velocidade que alguém aqui no Brasil.
O que configurei:
- Origem apontando para o bucket S3
- Redirect HTTP para HTTPS
- Política de cache
3. Automatizando o deploy com GitHub Actions
Essa foi a parte que mais gostei. Criei um arquivo .yml no repositório que faz o seguinte a cada push na branch main:
- Faz checkout do código
- Sincroniza os arquivos com o bucket S3
- Invalida o cache do CloudFront
As credenciais AWS ficam armazenadas nos GitHub Secrets — nunca no código.
- name: Deploy to S3
run: aws s3 sync . s3://meu-bucket --delete
- name: Invalidate CloudFront
run: aws cloudfront create-invalidation --distribution-id ${{ secrets.CF_ID }} --paths "/*"
O que esse projeto me ensinou
IAM na prática — precisei criar um usuário com permissões específicas só para o deploy. Nada de AdministratorAccess no CI/CD.
Cache é complicado — na primeira vez que atualizei o site, ele não mudou. Aprendi que o CloudFront faz cache agressivo e precisa de invalidação.
Infraestrutura como documentação — o próprio pipeline do GitHub Actions documenta como o deploy funciona. Qualquer pessoa que abrir o repositório entende o processo.
Resultado
🔗 Ver portfólio ao vivo
Pronto! Focado só no portfólio S3 + CloudFront + CI/CD.
📁 GitHub
Nos próximos posts vou falar sobre os outros projetos que construí na AWS — API REST no EC2, API Serverless com Lambda e infraestrutura como código com Terraform.
Se tiver alguma dúvida ou sugestão, comenta aqui!