如何用Amazon S3/CloudFront托管数千个带自定义域名的网站?
解决方案:多租户自定义域名静态网站托管(基于S3+CloudFront)
核心架构思路
用CloudFront作为统一入口,结合路径重写能力实现自定义域名到S3子文件夹的映射,配合AWS Certificate Manager(ACM)自动管理SSL证书,完美解决自定义域名HTTPS访问需求,同时规避原有两个方案的缺陷。
详细配置步骤
1. S3桶基础配置
- 保留桶名
all-sites,不要开启静态网站托管,采用S3 REST API作为CloudFront的数据源。 - 配置桶访问策略,仅允许CloudFront的Origin Access Identity(OAI)读取资源,禁止公开访问,确保数据安全:
{ "Version": "2008-10-17", "Id": "CloudFrontPrivateAccessPolicy", "Statement": [ { "Sid": "AllowCloudFrontAccess", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity XXXXXXXX" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::all-sites/*" } ] } - 保持现有子文件夹结构,每个用户网站资源存放在独立目录(如
client1-site、client2-site)。
2. CloudFront分发配置
- 创建CloudFront分发,源地址选择
all-sites桶的REST API端点(格式类似all-sites.s3.amazonaws.com),并关联上述OAI。 - 自定义域名与SSL证书:
- 在分发的「Alternate Domain Names (CNAMEs)」中添加用户的自定义域名(如
client1.com)。 - 在AWS
us-east-1区域(CloudFront仅识别该区域证书)通过ACM申请对应域名的SSL证书,证书支持自动续期,无需手动维护。
- 在分发的「Alternate Domain Names (CNAMEs)」中添加用户的自定义域名(如
- 路径重写(关键):
- 使用CloudFront Functions(轻量低成本)或Lambda@Edge(复杂场景)实现域名到子文件夹的映射。示例CloudFront Functions代码:
function handler(event) { const request = event.request; const host = request.headers.host.value; // 从平台后台数据库/配置中获取域名与S3子文件夹的映射关系 const domainFolderMap = { "client1.com": "client1-site", "client2.com": "client2-site" }; const targetFolder = domainFolderMap[host]; if (targetFolder) { // 重写请求路径,前缀添加对应子文件夹 request.uri = `/${targetFolder}${request.uri}`; // 根路径自动指向index.html if (request.uri === `/${targetFolder}/`) { request.uri = `/${targetFolder}/index.html`; } } return request; } - 将函数关联到分发的「Viewer Request」触发器,确保请求到达时立即完成路径重写。
- 使用CloudFront Functions(轻量低成本)或Lambda@Edge(复杂场景)实现域名到子文件夹的映射。示例CloudFront Functions代码:
3. 用户DNS配置引导
- 告知用户在其域名服务商的DNS控制台添加对应记录:
- 子域名(如
blog.client1.com):添加CNAME记录,将域名指向CloudFront分发域名(如d1234abc.cloudfront.net)。 - 顶级域名(如
client1.com):若服务商支持CNAME flattening,直接使用CNAME;否则需将域名托管到Route 53,添加别名记录指向CloudFront分发。
- 子域名(如
方案优势(对比原有方案)
- 对比方案1(自有服务器):无需自行维护SSL证书,ACM自动续期;依托CloudFront全球CDN节点,性能远超自有服务器;S3存储可靠性更高。
- 对比方案2(单CloudFront分发无自定义域名):通过路径重写+自定义域名配置,用户直接使用自有域名访问,完全匹配Wix/Webflow的用户体验。
注意事项
- 域名与子文件夹的映射关系需在平台后台维护,新增用户域名时同步更新配置(或通过动态拉取数据库实现)。
- 若用户数量较多,可使用ACM多域名证书(单证书最多支持100个域名),或批量申请独立证书。
- CloudFront Functions适合简单路径重写逻辑,成本更低;复杂场景(如动态从数据库拉取映射)建议使用Lambda@Edge。
内容的提问来源于stack exchange,提问作者John Brzenk
相关产品推荐
相关产品推荐

