Skip to content

Commit 9a1cc5b

Browse files
author
Merrino
committed
feat: add custom domain support for CORS
- API Gateway CORS now includes var.domain_name when set - Lambda env gets CLOUDFRONT_URL for fallback origin - S3 attachments CORS includes custom domain - FastAPI backend handles both FRONTEND_URL and CLOUDFRONT_URL - CI/CD workflow passes DOMAIN_NAME secret to terraform
1 parent f33a77f commit 9a1cc5b

5 files changed

Lines changed: 27 additions & 11 deletions

File tree

.github/workflows/ci-cd.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@ jobs:
160160
TF_VAR_ses_email: ${{ secrets.SES_EMAIL }}
161161
TF_VAR_supabase_url: ${{ secrets.SUPABASE_URL }}
162162
TF_VAR_supabase_jwt_secret: ${{ secrets.SUPABASE_JWT_SECRET }}
163+
TF_VAR_domain_name: ${{ secrets.DOMAIN_NAME }}
163164
TF_VAR_environment: staging
164165
run: terraform plan -out=tfplan
165166

@@ -169,6 +170,7 @@ jobs:
169170
TF_VAR_ses_email: ${{ secrets.SES_EMAIL }}
170171
TF_VAR_supabase_url: ${{ secrets.SUPABASE_URL }}
171172
TF_VAR_supabase_jwt_secret: ${{ secrets.SUPABASE_JWT_SECRET }}
173+
TF_VAR_domain_name: ${{ secrets.DOMAIN_NAME }}
172174
TF_VAR_environment: staging
173175
run: terraform apply -auto-approve tfplan
174176

@@ -277,6 +279,7 @@ jobs:
277279
TF_VAR_ses_email: ${{ secrets.SES_EMAIL }}
278280
TF_VAR_supabase_url: ${{ secrets.SUPABASE_URL }}
279281
TF_VAR_supabase_jwt_secret: ${{ secrets.SUPABASE_JWT_SECRET }}
282+
TF_VAR_domain_name: ${{ secrets.DOMAIN_NAME }}
280283
TF_VAR_environment: prod
281284
run: terraform plan -out=tfplan
282285

@@ -286,6 +289,7 @@ jobs:
286289
TF_VAR_ses_email: ${{ secrets.SES_EMAIL }}
287290
TF_VAR_supabase_url: ${{ secrets.SUPABASE_URL }}
288291
TF_VAR_supabase_jwt_secret: ${{ secrets.SUPABASE_JWT_SECRET }}
292+
TF_VAR_domain_name: ${{ secrets.DOMAIN_NAME }}
289293
TF_VAR_environment: prod
290294
run: terraform apply -auto-approve tfplan
291295

backend/app/main.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@ async def lifespan(app: FastAPI):
4646
if settings.FRONTEND_URL:
4747
origins.append(settings.FRONTEND_URL)
4848

49+
# Add CloudFront URL if using custom domain (both need to work)
50+
if settings.CLOUDFRONT_URL and settings.CLOUDFRONT_URL not in origins:
51+
origins.append(settings.CLOUDFRONT_URL)
52+
4953
app.add_middleware(
5054
CORSMiddleware,
5155
allow_origins=origins,

backend/app/utils/config.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ class Settings(BaseSettings):
3434

3535
# Frontend
3636
FRONTEND_URL: str = "http://localhost:5173"
37+
CLOUDFRONT_URL: str = "" # CloudFront URL when using custom domain
3738

3839
class Config:
3940
env_file = ".env"

terraform/lambda.tf

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,8 @@ resource "aws_lambda_function" "api" {
134134
SUPABASE_URL = var.supabase_url
135135
SUPABASE_JWT_SECRET = var.supabase_jwt_secret
136136
SES_EMAIL = var.ses_email
137-
FRONTEND_URL = "https://${aws_cloudfront_distribution.frontend.domain_name}"
137+
FRONTEND_URL = var.domain_name != "" ? "https://${var.domain_name}" : "https://${aws_cloudfront_distribution.frontend.domain_name}"
138+
CLOUDFRONT_URL = "https://${aws_cloudfront_distribution.frontend.domain_name}"
138139
}
139140
}
140141

@@ -168,11 +169,14 @@ resource "aws_apigatewayv2_api" "main" {
168169
allow_credentials = true
169170
allow_headers = ["Content-Type", "Authorization", "X-Amz-Date", "X-Api-Key"]
170171
allow_methods = ["GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"]
171-
allow_origins = [
172-
"http://localhost:3000",
173-
"http://localhost:5173",
174-
"https://${aws_cloudfront_distribution.frontend.domain_name}"
175-
]
172+
allow_origins = concat(
173+
[
174+
"http://localhost:3000",
175+
"http://localhost:5173",
176+
"https://${aws_cloudfront_distribution.frontend.domain_name}"
177+
],
178+
var.domain_name != "" ? ["https://${var.domain_name}"] : []
179+
)
176180
expose_headers = ["*"]
177181
max_age = 3600
178182
}

terraform/main.tf

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -224,11 +224,14 @@ resource "aws_s3_bucket_cors_configuration" "attachments" {
224224
cors_rule {
225225
allowed_headers = ["*"]
226226
allowed_methods = ["GET", "PUT", "POST", "DELETE"]
227-
allowed_origins = [
228-
"http://localhost:3000",
229-
"http://localhost:5173",
230-
"https://${aws_cloudfront_distribution.frontend.domain_name}"
231-
]
227+
allowed_origins = concat(
228+
[
229+
"http://localhost:3000",
230+
"http://localhost:5173",
231+
"https://${aws_cloudfront_distribution.frontend.domain_name}"
232+
],
233+
var.domain_name != "" ? ["https://${var.domain_name}"] : []
234+
)
232235
expose_headers = ["ETag"]
233236
max_age_seconds = 3000
234237
}

0 commit comments

Comments
 (0)