Devansh Patel Portfolio
Infrastructure is live and serving through CloudFront.
resource "aws_s3_bucket" "site_bucket" { bucket = var.site_bucket_name acl = "private" versioning { enabled = true } lifecycle { prevent_destroy = true } } resource "aws_s3_bucket_public_access_block" "site_bucket" { bucket = aws_s3_bucket.site_bucket.id block_public_acls = true ignore_public_acls = true block_public_policy = true restrict_public_buckets = true } data "aws_region" "current" {} resource "aws_cloudfront_origin_access_control" "s3" { name = "devanshpatel-org-s3-oac" description = "Origin access control for private S3 origins" origin_access_control_origin_type = "s3" signing_behavior = "always" signing_protocol = "sigv4" } locals { cloudfront_aliases = var.cloudfront_certificate_arn != "" ? concat([var.domain_name], var.domain_aliases) : [] } resource "aws_cloudfront_distribution" "front_door" { aliases = local.cloudfront_aliases origin { domain_name = aws_s3_bucket.site_bucket.bucket_regional_domain_name origin_id = "site-s3-origin" origin_access_control_id = aws_cloudfront_origin_access_control.s3.id } origin { domain_name = "${var.artifacts_bucket_name}.s3.${data.aws_region.current.name}.amazonaws.com" origin_id = "artifacts-s3-origin" origin_access_control_id = aws_cloudfront_origin_access_control.s3.id } origin { domain_name = var.alb_dns_name origin_id = "backend-alb-origin" custom_origin_config { http_port = 80 https_port = 443 origin_protocol_policy = "http-only" origin_ssl_protocols = ["TLSv1.2"] } } enabled = true is_ipv6_enabled = true default_root_object = var.default_root_object default_cache_behavior { target_origin_id = "site-s3-origin" viewer_protocol_policy = "redirect-to-https" allowed_methods = ["GET", "HEAD"] cached_methods = ["GET", "HEAD"] forwarded_values { query_string = false cookies { forward = "none" } } min_ttl = 0 default_ttl = 3600 max_ttl = 86400 } ordered_cache_behavior { path_pattern = "/artifacts/*" target_origin_id = "artifacts-s3-origin" viewer_protocol_policy = "redirect-to-https" allowed_methods = ["GET", "HEAD"] cached_methods = ["GET", "HEAD"] forwarded_values { query_string = false cookies { forward = "none" } } min_ttl = 0 default_ttl = 3600 max_ttl = 86400 } ordered_cache_behavior { path_pattern = "/labs/*" target_origin_id = "backend-alb-origin" viewer_protocol_policy = "redirect-to-https" allowed_methods = ["GET", "HEAD", "OPTIONS", "PUT", "POST", "PATCH", "DELETE"] cached_methods = ["GET", "HEAD"] forwarded_values { query_string = true cookies { forward = "all" } } min_ttl = 0 default_ttl = 0 max_ttl = 0 } ordered_cache_behavior { path_pattern = "/auth/*" target_origin_id = "backend-alb-origin" viewer_protocol_policy = "redirect-to-https" allowed_methods = ["GET", "HEAD", "OPTIONS", "PUT", "POST", "PATCH", "DELETE"] cached_methods = ["GET", "HEAD"] forwarded_values { query_string = true cookies { forward = "all" } } min_ttl = 0 default_ttl = 0 max_ttl = 0 } viewer_certificate { cloudfront_default_certificate = var.cloudfront_certificate_arn == "" acm_certificate_arn = var.cloudfront_certificate_arn != "" ? var.cloudfront_certificate_arn : null ssl_support_method = var.cloudfront_certificate_arn != "" ? "sni-only" : null minimum_protocol_version = var.cloudfront_certificate_arn != "" ? "TLSv1.2_2021" : "TLSv1" } restrictions { geo_restriction { restriction_type = "none" } } tags = { Name = "devanshpatel-org-cloudfront" } } resource "aws_s3_bucket_policy" "site_bucket" { bucket = aws_s3_bucket.site_bucket.id policy = jsonencode({ Version = "2012-10-17" Statement = [ { Sid = "AllowCloudFrontReadOnly" Effect = "Allow" Principal = { Service = "cloudfront.amazonaws.com" } Action = "s3:GetObject" Resource = "${aws_s3_bucket.site_bucket.arn}/*" Condition = { StringEquals = { "AWS:SourceArn" = aws_cloudfront_distribution.front_door.arn } } } ] }) } resource "aws_s3_bucket_policy" "artifacts_bucket" { bucket = var.artifacts_bucket_name policy = jsonencode({ Version = "2012-10-17" Statement = [ { Sid = "AllowCloudFrontReadOnly" Effect = "Allow" Principal = { Service = "cloudfront.amazonaws.com" } Action = "s3:GetObject" Resource = "arn:aws:s3:::${var.artifacts_bucket_name}/*" Condition = { StringEquals = { "AWS:SourceArn" = aws_cloudfront_distribution.front_door.arn } } } ] }) } resource "aws_s3_object" "site_index" { bucket = aws_s3_bucket.site_bucket.id key = var.default_root_object content_type = "text/html; charset=utf-8" content = <<-HTML
Infrastructure is live and serving through CloudFront.