Cloud-hosted portfolio with keyless automated deployment
This page is served from a private S3 bucket — Block Public Access fully on — that only CloudFront can read, via Origin Access Control. DNS on Route 53, HTTPS from ACM, HTTP redirected to HTTPS at the edge.
Every push to main deploys automatically — with no AWS keys stored in GitHub. The pipeline authenticates through OpenID Connect: GitHub mints a short-lived token, and an IAM role trusts it only if the token's audience is AWS and its subject is this exact repository on the main branch. The role itself can do four things — list, put, and delete objects in one bucket, and invalidate one distribution. Nothing else.
All sixteen resources — bucket, DNS records, certificate, distribution, identity provider, role, and policy — are managed in Terraform, imported from live infrastructure to a clean "no changes" plan.
Favorite bug: the pipeline's first OIDC handshake failed because GitHub had just changed its token subject format for new repositories, appending immutable numeric IDs. Decoding the JWT claims in a debug step exposed the mismatch; pinning the trust policy to the exact new format fixed it — and made the policy stricter than the tutorial version.