多租户B2B Serverless应用按租户配置自定义子域名的实现方案咨询
多租户Serverless子域名访问落地方案
核心问题明确回应
CloudFront多子域名指向能力
- 完全支持将任意数量的租户子域名绑定到同一CloudFront分发节点,仅需将
*.example.com作为单个自定义域名(ALIAS)添加到分发配置即可,无需为每个租户单独添加条目 - 单CloudFront分发的自定义域名(ALIAS)有100个的数量上限,泛域名仅占1个条目,完全可以满足大规模租户的域名需求
- 所有子域名请求可统一回源到公共S3前端桶,路由、校验逻辑全部在边缘层完成,不需要逐个子域名配置S3映射
泛域名垃圾请求拦截方案
- 直接配置
*.example.com泛域名CNAME到CloudFront不会出现无拦截的垃圾流量,所有命中泛域名的请求会在边缘层做租户有效性校验,无效请求直接拦截,不会回源到S3 - 不需要为每个租户单独配置DNS解析记录,单条泛域名记录即可覆盖所有租户子域名
完整Serverless实现流程
预配置基础设施(一次性部署完成)
- 创建公共前端S3桶,托管统一的前端静态资源
- 创建单CloudFront分发,回源配置指向S3桶,绑定
Viewer Request触发的Lambda@Edge函数做请求处理 - 在Route53配置
*.example.com泛域名CNAME记录,指向CloudFront默认域名;提前申请泛域名对应的ACM证书(需部署在us-east-1区域),绑定到CloudFront的HTTPS监听配置 - 创建DynamoDB租户配置表,主键为
tenant_subdomain,存储租户对应的Cognito池ID、身份池ID、启用状态等核心配置
新租户自动化接入流程(通过Serverless框架编排资源)
新租户接入时仅需执行三步操作,无额外域名/分发配置:
- 自动创建租户专属Cognito用户池、身份池,绑定对应权限边界的IAM角色,确保租户只能访问自身分区的DynamoDB数据
- 向DynamoDB租户配置表写入记录,将自定义子域名与上述Cognito资源、启用状态做映射
- 无需调整DNS、CloudFront、S3的任何配置,租户子域名即刻生效
边缘层请求处理逻辑(Lambda@Edge实现)
所有子域名请求到达CloudFront边缘节点后,先执行前置校验:
- 从请求头提取
Host字段,拆分出当前请求的子域名前缀 - 查询DynamoDB租户配置表(查询结果做1分钟短周期缓存,降低DynamoDB调用成本与延迟):
- 若子域名不存在、状态为未启用:直接返回404状态码与自定义无效提示页,不触发S3回源,拦截所有垃圾请求
- 若校验通过:从DynamoDB记录中读取租户对应的Cognito配置,动态注入到请求上下文(前端通过请求头读取配置,初始化对应租户的Cognito SDK),放行请求回源到S3拉取前端静态资源
运维与成本优化注意事项
- 不要为每个租户单独创建CloudFront分发,会大幅提升运维复杂度与成本,单分发+边缘校验的架构可支撑数千级租户规模
- 租户停用、注销时,仅需修改DynamoDB中对应记录的启用状态,边缘层会自动拦截该子域名的所有请求,无需调整任何基础设施配置
- 静态资源(JS/CSS/图片)开启CloudFront长缓存,仅HTML页面不缓存,兼顾访问速度与租户配置动态注入的需求
- Lambda@Edge配置最小权限IAM角色,仅允许查询DynamoDB租户表,避免权限过度带来的安全风险
内容的提问来源于stack exchange,提问作者systemdebt
相关产品推荐
相关产品推荐

