From 7bede4a357855f6dbc83e22a4050947499bb30ce Mon Sep 17 00:00:00 2001 From: vickytechkey Date: Wed, 23 Sep 2026 22:06:03 +0530 Subject: [PATCH] feat: add MainsiteStack to manage main and beta site distributions --- app.py | 16 ++++- mainsite/__init__.py | 0 mainsite/mainsite_stack.py | 88 ++++++++++++++++++++++++++++ shopping/shopping_stack.py | 5 +- tradhoxdomain/tradhoxdomain_stack.py | 14 +++++ 5 files changed, 119 insertions(+), 4 deletions(-) create mode 100644 mainsite/__init__.py create mode 100644 mainsite/mainsite_stack.py diff --git a/app.py b/app.py index 15d5de8..287b904 100644 --- a/app.py +++ b/app.py @@ -31,7 +31,7 @@ shopping_stack = ShoppingStack( ) # Domain stack in ap-south-2 -TradhoxdomainStack( +domain_stack = TradhoxdomainStack( app, "TradhoxdomainStack", env=cdk.Environment( account=os.getenv("CDK_DEFAULT_ACCOUNT"), @@ -39,7 +39,19 @@ TradhoxdomainStack( ), cross_region_references=True, partner_distribution=partner_stack.distribution, - shopping_distribution=shopping_stack.distribution, +) + +from mainsite.mainsite_stack import MainsiteStack + +# Main site stack in ap-south-2 +mainsite_stack = MainsiteStack( + app, "MainsiteStack", + env=cdk.Environment( + account=os.getenv("CDK_DEFAULT_ACCOUNT"), + region="ap-south-2", + ), + cross_region_references=True, + hosted_zone=domain_stack.hosted_zone, ) app.synth() diff --git a/mainsite/__init__.py b/mainsite/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/mainsite/mainsite_stack.py b/mainsite/mainsite_stack.py new file mode 100644 index 0000000..750acd1 --- /dev/null +++ b/mainsite/mainsite_stack.py @@ -0,0 +1,88 @@ +from aws_cdk import ( + Stack, + aws_s3 as s3, + aws_cloudfront as cloudfront, + aws_cloudfront_origins as origins, + aws_route53 as route53, + aws_route53_targets as targets, + aws_certificatemanager as acm, + RemovalPolicy, +) +from constructs import Construct + +class MainsiteStack(Stack): + + def __init__( + self, scope: Construct, construct_id: str, + hosted_zone: route53.IHostedZone, + **kwargs + ) -> None: + super().__init__(scope, construct_id, **kwargs) + + # Use the existing wildcard certificate in us-east-1 for CloudFront + us_east_1_cert = acm.Certificate.from_certificate_arn( + self, "TradhoxUsEast1Certificate", + "arn:aws:acm:us-east-1:764709663363:certificate/037281b1-e7ef-416e-af27-54dbc34cf6c3" + ) + + # 1. Main site S3 Bucket + main_bucket = s3.Bucket( + self, "TradhoxMainSiteBucket", + bucket_name="tradhoxmainsite", + block_public_access=s3.BlockPublicAccess.BLOCK_ALL, + removal_policy=RemovalPolicy.RETAIN, + ) + + # 2. Main site CloudFront Distribution + self.main_distribution = cloudfront.Distribution( + self, "TradhoxMainSiteDistribution", + default_behavior=cloudfront.BehaviorOptions( + origin=origins.S3BucketOrigin.with_origin_access_control(main_bucket), + viewer_protocol_policy=cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS, + ), + domain_names=["tradhox.com", "www.tradhox.com"], + certificate=us_east_1_cert, + default_root_object="index.html", + ) + + # 3. Beta site S3 Bucket + beta_bucket = s3.Bucket( + self, "TradhoxBetaSiteBucket", + bucket_name="tradhoxbetasite", + block_public_access=s3.BlockPublicAccess.BLOCK_ALL, + removal_policy=RemovalPolicy.RETAIN, + ) + + # 4. Beta site CloudFront Distribution + self.beta_distribution = cloudfront.Distribution( + self, "TradhoxBetaSiteDistribution", + default_behavior=cloudfront.BehaviorOptions( + origin=origins.S3BucketOrigin.with_origin_access_control(beta_bucket), + viewer_protocol_policy=cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS, + ), + domain_names=["beta.tradhox.com"], + certificate=us_east_1_cert, + default_root_object="index.html", + ) + + # 5. Route53 Records for Main Site + route53.ARecord( + self, "MainDomainApexRecord", + zone=hosted_zone, + record_name="", + target=route53.RecordTarget.from_alias(targets.CloudFrontTarget(self.main_distribution)) + ) + route53.ARecord( + self, "MainDomainWwwRecord", + zone=hosted_zone, + record_name="www", + target=route53.RecordTarget.from_alias(targets.CloudFrontTarget(self.main_distribution)) + ) + + # 6. Route53 Records for Beta Site + route53.ARecord( + self, "BetaDomainRecord", + zone=hosted_zone, + record_name="beta", + target=route53.RecordTarget.from_alias(targets.CloudFrontTarget(self.beta_distribution)) + ) diff --git a/shopping/shopping_stack.py b/shopping/shopping_stack.py index 5ffe85c..f3b51f8 100644 --- a/shopping/shopping_stack.py +++ b/shopping/shopping_stack.py @@ -34,8 +34,9 @@ class ShoppingStack(Stack): origin=origins.S3BucketOrigin.with_origin_access_control(shopping_bucket), viewer_protocol_policy=cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS, ), - domain_names=["tradhox.com", "www.tradhox.com"], - certificate=certificate, + # REMOVED to free up CNAMEs for MainsiteStack + # domain_names=["tradhox.com", "www.tradhox.com"], + # certificate=certificate, default_root_object="index.html", error_responses=[ cloudfront.ErrorResponse( diff --git a/tradhoxdomain/tradhoxdomain_stack.py b/tradhoxdomain/tradhoxdomain_stack.py index 3bdab74..acd4418 100644 --- a/tradhoxdomain/tradhoxdomain_stack.py +++ b/tradhoxdomain/tradhoxdomain_stack.py @@ -143,6 +143,20 @@ class TradhoxdomainStack(Stack): validation=acm.CertificateValidation.from_dns(hosted_zone), ) + # SSL Certificate for tradhox.com with Route53 DNS validation + self.tradhox_certificate = acm.Certificate( + self, "TradhoxCertificate", + domain_name="tradhox.com", + validation=acm.CertificateValidation.from_dns(hosted_zone), + ) + + # SSL Certificate for beta.tradhox.com with Route53 DNS validation + self.beta_tradhox_certificate = acm.Certificate( + self, "BetaTradhoxCertificate", + domain_name="beta.tradhox.com", + validation=acm.CertificateValidation.from_dns(hosted_zone), + ) + # Route 'partners' frontend to PartnerProductionSiteBucket CloudFront distribution if partner_distribution: route53.ARecord(