AWS Lambda与S3静态文件自定义域名路由配置求助
听起来你是卡在了CloudFront的路由规则和源映射上,这是无服务器多源整合的常见痛点。我帮你梳理一套完整的可落地步骤,从架构到具体配置,应该能解决你的问题:
咱们用CloudFront作为单一入口,把自定义域名的流量统一导入,再根据不同路径转发到对应的S3静态资源桶或API Gateway(关联Lambda)。这样既统一了HTTPS配置,又能灵活管理路由,比直接用Route53分发给不同源要靠谱得多。
1. 准备S3静态资源桶
你需要两个独立的S3桶:
- 桶A:存放根路径
/的HTML/CSS/JS,推荐用**CloudFront Origin Access Identity(OAI)**访问(更安全),也可以配置静态网站托管。 - 桶B:存放
/backend/路径的静态资源,同样配置OAI或者静态托管。
注意:如果用OAI,一定要在S3桶策略里添加允许CloudFront OAI访问的权限,避免公开桶内容。示例桶策略如下:
{ "Version": "2008-10-17", "Id": "PolicyForCloudFrontPrivateContent", "Statement": [ { "Sid": "1", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity YOUR-OAI-ID" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::YOUR-BUCKET-NAME/*" } ] }
2. 配置API Gateway关联Lambda
把你的三个Lambda函数分别绑定到API Gateway的对应资源上:
- 创建
/api/people资源,绑定处理人员数据的Lambda; - 创建
/api/dogs资源,绑定处理狗狗数据的Lambda; - 创建
/stats资源,绑定统计功能的Lambda;
部署API到一个阶段(比如prod),拿到API的Invoke URL(类似https://xxx.execute-api.us-east-1.amazonaws.com/prod)。
推荐用HTTP API(比REST API更轻量便宜),路径转发逻辑更简单。
3. 配置CloudFront分发(核心步骤)
这是你之前可能没配置对的地方,重点在行为规则的顺序和路径映射:
3.1 添加源
在CloudFront分发里添加三个源:
- 源1:指向桶A(根路径静态资源);
- 源2:指向桶B(/backend/静态资源);
- 源3:指向API Gateway的Invoke URL(只填域名部分,比如
xxx.execute-api.us-east-1.amazonaws.com,不要带https://和阶段路径)。
3.2 配置行为规则(按优先级从高到低排序)
CloudFront会按顺序匹配路径,所以把更具体的路径放在前面:
- 行为1:路径模式填
/backend/*,源选择桶B,缓存策略选CachingOptimized(适合静态资源),路径转发设置为Forward all,确保静态资源能正确加载。 - 行为2:路径模式填
/api/people/*,源选择API Gateway,路径转发设置为Customize,把/api/people/*替换为/prod/api/people/$1(这里的prod是你的API阶段名,$1是匹配的路径参数)。同时缓存策略选CachingDisabled(API请求是动态的,避免返回旧数据)。 - 行为3:路径模式填
/api/dogs/*,源选择API Gateway,路径转发替换为/prod/api/dogs/$1,同样禁用缓存。 - 行为4:路径模式填
/stats/*,源选择API Gateway,路径转发替换为/prod/stats/$1,禁用缓存。 - 默认行为:路径模式填
/*,源选择桶A,处理根路径的静态资源,缓存策略用CachingOptimized。
3.3 自定义域名与SSL
在CloudFront的“自定义域名”里添加你的域名,然后选择AWS Certificate Manager(ACM)里的SSL证书——注意证书必须在us-east-1(弗吉尼亚北部)区域申请,CloudFront只认这个区域的证书,不管你的资源在哪个区域。
4. Route53解析配置
在Route53里创建一条A记录,类型选“别名”,目标指向你的CloudFront分发域名(比如d123456abcdef.cloudfront.net),这样自定义域名的流量就会转到CloudFront了。
- 路径映射错误:比如API Gateway的资源是
/people而不是/api/people,那CloudFront的/api/people/*要转发到/prod/people/$1,别搞错了路径层级。 - 缓存问题:API请求一定要禁用缓存,否则会返回旧的Lambda执行结果。
- S3桶权限:用OAI的话,必须确保桶策略允许OAI访问,不然CloudFront会返回403。
- 证书区域:再次强调,CloudFront的SSL证书必须在us-east-1区域,别在其他区域申请了白忙活。
现在按这个步骤走,应该就能把所有路径都正确整合到自定义域名下了,记得每一步配置完后等CloudFront分发部署完成(大概10-15分钟)再测试哦。
内容的提问来源于stack exchange,提问作者Empty2k12

