Global HTTPS Delivery
CloudFront delivers the site globally with TLS and modern security headers.
Infrastructure behind this portfolio
This portfolio is also a live infrastructure project: provisioned with Terraform, deployed through GitHub Actions using AWS OIDC, and delivered globally through CloudFront from a private S3 origin.
Infrastructure / DevOps • View on GitHub ↗
CloudFront delivers the site globally with TLS and modern security headers.
Content is stored in a private S3 bucket and accessed via CloudFront and OAC.
GitHub Actions deploys with AWS OIDC—no long-lived AWS credentials.
Visitors reach the portfolio through Cloudflare DNS. Traffic is served by CloudFront over HTTPS. CloudFront accesses a private S3 origin through Origin Access Control. Infrastructure is provisioned with Terraform.
CloudFront is the only public entry point and handles TLS, caching, and security headers.
The S3 bucket remains private and is reachable only through CloudFront using OAC.
Terraform provisions the infrastructure and GitHub Actions handles automated delivery.
Content stays in a private S3 bucket and is only accessible through OAC.
CloudFront delivers content over HTTPS with low latency and automatic TLS.
Leverages caching and serverless services to keep operating costs low.
Terraform keeps the portfolio infrastructure reproducible and low-maintenance by composing focused modules around a single environment root. The design separates backend bootstrap, runtime resources, and CI/CD identities while keeping the deployment workflow straightforward.
Encrypted S3 backend with native .tflock locking.
Small modules with explicit responsibilities and clear contracts.
Outputs connect modules and make resource relationships visible.
terraform/
├── bootstrap/
│ └── backend/
└── environments/
├── dev/
└── modules/
├── s3/
├── acm-cloudflare/
├── cloudfront/
├── cloudflare-dns/
├── github-actions-iam/
└── monitoring/
dev root moduleus_east_1Private origin bucket and CloudFront access logs bucket
ACM certificate and Cloudflare DNS validation
CDN, OAC, security headers, caching, logging and error handling
Public DNS records pointing to the CloudFront distribution
OIDC provider, scoped roles, policies and permissions boundary
CloudFront 4xx/5xx alarms and operational visibility
Automated delivery and explicit trust boundaries keep AWS credentials temporary, permissions scoped, and infrastructure and content delivery responsibilities separate.
PRs run static validation only. Push and manual runs revalidate, pass through the dev environment, assume the Terraform role, then run init, plan and apply.
PRs validate the build without deploying. Main and manual runs build a fresh artifact, then a restricted publishing role synchronizes S3 metadata and invalidates CloudFront.
Builds and validates code, requests short-lived AWS access through OIDC, and stores the scoped Cloudflare token in the protected environment.
Hosts the infrastructure and issues temporary credentials only when repository, audience, and environment claims match.
Terraform manages DNS records through a separately scoped API token, independent of the AWS IAM roles.
Creates the backend and initially provisions or changes OIDC and IAM resources outside normal CI/CD.
Requests AWS access
Issues identity token
Returns temporary credentials
Manages scoped AWS infrastructure. A permissions boundary caps its maximum access and it has no IAM write permissions.
Terraform workflowPublishes website objects and invalidates only the managed CloudFront distribution.
Website workflowAuthenticates the Cloudflare provider separately for DNS record management.
Separate credential pathEach AWS role has only the permissions required by its workflow.
OIDC tokens and STS credentials expire automatically.
Infrastructure, website publishing and DNS use distinct authorization paths.
GitHub Environment protections and reviewers can gate deployments when configured.
No long-lived AWS access keys are stored as repository or environment secrets.
GitHub workflow history, CloudFront access logs and CloudWatch alarms support investigation.
ⓘCI/CD uses GitHub OIDC for AWS access and a separately scoped API token for Cloudflare DNS—no long-lived AWS credentials are stored in GitHub.
dev environment keeps the project simple and reproducible./* after deployment.no-cache, hashed CSS/JS is immutable, and other assets cache for one hour.