如何通过单个域名管理多个AWS Serverless API
多SAM API统一自定义域名配置方案
你可以根据是否要改造现有部署选择以下两种成熟方案,优先推荐零改造的CloudFront路由方案。
方案1:CloudFront路径路由(推荐,无需改动现有API)
该方案通过CloudFront做七层路径转发,完全兼容你已经部署好的独立SAM API,不需要调整现有函数、API的配置,就能实现要求的转发规则,步骤如下:
- 提前在ACM(美国东部us-east-1区域,CloudFront仅支持该区域的ACM证书)申请
api.xxx.yyy的公有SSL证书,验证域名所有权。 - 创建CloudFront分配,缓存策略选择AWS托管的
CachingDisabled(避免API请求被缓存异常),源请求策略选择AllViewerExceptHostHeader,透传所有请求头、查询参数、Cookie到后端。 - 为CloudFront添加两个源,协议均配置为仅HTTPS访问:
- 源1:域名填写
${ServerlessRestApi1}.execute-api.${AWS::Region}.amazonaws.com,源路径设置为/Prod - 源2:域名填写
${ServerlessRestApi2}.execute-api.${AWS::Region}.amazonaws.com,源路径设置为/Prod
- 源1:域名填写
- 配置CloudFront缓存行为规则,按路径匹配对应源:
- 路径模式
/function1/*绑定源1,该规则会自动将请求路径中的/function1前缀替换为/Prod,例如访问/function1/getInfo会直接转发到第一个API的/Prod/getInfo路径 - 路径模式
/function2/*绑定源2,转发逻辑与上述一致 - 默认路径
*可配置为返回404,或指向你的默认服务
- 路径模式
- 等待CloudFront部署完成(通常5-10分钟),到域名DNS服务商处将
api.xxx.yyy通过CNAME记录解析到CloudFront分配的访问域名,即可测试访问。
如果需要用SAM自动化部署该配置,可以直接在现有模板的Resources块中加入以下资源,替换对应占位符即可:
ApiDistribution: Type: AWS::CloudFront::Distribution Properties: DistributionConfig: Enabled: true Aliases: - api.xxx.yyy DefaultCacheBehavior: TargetOriginId: default-origin ViewerProtocolPolicy: redirect-to-https CachePolicyId: 4135ea2d-6df8-44a3-9df3-4b5a84be39ad OriginRequestPolicyId: b689b0a8-53d0-40ab-baf2-68738e2966ac CacheBehaviors: - PathPattern: /function1/* TargetOriginId: api1-origin ViewerProtocolPolicy: redirect-to-https CachePolicyId: 4135ea2d-6df8-44a3-9df3-4b5a84be39ad OriginRequestPolicyId: b689b0a8-53d0-40ab-baf2-68738e2966ac - PathPattern: /function2/* TargetOriginId: api2-origin ViewerProtocolPolicy: redirect-to-https CachePolicyId: 4135ea2d-6df8-44a3-9df3-4b5a84be39ad OriginRequestPolicyId: b689b0a8-53d0-40ab-baf2-68738e2966ac Origins: - Id: api1-origin DomainName: !Sub "${ServerlessRestApi1}.execute-api.${AWS::Region}.amazonaws.com" OriginPath: /Prod CustomOriginConfig: HTTPSPort: 443 OriginProtocolPolicy: https-only - Id: api2-origin DomainName: !Sub "${ServerlessRestApi2}.execute-api.${AWS::Region}.amazonaws.com" OriginPath: /Prod CustomOriginConfig: HTTPSPort: 443 OriginProtocolPolicy: https-only - Id: default-origin DomainName: !Sub "${ServerlessRestApi1}.execute-api.${AWS::Region}.amazonaws.com" CustomOriginConfig: HTTPSPort: 443 OriginProtocolPolicy: https-only ViewerCertificate: AcmCertificateArn: arn:aws:acm:us-east-1:你的账号ID:certificate/你的证书ID SslSupportMethod: sni-only
方案2:单API Gateway基础路径映射(适合长期统一管理)
如果你后续所有新API都计划挂载在这个自定义域名下,也可以直接用API Gateway自带的自定义域名功能,不需要引入CloudFront:
- 在API Gateway控制台创建自定义域名
api.xxx.yyy,绑定对应区域的ACM证书。 - 为该自定义域名配置基础路径映射:
- 路径
/function1映射到ServerlessRestApi1的Prod阶段 - 路径
/function2映射到ServerlessRestApi2的Prod阶段
- 路径
- 将域名解析到API Gateway提供的目标域名即可。
*注意:该方案存在两个限制:一是仅支持映射同区域的API Gateway实例;二是转发时不会自动剥离路径前缀,你需要给现有两个API的所有路由加上/function1、/function2前缀,否则会出现404错误,不想改动现有API配置的话不要选这个方案。
常见踩坑点
- 配置完成后如果出现403错误,先检查API Gateway的资源策略是否允许公网访问,测试通联后再按需收紧权限。
- 如果业务存在跨域请求,需要在后端API的CORS配置中加入
api.xxx.yyy为允许源,或在CloudFront响应头策略中配置跨域规则。 - 所有API相关的缓存行为不要开启默认缓存策略,避免POST、PUT等写请求返回异常缓存结果。
内容的提问来源于stack exchange,提问作者Winston
相关产品推荐
相关产品推荐

